kun 6 months ago
parent ab0d7e90c2
commit dc4d73e1cd

@ -1,76 +1,76 @@
书名,豆瓣链接,作者,译者,出版社,出版日期,价格,评分,评分人数,一句话评价 书名,豆瓣链接,作者,译者,出版社,出版日期,价格,评分,评分人数,一句话评价
红楼梦,https://book.douban.com/subject/1007305/,[清] 曹雪芹 著 ,, 人民文学出版社 , 1996-12 , 59.70元,9.6,"( 红楼梦,https://book.douban.com/subject/1007305/,[清] 曹雪芹 著 ,, 人民文学出版社 , 1996-12 , 59.70元,9.6,"(
424885人评价 424932人评价
)",都云作者痴,谁解其中味? )",都云作者痴,谁解其中味?
活着,https://book.douban.com/subject/4913064/,余华 ,, 作家出版社 , 2012-8 , 20.00元,9.4,"( 活着,https://book.douban.com/subject/4913064/,余华 ,, 作家出版社 , 2012-8 , 20.00元,9.4,"(
835583人评价 835699人评价
)",生的苦难与伟大 )",生的苦难与伟大
1984,https://book.douban.com/subject/4820710/,[英] 乔治·奥威尔 , 刘绍铭 , 北京十月文艺出版社 , 2010-4-1 , 28.00,9.4,"( 1984,https://book.douban.com/subject/4820710/,[英] 乔治·奥威尔 , 刘绍铭 , 北京十月文艺出版社 , 2010-4-1 , 28.00,9.4,"(
285215人评价 285264人评价
)",栗树荫下,我出卖你,你出卖我 )",栗树荫下,我出卖你,你出卖我
哈利·波特,https://book.douban.com/subject/24531956/,J.K.罗琳 (J.K.Rowling) , 苏农 , 人民文学出版社 , 2008-12-1 , 498.00元,9.7,"( 哈利·波特,https://book.douban.com/subject/24531956/,J.K.罗琳 (J.K.Rowling) , 苏农 , 人民文学出版社 , 2008-12-1 , 498.00元,9.7,"(
107799人评价 107828人评价
)",从9¾站台开始的旅程 )",从9¾站台开始的旅程
三体全集,https://book.douban.com/subject/6518605/,刘慈欣 ,, 重庆出版社 , 2012-1 , 168.00元,9.5,"( 三体全集,https://book.douban.com/subject/6518605/,刘慈欣 ,, 重庆出版社 , 2012-1 , 168.00元,9.5,"(
188276人评价 188309人评价
)",地球往事三部曲 )",地球往事三部曲
百年孤独,https://book.douban.com/subject/6082808/,[哥伦比亚] 加西亚·马尔克斯 , 范晔 , 南海出版公司 , 2011-6 , 39.50元,9.3,"( 百年孤独,https://book.douban.com/subject/6082808/,[哥伦比亚] 加西亚·马尔克斯 , 范晔 , 南海出版公司 , 2011-6 , 39.50元,9.3,"(
426649人评价 426699人评价
)",魔幻现实主义文学代表作 )",魔幻现实主义文学代表作
飘,https://book.douban.com/subject/1068920/,[美国] 玛格丽特·米切尔 , 李美华 , 译林出版社 , 2000-9 , 40.00元,9.3,"( 飘,https://book.douban.com/subject/1068920/,[美国] 玛格丽特·米切尔 , 李美华 , 译林出版社 , 2000-9 , 40.00元,9.3,"(
212846人评价 212872人评价
)",革命时期的爱情,随风而逝 )",革命时期的爱情,随风而逝
动物农场,https://book.douban.com/subject/2035179/,[英] 乔治·奥威尔 , 荣如德 , 上海译文出版社 , 2007-3 , 10.00元,9.3,"( 动物农场,https://book.douban.com/subject/2035179/,[英] 乔治·奥威尔 , 荣如德 , 上海译文出版社 , 2007-3 , 10.00元,9.3,"(
160464人评价 160481人评价
)",太阳底下并无新事 )",太阳底下并无新事
房思琪的初恋乐园,https://book.douban.com/subject/27614904/,林奕含 ,, 北京联合出版公司 , 2018-2 , 45.00元,9.2,"( 房思琪的初恋乐园,https://book.douban.com/subject/27614904/,林奕含 ,, 北京联合出版公司 , 2018-2 , 45.00元,9.2,"(
380660人评价 380731人评价
)",向死而生的文学绝唱 )",向死而生的文学绝唱
三国演义(全二册),https://book.douban.com/subject/1019568/,[明] 罗贯中 ,, 人民文学出版社 , 1998-05 , 39.50元,9.3,"( 三国演义(全二册),https://book.douban.com/subject/1019568/,[明] 罗贯中 ,, 人民文学出版社 , 1998-05 , 39.50元,9.3,"(
168830人评价 168841人评价
)",是非成败转头空 )",是非成败转头空
福尔摩斯探案全集(上中下),https://book.douban.com/subject/1040211/,[英] 阿·柯南道尔 , 丁钟华 等 , 群众出版社 , 1981-8 , 53.00元/68.00元,9.3,"( 福尔摩斯探案全集(上中下),https://book.douban.com/subject/1040211/,[英] 阿·柯南道尔 , 丁钟华 等 , 群众出版社 , 1981-8 , 53.00元/68.00元,9.3,"(
133835人评价 133838人评价
)",名侦探的代名词 )",名侦探的代名词
白夜行,https://book.douban.com/subject/10554308/,[日] 东野圭吾 , 刘姿君 , 南海出版公司 , 2013-1-1 , 39.50元,9.2,"( 白夜行,https://book.douban.com/subject/10554308/,[日] 东野圭吾 , 刘姿君 , 南海出版公司 , 2013-1-1 , 39.50元,9.2,"(
476436人评价 476505人评价
)",一宗离奇命案牵出跨度近20年步步惊心的故事 )",一宗离奇命案牵出跨度近20年步步惊心的故事
小王子,https://book.douban.com/subject/1084336/,[法] 圣埃克苏佩里 , 马振骋 , 人民文学出版社 , 2003-8 , 22.00元,9.1,"( 小王子,https://book.douban.com/subject/1084336/,[法] 圣埃克苏佩里 , 马振骋 , 人民文学出版社 , 2003-8 , 22.00元,9.1,"(
757268人评价 757307人评价
)",献给长成了大人的孩子们 )",献给长成了大人的孩子们
安徒生童话故事集,https://book.douban.com/subject/1046209/,(丹麦)安徒生 , 叶君健 , 人民文学出版社 , 1997-08 , 25.00元,9.3,"( 安徒生童话故事集,https://book.douban.com/subject/1046209/,(丹麦)安徒生 , 叶君健 , 人民文学出版社 , 1997-08 , 25.00元,9.3,"(
132974人评价 132988人评价
)",为了争取未来的一代 )",为了争取未来的一代
天龙八部,https://book.douban.com/subject/1255625/,金庸 ,, 生活·读书·新知三联书店 , 1994-5 , 96.00元,9.2,"( 天龙八部,https://book.douban.com/subject/1255625/,金庸 ,, 生活·读书·新知三联书店 , 1994-5 , 96.00元,9.2,"(
133154人评价 133163人评价
)",有情皆孽,无人不冤 )",有情皆孽,无人不冤
呐喊,https://book.douban.com/subject/1449351/,鲁迅 ,, 人民文学出版社 , 1973-3 , 0.36元,9.2,"( 呐喊,https://book.douban.com/subject/1449351/,鲁迅 ,, 人民文学出版社 , 1973-3 , 0.36元,9.2,"(
160853人评价 160877人评价
)",新文学的第一声呐喊 )",新文学的第一声呐喊
撒哈拉的故事,https://book.douban.com/subject/1060068/,三毛 ,, 哈尔滨出版社 , 2003-8 , 15.80元,9.2,"( 撒哈拉的故事,https://book.douban.com/subject/1060068/,三毛 ,, 哈尔滨出版社 , 2003-8 , 15.80元,9.2,"(
175479人评价 175517人评价
)",游荡的自由灵魂 )",游荡的自由灵魂
悉达多,https://book.douban.com/subject/26980487/,[德] 赫尔曼·黑塞 , 姜乙 , 天津人民出版社 , 2017-1 , 32.00元,9.3,"( 悉达多,https://book.douban.com/subject/26980487/,[德] 赫尔曼·黑塞 , 姜乙 , 天津人民出版社 , 2017-1 , 32.00元,9.3,"(
106788人评价 106870人评价
)", )",
邓小平时代,https://book.douban.com/subject/20424526/,【美】傅高义 (Ezra.F.Vogel) , 冯克利 , 生活·读书·新知三联书店 , 2013-1-18 , 88.00元,9.3,"( 邓小平时代,https://book.douban.com/subject/20424526/,【美】傅高义 (Ezra.F.Vogel) , 冯克利 , 生活·读书·新知三联书店 , 2013-1-18 , 88.00元,9.3,"(
71146人评价 71166人评价
)",个人命运背后的历史变局 )",个人命运背后的历史变局
杀死一只知更鸟,https://book.douban.com/subject/6781808/,[美] 哈珀·李 , 高红梅 , 译林出版社 , 2012-9 , 32.00元,9.2,"( 杀死一只知更鸟,https://book.douban.com/subject/6781808/,[美] 哈珀·李 , 高红梅 , 译林出版社 , 2012-9 , 32.00元,9.2,"(
147208人评价 147222人评价
)",有一种东西不能遵循从众原则,那就是——人的良心 )",有一种东西不能遵循从众原则,那就是——人的良心
明朝那些事儿1-9,https://book.douban.com/subject/3674537/,当年明月 ,, 中国海关出版社 , 2009-4 , 358.20元,9.2,"( 明朝那些事儿1-9,https://book.douban.com/subject/3674537/,当年明月 ,, 中国海关出版社 , 2009-4 , 358.20元,9.2,"(
175540人评价 175585人评价
)",不拘一格的历史书写 )",不拘一格的历史书写
失踪的孩子,https://book.douban.com/subject/30172069/,[意] 埃莱娜·费兰特 , 陈英 , 人民文学出版社 , 2018-7 , 62.00元,9.2,"( 失踪的孩子,https://book.douban.com/subject/30172069/,[意] 埃莱娜·费兰特 , 陈英 , 人民文学出版社 , 2018-7 , 62.00元,9.2,"(
81932人评价 81962人评价
)",我的整个生命,只是一场为了提升社会地位的低俗斗争。 )",我的整个生命,只是一场为了提升社会地位的低俗斗争。
新名字的故事,https://book.douban.com/subject/26986954/,[意] 埃莱娜·费兰特 , 陈英 , 人民文学出版社 , 2017-4 , 59.00元,9.2,"( 新名字的故事,https://book.douban.com/subject/26986954/,[意] 埃莱娜·费兰特 , 陈英 , 人民文学出版社 , 2017-4 , 59.00元,9.2,"(
92504人评价 92527人评价
)",探索青年时代的激情、困惑、挣扎、背叛和失去 )",探索青年时代的激情、困惑、挣扎、背叛和失去
野草,https://book.douban.com/subject/1915958/,鲁迅 ,, 人民文学出版社 , 1973-3 , 0.20元,9.5,"( 野草,https://book.douban.com/subject/1915958/,鲁迅 ,, 人民文学出版社 , 1973-3 , 0.20元,9.5,"(
47629人评价 47638人评价
)",我以这一丛野草,在明与暗,生与死,过去与未来之际,献于友与仇,人与兽,爱者与不爱者之前作证。 )",我以这一丛野草,在明与暗,生与死,过去与未来之际,献于友与仇,人与兽,爱者与不爱者之前作证。
沉默的大多数,https://book.douban.com/subject/1054685/,王小波 ,, 中国青年出版社 , 1997-10 , 27.00元,9.1,"( 沉默的大多数,https://book.douban.com/subject/1054685/,王小波 ,, 中国青年出版社 , 1997-10 , 27.00元,9.1,"(
151766人评价 151786人评价
)",沉默是沉默者的通行证 )",沉默是沉默者的通行证

