微信公众号:数据皮皮侠
如果你觉得该公众号对你有帮助,欢迎关注、推广和宣传
内容目录:豆瓣图书评分排名爬取与分析












作者团:张剑桥 李欣意 张沁逸 赵茂涵 梁秋婷
(一)数据爬取部分代码
import csv
from lxml import etree
import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
f = open('doubanTop250.csv', 'wt', newline='', encoding='UTF-8') #创建csv文件
writer = csv.writer(f)
writer.writerow(('name', 'url', 'author', 'publisher', 'date', 'price', 'rate','comment'))
urls = ["https://book.douban.com/top250?start={}"\
.format(str(i)) for i in range(0,226,25)] #构造url列表
for url in urls:
print('正在爬取'+url)
r = requests.get(url, headers=headers)
selector = etree.HTML(r.text)
infos = selector.xpath('//tr[@class="item"]') #取大标签,以此循环
for info in infos:
name = info.xpath('td/div/a/@title')[0]
url = info.xpath('td/div/a/@href')[0]
book_infos = info.xpath('td/p/text()')[0]
author = book_infos.split('/')[0]
publisher = book_infos.split('/')[-3]
date = book_infos.split('/')[-2]
price = book_infos.split('/')[-1]
rate = info.xpath('td/div/span[2]/text()')[0]
comments = info.xpath('td/p/span/text()')
comment = comments[0] if len(comments) != 0 else "空"
writer.writerow((name,url,author,publisher,date,price,rate,comment))
f.close()
(二)数据分析及可视化的代码
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 12 03:00:08 2020
@author: HP
"""
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('C:\\Users\\10121\\Desktop\\python\\doubanTop250.csv')
df.head()
df['year'] = df.date.str[:5]#处理出版时间
df.head()
df[df.rate>=9.0].sort_values(by='rate',ascending=False)[:10]#评分前十降序排列
df.rate.hist(bins=12)#显示大部分书籍评分情况
publisher_df = df.groupby('publisher').rate.agg(['count','mean']).sort_values(by='count',ascending=False)[:10]
publisher_df.plot.barh(color=['r','g','b', 'c', 'm', 'y'])
plt.title("出版的书籍数量排名前10的出版社分布情况",fontsize=20)
author_df = df.groupby('author').name.count().sort_values(ascending=False).head(20)
author_df.plot.barh(color=['r','g','b', 'c', 'm', 'y'])#作者书籍数量
plt.title("书籍数量排名前10的作者分布情况",fontsize=20)
year_df = pd.DataFrame(df.groupby(['year']).agg({'rate':'mean','name':'count'}))#各年份产出的书籍数量
year_df.plot.bar()
plt.title("各年份产出的书籍数量分布情况",fontsize=20)
#制作评论词云
import jieba.analyse
from wordcloud import WordCloud
from functools import reduce
from pylab import *
import matplotlib.pyplot as plt
font = r'C:\\Windows\\Fonts\\STFANGSO.TTF'
g = lambda x,y:x+y
m = reduce (g,df_clean['comment'])
result = jieba.analyse.textrank(m, topK=50, withWeight=True)
keywords = dict()
for i in result:
keywords[i[0]] = i[1]
wc = wordcloud.WordCloud(
font_path=font,
scale=1.5
)
wc.generate_from_frequencies(keywords)
plt.axis('off')
plt.imshow(wc)
上面的code在实现的过程中需要进行部分修改,例如数据读取的地址.。

