zoukankan      html  css  js  c++  java
  • 豆瓣图书Top250

    从豆瓣图书Top250抓取数据,并通过词云图展示

    导入库

    from lxml import etree #解析库
    import time #时间
    import random #随机函数
    import pandas as pd
    import requests #请求库
    import jieba #导入结巴分词
    from pyecharts.charts import WordCloud
    from 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('(
    ').strip('
    )')
            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

  • 相关阅读:
    无法解析导入javax.mail
    maven-assembly-plugin入门
    maven profile动态选择配置文件
    阿里巴巴Jetcache springboot使用教程
    跨域技术(JSONP与CROS)
    Hystrix 监控数据聚合 Turbine【Finchley 版】
    5分钟搭建网站实时分析:Grafana+日志服务实战
    idea解决打开大文件消耗CPU问题
    String类
    匿名对象,内部类和访问修饰符应用
  • 原文地址:https://www.cnblogs.com/hankleo/p/11408811.html
Copyright © 2011-2022 走看看