1 书名 豆瓣链接 作者 译者 出版社 出版日期 价格 评分 评分人数 一句话评价
2 红楼梦 https://book.douban.com/subject/1007305/ [清] 曹雪芹 著 人民文学出版社 1996-12 59.70元 9.6 ( 424885人评价 ) ( 424932人评价 ) 都云作者痴,谁解其中味?
3 活着 https://book.douban.com/subject/4913064/ 余华 作家出版社 2012-8 20.00元 9.4 ( 835583人评价 ) ( 835699人评价 ) 生的苦难与伟大
4 1984 https://book.douban.com/subject/4820710/ [英] 乔治·奥威尔 刘绍铭 北京十月文艺出版社 2010-4-1 28.00 9.4 ( 285215人评价 ) ( 285264人评价 ) 栗树荫下,我出卖你,你出卖我
5 哈利·波特 https://book.douban.com/subject/24531956/ J.K.罗琳 (J.K.Rowling) 苏农 人民文学出版社 2008-12-1 498.00元 9.7 ( 107799人评价 ) ( 107828人评价 ) 从9¾站台开始的旅程
6 三体全集 https://book.douban.com/subject/6518605/ 刘慈欣 重庆出版社 2012-1 168.00元 9.5 ( 188276人评价 ) ( 188309人评价 ) 地球往事三部曲
7 百年孤独 https://book.douban.com/subject/6082808/ [哥伦比亚] 加西亚·马尔克斯 范晔 南海出版公司 2011-6 39.50元 9.3 ( 426649人评价 ) ( 426699人评价 ) 魔幻现实主义文学代表作
8 https://book.douban.com/subject/1068920/ [美国] 玛格丽特·米切尔 李美华 译林出版社 2000-9 40.00元 9.3 ( 212846人评价 ) ( 212872人评价 ) 革命时期的爱情,随风而逝
9 动物农场 https://book.douban.com/subject/2035179/ [英] 乔治·奥威尔 荣如德 上海译文出版社 2007-3 10.00元 9.3 ( 160464人评价 ) ( 160481人评价 ) 太阳底下并无新事
10 房思琪的初恋乐园 https://book.douban.com/subject/27614904/ 林奕含 北京联合出版公司 2018-2 45.00元 9.2 ( 380660人评价 ) ( 380731人评价 ) 向死而生的文学绝唱
11 三国演义(全二册) https://book.douban.com/subject/1019568/ [明] 罗贯中 人民文学出版社 1998-05 39.50元 9.3 ( 168830人评价 ) ( 168841人评价 ) 是非成败转头空
12 福尔摩斯探案全集(上中下) https://book.douban.com/subject/1040211/ [英] 阿·柯南道尔 丁钟华 等 群众出版社 1981-8 53.00元/68.00元 9.3 ( 133835人评价 ) ( 133838人评价 ) 名侦探的代名词
13 白夜行 https://book.douban.com/subject/10554308/ [日] 东野圭吾 刘姿君 南海出版公司 2013-1-1 39.50元 9.2 ( 476436人评价 ) ( 476505人评价 ) 一宗离奇命案牵出跨度近20年步步惊心的故事
14 小王子 https://book.douban.com/subject/1084336/ [法] 圣埃克苏佩里 马振骋 人民文学出版社 2003-8 22.00元 9.1 ( 757268人评价 ) ( 757307人评价 ) 献给长成了大人的孩子们
15 安徒生童话故事集 https://book.douban.com/subject/1046209/ (丹麦)安徒生 叶君健 人民文学出版社 1997-08 25.00元 9.3 ( 132974人评价 ) ( 132988人评价 ) 为了争取未来的一代
16 天龙八部 https://book.douban.com/subject/1255625/ 金庸 生活·读书·新知三联书店 1994-5 96.00元 9.2 ( 133154人评价 ) ( 133163人评价 ) 有情皆孽,无人不冤
17 呐喊 https://book.douban.com/subject/1449351/ 鲁迅 人民文学出版社 1973-3 0.36元 9.2 ( 160853人评价 ) ( 160877人评价 ) 新文学的第一声呐喊
18 撒哈拉的故事 https://book.douban.com/subject/1060068/ 三毛 哈尔滨出版社 2003-8 15.80元 9.2 ( 175479人评价 ) ( 175517人评价 ) 游荡的自由灵魂
19 悉达多 https://book.douban.com/subject/26980487/ [德] 赫尔曼·黑塞 姜乙 天津人民出版社 2017-1 32.00元 9.3 ( 106788人评价 ) ( 106870人评价 )
20 邓小平时代 https://book.douban.com/subject/20424526/ 【美】傅高义 (Ezra.F.Vogel) 冯克利 生活·读书·新知三联书店 2013-1-18 88.00元 9.3 ( 71146人评价 ) ( 71166人评价 ) 个人命运背后的历史变局
21 杀死一只知更鸟 https://book.douban.com/subject/6781808/ [美] 哈珀·李 高红梅 译林出版社 2012-9 32.00元 9.2 ( 147208人评价 ) ( 147222人评价 ) 有一种东西不能遵循从众原则,那就是——人的良心
22 明朝那些事儿(1-9) https://book.douban.com/subject/3674537/ 当年明月 中国海关出版社 2009-4 358.20元 9.2 ( 175540人评价 ) ( 175585人评价 ) 不拘一格的历史书写
23 失踪的孩子 https://book.douban.com/subject/30172069/ [意] 埃莱娜·费兰特 陈英 人民文学出版社 2018-7 62.00元 9.2 ( 81932人评价 ) ( 81962人评价 ) 我的整个生命,只是一场为了提升社会地位的低俗斗争。
24 新名字的故事 https://book.douban.com/subject/26986954/ [意] 埃莱娜·费兰特 陈英 人民文学出版社 2017-4 59.00元 9.2 ( 92504人评价 ) ( 92527人评价 ) 探索青年时代的激情、困惑、挣扎、背叛和失去
25 野草 https://book.douban.com/subject/1915958/ 鲁迅 人民文学出版社 1973-3 0.20元 9.5 ( 47629人评价 ) ( 47638人评价 ) 我以这一丛野草,在明与暗,生与死,过去与未来之际,献于友与仇,人与兽,爱者与不爱者之前作证。
26 沉默的大多数 https://book.douban.com/subject/1054685/ 王小波 中国青年出版社 1997-10 27.00元 9.1 ( 151766人评价 ) ( 151786人评价 ) 沉默是沉默者的通行证
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

