从豆瓣图书Top250抓取数据,并通过词云图展示
导入库
from lxml import etree #解析库import time #时间import random #随机函数import pandas as pdimport requests #请求库import jieba #导入结巴分词from pyecharts.charts import WordCloudfrom pyecharts import options as opts
抓取数据
#循环构造网址def format_url(base_url,pages=10): urls=[] for num in range(0,pages * 25,25): urls.append(base_url.format(num)) return urls#解析单个页面def parse_page(url,headers): #创建一个存储结果的容器 result=pd.DataFrame() html=requests.get(url,headers=headers) bs=etree.HTML(html.text) for i in bs.xpath('//tr[@class="item"]'): #书籍中文名 book_ch_name=i.xpath('td[2]/div[1]/a[1]/@title')[0] #评分 score=i.xpath('td[2]/div[2]/span[2]')[0].text #书籍信息 book_info=i.xpath('td[2]/p[@class="pl"]')[0].text #评价数量由于数据不规整,使用字符串方法进行数据处理 comment_num=i.xpath('td[2]/div[2]/span[3]')[0].text.replace(' ','').strip('(\n').strip('\n)') try: #一句话概括 brief=i.xpath('td[2]/p[@class="quote"]/span')[0].text except: brief=None #这里的cache是存储每一循环的结果,然后通过下一步操作循环更新result里面的数据 cache=pd.DataFrame({'中文名':[book_ch_name],'评分':[score],'书籍信息':[book_info],'评价数量':[comment_num],'一句话概括':[brief]}) result=pd.concat([result,cache]) return result#主函数def main(): final_result=pd.DataFrame() base_url='https://book.douban.com/top250?start={}' headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} urls=format_url(base_url,pages=10) for url in urls: res=parse_page(url,headers=headers) final_result=pd.concat([final_result,res]) time.sleep(random.random()*3) return final_result#运行函数if __name__ == "__main__": final_result = main()
提取词云图要展示的数据
#提取书名、评分、评价数量book_top250=final_result[['中文名','评分','评价数量']]#将书名转为列表book_name=book_top250['中文名'].tolist()#将评分转为列表book_score=book_top250['评分'].tolist()#将评价人数转为列表book_comment_num=book_top250['评价数量'].tolist()#去除多余字符"人评价"book_comment_num=[x.strip("人评价") for x in book_comment_num if x.strip()!='']#用for循环合并数据a=[z for z in zip(book_name,book_comment_num)]
绘图设置
c=( #WordCloud类的实例化 WordCloud() #添加图名称、数据、字体的随机大小、图像类型 .add("",a,word_size_range=[5,50],shape="diamond") #设置标题 .set_global_opts(title_opts=opts.TitleOpts(title="豆瓣图书Top250")))
结果展示
c.render_notebook()
参考来源:
微信公众号:数据不吹牛(shujubuchuiniu) https://blog.csdn.net/weixin_40864434/article/details/90301592