201
GUI.py

@ -3,119 +3,123 @@ from pyecharts.charts import Bar,Page,Line,Timeline
from pyecharts.commons.utils import JsCode from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType from pyecharts.globals import ThemeType
from pyecharts.charts import Pie from pyecharts.charts import Pie
import sql
from pyecharts.faker import Faker from pyecharts.faker import Faker
from main import book_list_data # from main import book_list_data
from collections import Counter from collections import Counter
class Book:
def __init__(self, name, url, star, star_people, author, translater, publisher, pub_year, price, comment):
book_list_data_sortBystart = sorted(book_list_data, key=lambda x: (x.star, x.star_people), reverse=True) self.name = name
book_list_data_sortBystart=book_list_data_sortBystart[:10] self.url = url
book_list_data_sortBystart=book_list_data_sortBystart[::-1] self.star = star
# 从book_list_data中提取书籍名称和评分数据 self.star_people = star_people
book_names = [book.name for book in book_list_data_sortBystart] self.author = author
book_stars = [book.star for book in book_list_data_sortBystart] self.translater = translater
x_data = list(range(1, len(book_names) + 1)) self.publisher = publisher
# 创建柱状图 self.pub_year = pub_year
bar = ( self.price = price
Bar(init_opts=opts.InitOpts(theme="shine",width="850px",height='400px')) self.comment = comment
db = sql.BookDatabase(host='localhost', user='root', password='123456', database='xiaosuo', table_name='books')
db.initialize_table()
def show():
data = db.get_book_list()
book_list_data = []
for book in data:
book_list_data.append(
Book(book["name"], book["url"], book["star"], book["star_people"], book["author"], book["translater"],
book["publisher"], book["pub_year"], book["price"], book["comment"]))
book_list_data_sortBystart = sorted(book_list_data, key=lambda x: (x.star, x.star_people), reverse=True)
book_list_data_sortBystart = book_list_data_sortBystart[:10]
book_list_data_sortBystart = book_list_data_sortBystart[::-1]
# 从book_list_data中提取书籍名称和评分数据
book_names = [book.name for book in book_list_data_sortBystart]
book_stars = [book.star for book in book_list_data_sortBystart]
x_data = list(range(1, len(book_names) + 1))
# 创建柱状图
bar = (
Bar(init_opts=opts.InitOpts(theme="shine", width="850px", height='400px'))
.add_xaxis(book_names) .add_xaxis(book_names)
.add_yaxis("评分", book_stars,color="red") .add_yaxis("评分", book_stars, color="red")
.reversal_axis() # 实现旋转 .reversal_axis() # 实现旋转
.set_global_opts( .set_global_opts(
title_opts=opts.TitleOpts(title="评分前10榜", pos_bottom="bottom", pos_left="center"), title_opts=opts.TitleOpts(title="评分前10榜", pos_bottom="bottom", pos_left="center"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)),
yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)) yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45))
) )
# .render("bar_datazoom_slider.html") # .render("bar_datazoom_slider.html")
) )
publisher_list = [book.publisher for book in book_list_data] publisher_list = [book.publisher for book in book_list_data]
# 使用Counter来计算每个出版商的数量 # 使用Counter来计算每个出版商的数量
publisher_counter = Counter(publisher_list) publisher_counter = Counter(publisher_list)
publisher_names = list(publisher_counter.keys()) publisher_names = list(publisher_counter.keys())
publisher_counts = list(publisher_counter.values()) publisher_counts = list(publisher_counter.values())
colors = [ colors = [
"#5470c6", "#91cc75", "#fac858", "#ee6666", "#73c0de", "#5470c6", "#91cc75", "#fac858", "#ee6666", "#73c0de",
"#3ba272", "#fc8452", "#9a60b4", "#ea7ccc", "#bb60b4", "#3ba272", "#fc8452", "#9a60b4", "#ea7ccc", "#bb60b4",
"#8B008B", "#FF1493", "#1E90FF", "#20B2AA", "#2E8B57", "#8B008B", "#FF1493", "#1E90FF", "#20B2AA", "#2E8B57",
"#B22222", "#FF4500", "#4682B4", "#DAA520", "#32CD32" "#B22222", "#FF4500", "#4682B4", "#DAA520", "#32CD32"
] ]
# 使用Pyecharts创建饼图 # 使用Pyecharts创建饼图
pie = ( pie = (
Pie() Pie()
.add("", [list(z) for z in zip(publisher_names, publisher_counts)]) .add("", [list(z) for z in zip(publisher_names, publisher_counts)])
.set_colors(colors) # 设置颜色 .set_colors(colors) # 设置颜色
.set_global_opts(title_opts=opts.TitleOpts(title="出版商分布饼图", pos_left="center",pos_bottom="bottom")) .set_global_opts(title_opts=opts.TitleOpts(title="出版商分布饼图", pos_left="center", pos_bottom="bottom"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
) )
prices = [float(book.price) for book in book_list_data ] prices = [float(book.price) for book in book_list_data]
print(prices) print(prices)
# 将价格分组到不同的区间 # 将价格分组到不同的区间
price_intervals = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, float('inf')] # 设置价格区间 price_intervals = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, float('inf')] # 设置价格区间
price_counts = [0] * (len(price_intervals) - 1) # 初始化每个区间的计数为0 price_counts = [0] * (len(price_intervals) - 1) # 初始化每个区间的计数为0
prices_intervalsStr=["0-50","50-100","100-150","150-200","200-250","250-300","300-350","350-400","400-450","450-500","500以上"] prices_intervalsStr = ["0-50", "50-100", "100-150", "150-200", "200-250", "250-300", "300-350", "350-400",
# 统计每个价格区间的数量 "400-450", "450-500", "500以上"]
for price in prices: # 统计每个价格区间的数量
for price in prices:
for i in range(len(price_intervals) - 1): for i in range(len(price_intervals) - 1):
if price>=500: if price >= 500:
price_counts[len(price_intervals) - 1] += 1 price_counts[len(price_intervals) - 1] += 1
break break
if price_intervals[i] <= price and price < price_intervals[i + 1]: if price_intervals[i] <= price and price < price_intervals[i + 1]:
price_counts[i] += 1 price_counts[i] += 1
break break
# print(price_counts) # print(price_counts)
# 生成价格区间与书籍数量折线图 # 生成价格区间与书籍数量折线图
line = ( line = (
Line() Line()
.add_xaxis([str(interval) for interval in prices_intervalsStr[:-1]]) # X轴标签为价格区间 .add_xaxis([str(interval) for interval in prices_intervalsStr[:-1]]) # X轴标签为价格区间
.add_yaxis("书籍数量", price_counts, symbol="circle", is_smooth=True, markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")])) .add_yaxis("书籍数量", price_counts, symbol="circle", is_smooth=True,
.set_global_opts(title_opts=opts.TitleOpts(title="价格区间与书籍数量折线图", pos_left="center",pos_bottom="bottom"), markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
.set_global_opts(
title_opts=opts.TitleOpts(title="价格区间与书籍数量折线图", pos_left="center", pos_bottom="bottom"),
xaxis_opts=opts.AxisOpts(name="价格区间"), xaxis_opts=opts.AxisOpts(name="价格区间"),
yaxis_opts=opts.AxisOpts(name="书籍数量"), yaxis_opts=opts.AxisOpts(name="书籍数量"),
datazoom_opts=opts.DataZoomOpts(range_start=0, range_end=100),) datazoom_opts=opts.DataZoomOpts(range_start=0, range_end=100), )
) )
# 生成时间与书籍数量折线图# 假设您的书籍数据保存在book_list_data中
# 提取每本书的出版年份
publish_dates = [int(book.pub_year.replace('-', '.').split('.')[0]) for book in book_list_data]
print(publish_dates)
# 使用Counter来计算每年出版的书的数量
publish_year_counter = Counter(publish_dates)
print(publish_year_counter)
# 确保结果包含连续的年份范围,并且将缺失的年份对应的数量设为 0
full_year_range = range(min(publish_dates), max(publish_dates) + 1)
print(full_year_range)
pub_year_counts = [(year, publish_year_counter[year]) for year in full_year_range]
# 提取年份和对应的书籍数量
years = [str(year) for year, count in pub_year_counts]
counts = [count for year, count in pub_year_counts]
print(pub_year_counts)
#
# # 创建动态的时间曲线图
# line_year_count = (
# Line()
# .add_xaxis(xaxis_data=years)
# .add_yaxis(
# series_name="出版数量",
# y_axis=counts,
# )
# .set_global_opts(
# title_opts=opts.TitleOpts(title="每年出版书籍数量变化"),
# xaxis_opts=opts.AxisOpts(name="年份"),
# yaxis_opts=opts.AxisOpts(name="书籍数量"),
# datazoom_opts=opts.DataZoomOpts(type_="inside"),
# tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
# )
# )
# timeline = Timeline() # 生成时间与书籍数量折线图# 假设您的书籍数据保存在book_list_data中
# for i, year in enumerate(years): # 提取每本书的出版年份
line_year_count = ( publish_dates = [int(book.pub_year.replace('-', '.').split('.')[0]) for book in book_list_data]
Line() print(publish_dates)
# 使用Counter来计算每年出版的书的数量
publish_year_counter = Counter(publish_dates)
print(publish_year_counter)
# 确保结果包含连续的年份范围,并且将缺失的年份对应的数量设为 0
full_year_range = range(min(publish_dates), max(publish_dates) + 1)
print(full_year_range)
pub_year_counts = [(year, publish_year_counter[year]) for year in full_year_range]
# 提取年份和对应的书籍数量
years = [str(year) for year, count in pub_year_counts]
counts = [count for year, count in pub_year_counts]
print(pub_year_counts)
line_year_count = (
Line()
.add_xaxis(years) .add_xaxis(years)
.add_yaxis( .add_yaxis(
series_name="出版书籍数量", series_name="出版书籍数量",
@ -128,29 +132,14 @@ Line()
xaxis_opts=opts.AxisOpts(name="年份"), xaxis_opts=opts.AxisOpts(name="年份"),
yaxis_opts=opts.AxisOpts(name="书籍数量"), yaxis_opts=opts.AxisOpts(name="书籍数量"),
) )
) )
# timeline.add(line_year_count, time_point=str(year))
# timeline.add_schema(
# play_interval=1000, # 播放的时间间隔
# is_auto_play=False, # 是否自动播放
# pos_left="center", # 时间轴组件的位置
# pos_bottom="bottom",
# )
# 生成html文件可选
# pie.render("publisher_pie_chart.html")
# 创建一个页面
page = Page()
# 将柱状图和饼图添加到页面中
page.add(line_year_count)
page.add(bar)
page.add(pie)
page.add(line)
# 生成HTML文件
page.render("book_analysis.html")
# 创建一个页面
page = Page()
# 将柱状图和饼图添加到页面中
page.add(line_year_count)
page.add(bar)
page.add(pie)
page.add(line)
# 生成HTML文件
page.render("book_analysis.html")

File diff suppressed because it is too large Load Diff

Binary file not shown.

@ -93,10 +93,10 @@ class DoubanBookTop250Crawler:
df = pd.DataFrame(self.book_list) df = pd.DataFrame(self.book_list)
df.to_csv(csv_name, encoding='utf_8_sig', index=False) df.to_csv(csv_name, encoding='utf_8_sig', index=False)
def crawl_douban_top250(self): def crawl_douban_top250(self,page):
headers = { headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}
for i in range(1): for i in range(page):
page_url = 'https://book.douban.com/top250?start={}'.format(str(i * 25)) page_url = 'https://book.douban.com/top250?start={}'.format(str(i * 25))
print('开始爬取第{}页,地址是:{}'.format(str(i + 1), page_url)) print('开始爬取第{}页,地址是:{}'.format(str(i + 1), page_url))
self.get_book_info(page_url, headers) self.get_book_info(page_url, headers)
@ -104,14 +104,16 @@ class DoubanBookTop250Crawler:
self.save_to_csv(csv_name="BookDouban250.csv") self.save_to_csv(csv_name="BookDouban250.csv")
# 实例化爬虫对象,并调用方法执行爬取和保存数据 # 实例化爬虫对象,并调用方法执行爬取和保存数据
crawler = DoubanBookTop250Crawler() def main(page):
crawler.crawl_douban_top250() crawler = DoubanBookTop250Crawler()
book_list = crawler.book_list crawler.crawl_douban_top250(page)
book_list_data = crawler.book_list_data book_list = crawler.book_list
dataexcel={"书名":[],"豆瓣链接":[],"作者":[],"译者":[],"出版社":[],"出版日期":[],"价格":[],"评分":[],"评分人数":[],"一句话评价":[]} book_list_data = crawler.book_list_data
for book in book_list: dataexcel = {"书名": [], "豆瓣链接": [], "作者": [], "译者": [], "出版社": [], "出版日期": [], "价格": [],
book['评分人数']= book['评分人数'].replace('\n', '').strip() "评分": [], "评分人数": [], "一句话评价": []}
book['评分人数'] = book['评分人数'].replace(' ', '').replace("(","").replace(")","").strip() for book in book_list:
book['评分人数'] = book['评分人数'].replace('\n', '').strip()
book['评分人数'] = book['评分人数'].replace(' ', '').replace("(", "").replace(")", "").strip()
dataexcel['书名'].append(book['书名']) dataexcel['书名'].append(book['书名'])
dataexcel['豆瓣链接'].append(book['豆瓣链接']) dataexcel['豆瓣链接'].append(book['豆瓣链接'])
dataexcel['作者'].append(book['作者']) dataexcel['作者'].append(book['作者'])
@ -122,39 +124,39 @@ for book in book_list:
dataexcel['评分'].append(book['评分']) dataexcel['评分'].append(book['评分'])
dataexcel['评分人数'].append(book['评分人数']) dataexcel['评分人数'].append(book['评分人数'])
dataexcel['一句话评价'].append(book['一句话评价']) dataexcel['一句话评价'].append(book['一句话评价'])
book_list_data_two_price=[] book_list_data_two_price = []
for book in book_list_data: for book in book_list_data:
book.star_people=book.star_people.replace('\n','').strip() book.star_people = book.star_people.replace('\n', '').strip()
book.star_people=book.star_people.replace(' ','').replace("(","").replace(")","").strip() book.star_people = book.star_people.replace(' ', '').replace("(", "").replace(")", "").strip()
book.star_people=''.join(filter(str.isdigit, book.star_people)) book.star_people = ''.join(filter(str.isdigit, book.star_people))
book.price=book.price.replace('','').strip() book.price = book.price.replace('', '').strip()
if book.price.find('/')!=-1: if book.price.find('/') != -1:
copy_price=book.price.split('/')[1] copy_price = book.price.split('/')[1]
book.price=book.price.split('/')[0] book.price = book.price.split('/')[0]
match = re.search(r'\d+\.\d{2}', copy_price) match = re.search(r'\d+\.\d{2}', copy_price)
if match: if match:
copy_price = match.group() copy_price = match.group()
copy_book = copy.deepcopy(book) copy_book = copy.deepcopy(book)
copy_book.price = copy_price copy_book.price = copy_price
book_list_data_two_price.append(copy_book) book_list_data_two_price.append(copy_book)
match=re.search(r'\d+\.\d{2}',book.price) match = re.search(r'\d+\.\d{2}', book.price)
if match: if match:
book.price = match.group() book.price = match.group()
book_list_data=book_list_data+book_list_data_two_price book_list_data = book_list_data + book_list_data_two_price
print(crawler.book_list)
# 将 book_list 转换为 DataFrame
df = pd.DataFrame(dataexcel)
# 将 DataFrame 写入到 Excel 文件
file_name = 'book_data.xlsx'
df.to_excel(file_name, index=False)
print(f"书籍数据已写入到 {file_name}")
print(crawler.book_list) # 使用BookDatabase类
# 将 book_list 转换为 DataFrame db = sql.BookDatabase(host='localhost', user='root', password='123456', database='xiaosuo', table_name='books')
df = pd.DataFrame(dataexcel) db.initialize_table()
# 将 DataFrame 写入到 Excel 文件 db.insert_books(book_list_data)
file_name = 'book_data.xlsx'
df.to_excel(file_name, index=False)
print(f"书籍数据已写入到 {file_name}")
# 使用BookDatabase类
db = sql.BookDatabase(host='localhost', user='root', password='123456', database='xiaosuo', table_name='books')
db.initialize_table()
db.insert_books(book_list_data)

@ -69,12 +69,13 @@ class BookDatabase:
self.connection.commit() self.connection.commit()
self.close() self.close()
def login(self,username,password): def login(self,username):
with self.connection.cursor() as cursor: with self.connection.cursor() as cursor:
user_list = cursor.execute(f"SELECT * FROM {self.table_name} WHERE username='{username}' AND password='{password}'") cursor.execute(f"SELECT * FROM {self.table_name} WHERE username='{username}'")
user_list=cursor.fetchall()
print(user_list) print(user_list)
if user_list >0: if len(user_list) >0:
return True return user_list[0]
else: else:
return False return False
self.connection.commit() self.connection.commit()

@ -3,6 +3,8 @@ import sql
from tkinter import messagebox from tkinter import messagebox
from tkinter import ttk from tkinter import ttk
import webbrowser import webbrowser
import main
import GUI
db = sql.BookDatabase(host='localhost', user='root', password='123456', database='xiaosuo', table_name='user') db = sql.BookDatabase(host='localhost', user='root', password='123456', database='xiaosuo', table_name='user')
db.initialize_table() db.initialize_table()
@ -11,47 +13,70 @@ db_data.initialize_table()
book_collection=[] book_collection=[]
search="" search=""
Crawling=""
def on_login_button_click(): def on_login_button_click():
username = username_entry.get() username = username_entry.get()
password = password_entry.get() password = password_entry.get()
if db.login(username, password): if username.strip() =="" or password.strip() == "":
print("登录成功!") messagebox.showinfo("登录失败", "用户名或密码不能为空")
return
user=db.login(username)
if user:
if password == user["password"]:
app.destroy() app.destroy()
# # 运行新窗口 # # 运行新窗口
show = tk.Tk() show = tk.Tk()
show.title("数据显示页面") show.title("数据显示页面")
show.geometry("600x400+200+100") show.geometry("600x400+200+100")
def serch_book(n):
# 创建搜索框 print("我是一个测试")
# search_label = tk.Label(show, text="搜索:", pady=10) if n == "搜索":
# search_label.pack()
def serch_book():
search = search_entry.get() search = search_entry.get()
else:
search = ""
book_collection = db_data.get_book_list(search) book_collection = db_data.get_book_list(search)
print(book_collection)
# 清空当前 Treeview # 清空当前 Treeview
tree.delete(*tree.get_children()) tree.delete(*tree.get_children())
book_id = 1 book_id = 1
for book in book_collection: for book in book_collection:
tree.insert("", "end", text=book_id, values=( tree.insert("", "end", text=book_id, values=(
book["name"], book["url"], book["star"], book["star_people"], book["author"], book["translater"], book["name"], book["url"], book["star"], book["star_people"], book["author"],
book["translater"],
book["publisher"], book["pub_year"], book["price"], book["comment"])) book["publisher"], book["pub_year"], book["price"], book["comment"]))
book_id = book_id + 1 book_id = book_id + 1
tree.update()
def Crawling_book():
Crawling = Crawling_entry.get()
main.main(int(Crawling))
def analysis_book():
GUI.show()
def on_tree_double_click(event): def on_tree_double_click(event):
item = tree.selection()[0] # 获取双击的行 item = tree.selection()[0] # 获取双击的行
url = tree.item(item, "values")[1] # 假设 URL 地址在第二列,根据实际需要调整 url = tree.item(item, "values")[1] # 假设 URL 地址在第二列,根据实际需要调整
webbrowser.open(url) # 打开 URL 地址 webbrowser.open(url) # 打开 URL 地址
# 创建一个Frame来放置顶部的按钮和输入框
search_button = tk.Button(show, text="搜索", command=serch_book, width=30, font=15) top_frame = tk.Frame(show)
search_button.pack() top_frame.pack(side=tk.TOP)
search_entry = tk.Entry(show, width=30) search_button = tk.Button(top_frame, text="搜索", command=lambda: serch_book("搜索"), width=8, font=15)
search_entry.pack() search_button.pack(side=tk.LEFT)
search_entry = tk.Entry(top_frame, width=15)
search_entry.pack(side=tk.LEFT)
Crawling_button = tk.Button(top_frame, text="爬取", command=Crawling_book, width=8, font=15)
Crawling_button.pack(side=tk.LEFT)
Crawling_entry = tk.Entry(top_frame, width=15)
Crawling_entry.pack(side=tk.LEFT)
Refresh_button = tk.Button(top_frame, text="刷新", command=lambda: serch_book("刷新"), width=8, font=15)
Refresh_button.pack(side=tk.RIGHT)
analysis_button = tk.Button(top_frame, text="分析", command=analysis_book, width=8, font=15)
analysis_button.pack(side=tk.RIGHT)
# 显示书籍集合数据 # 显示书籍集合数据
book_collection = db_data.get_book_list() book_collection = db_data.get_book_list()
tree = ttk.Treeview(show, columns=("name", "url", "star", "star_people","author", "translater","publisher","pub_year","price","comment")) tree = ttk.Treeview(show, columns=(
"name", "url", "star", "star_people", "author", "translater", "publisher", "pub_year", "price", "comment"))
tree.heading("#0", text="序号") tree.heading("#0", text="序号")
tree.heading("name", text="书名") tree.heading("name", text="书名")
tree.heading("url", text="链接地址") tree.heading("url", text="链接地址")
@ -63,7 +88,6 @@ def on_login_button_click():
tree.heading("pub_year", text="出版年份") tree.heading("pub_year", text="出版年份")
tree.heading("price", text="价格") tree.heading("price", text="价格")
tree.heading("comment", text="评论") tree.heading("comment", text="评论")
tree.column("#0", width=10) # 序号列 tree.column("#0", width=10) # 序号列
tree.column("name", width=30) # 书名列 tree.column("name", width=30) # 书名列
tree.column("url", width=30) # 链接地址列 tree.column("url", width=30) # 链接地址列
@ -75,24 +99,24 @@ def on_login_button_click():
tree.column("star", width=30) # 评分列 tree.column("star", width=30) # 评分列
tree.column("star_people", width=30) # 评分人数列 tree.column("star_people", width=30) # 评分人数列
tree.column("translater", width=20) tree.column("translater", width=20)
book_id = 1
book_id=1
for book in book_collection: for book in book_collection:
tree.insert("", "end", text=book_id, values=(book["name"], book["url"], book["star"], book["star_people"], book["author"], book["translater"], book["publisher"], book["pub_year"], book["price"], book["comment"])) tree.insert("", "end", text=book_id, values=(
book_id=book_id+1 book["name"], book["url"], book["star"], book["star_people"], book["author"], book["translater"],
book["publisher"], book["pub_year"], book["price"], book["comment"]))
book_id = book_id + 1
# 绑定双击事件 # 绑定双击事件
tree.bind("<Double-1>", on_tree_double_click) tree.bind("<Double-1>", on_tree_double_click)
# #布局管理器 # #布局管理器
#tree.grid(row=1, column=0, columnspan=2) # tree.grid(row=1, column=0, columnspan=2)
# 使用水平滚动条 # 使用水平滚动条
tree.pack(fill="x") tree.pack(fill="x")
# 运行应用程序 # 运行应用程序
show.mainloop() show.mainloop()
else: else:
messagebox.showinfo("登录失败", "用户名或密码错误") messagebox.showinfo("登录失败", "密码错误")
else:
messagebox.showinfo("登录失败", "{}用户不存在".format(username))
# 创建 Tkinter 应用程序 # 创建 Tkinter 应用程序
app = tk.Tk() app = tk.Tk()

Loading…
Cancel
Save