本次的项目步骤:一、分析网页,确定爬取数据

二、使用lxml库爬取内容并保存

三、读取数据并选择部分内容进行分析

步骤一:
分析网页源代码可以看到,书籍信息在属性为 class="doulist-item"的div标签中,打开发现,我们需要爬取的信息都在标签内部,通过xpath语法我们可以很简便的爬取所需内容。

分享图片(书籍各类信息所在标签)

所需爬取的内容在 class为post、title、rating、abstract的div标签中。

步骤二:

先定义爬取函数,爬取所需内容
执行函数,并存入csv文件
具体代码如下:

 1 import requests2 from lxml import etree3 import time4 import csv5 6 #信息头7 headers = {8     ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36‘9 }
10
11 #定义爬取函数
12 def douban_booksrank(url):
13     res = requests.get(url, headers=headers)
14     selector = etree.HTML(res.text)
15     contents = selector.xpath(‘//div[@class="article"]/div[contains(@class,"doulist-item")]‘)  #循环点
16     for content in contents:
17         try:
18             title = content.xpath(‘div/div[2]/div[3]/a/text()‘)[0]  #书名
19             scores = content.xpath(‘div/div[2]/div[4]/span[2]/text()‘)  #评分
20             scores.append(‘9.0‘)  #因为有一些书没有评分,导致列表为空,此处添加一个默认评分,若无评分则默认为9.0
21             score = scores[0]
22             comments = content.xpath(‘div/div[2]/div[4]/span[3]/text()‘)[0] #评论数量
23             author = content.xpath(‘div/div[2]/div[5]/text()[1]‘)[0]    #作者
24             publishment = content.xpath(‘div/div[2]/div[5]/text()[2]‘)[0]   #出版社
25             pub_year = content.xpath(‘div/div[2]/div[5]/text()[3]‘)[0]  #出版时间
26             img_url = content.xpath(‘div/div[2]/div[2]/a/img/@src‘)[0]  #书本图片的网址
27             img = requests.get(img_url) #解析图片网址,为下面下载图片
28             img_name_file = ‘C:/Users/lenovo/Desktop/douban_books/{}.png‘.format((title.strip())[:3])   #图片存储位置,图片名只取前3
29             #写入csv
30             with open(‘C:\\Users\lenovo\Desktop\\douban_books.csv‘, ‘a+‘, newline=‘‘, encoding=‘utf-8‘)as fp:   #newline 使不隔行
31                 writer = csv.writer(fp)
32                 writer.writerow((title, score, comments, author, publishment, pub_year, img_url))
33             #下载图片,为防止图片名导致格式错误,加入try...except
34             try:
35                 with open(img_name_file, ‘wb‘)as imgf:
36                     imgf.write(img.content)
37             except FileNotFoundError or OSError:
38                 pass
39             time.sleep(0.5) #睡眠0.5s
40         except IndexError:
41             pass
42 #执行程序
43 if __name__==‘__main__‘:
44     #爬取所以书本,共22页的内容
45     urls = [‘https://www.douban.com/doulist/1264675/?start={}&sort=time&playable=0&sub_type=‘.format(str(i))for i in range(0,550,25)]
46     #写csv首行
47     with open(‘C:\\Users\lenovo\Desktop\\douban_books.csv‘, ‘a+‘, newline=‘‘, encoding=‘utf-8‘)as f:
48         writer = csv.writer(f)
49         writer.writerow((‘title‘, ‘score‘, ‘comment‘, ‘author‘, ‘publishment‘, ‘pub_year‘, ‘img_url‘))
50     #遍历所有网页,执行爬取程序
51     for url in urls:
52         douban_booksrank(url)

步骤三:
本次使用Python常用的数据分析库pandas来提取所需内容。pandas的read_csv()函数可以读取csv文件并根据文件格式转换为Series、DataFrame或面板对象。

此处我们提取的数据转变为DataFrame(数据帧)对象,然后通过Matplotlib绘图库来进行绘图。

具体代码如下:

 1 from matplotlib import pyplot as plt2 import pandas as pd3 import re4 5 plt.rcParams[‘font.sans-serif‘]=[‘SimHei‘] #用来正常显示中文标签6 plt.rcParams[‘axes.unicode_minus‘]=False #用来正常显示负号7 plt.subplots_adjust(hspace=0.5) #调整subplot上下子图间的距离8 9 pd.set_option(‘display.max_rows‘, None) #设置使dataframe 所有行都显示
10
11 df = pd.read_csv(‘C:\\Users\lenovo\Desktop\\douban_books.csv‘)  #读取csv文件,并赋为dataframe对象
12
13 comment = re.findall(‘\((.*?)人评价‘, str(df.comment), re.S)   #使用正则表达式获取评论人数
14 #将comment的元素化为整型
15 new_comment = []
16 for i in comment:
17     new_comment.append(int(i))
18
19 pub_year = re.findall(r‘\d{4}‘, str(df.pub_year),re.S)  #获取书籍出版年份
20 #同上
21 new_pubyear = []
22 for n in pub_year:
23     new_pubyear.append(int(n))
24
25 #绘图
26 #1、绘制书籍评分范围的直方图
27 plt.subplot(2,2,1)
28 plt.hist(df.score, bins=16, edgecolor=‘black‘)
29 plt.title(‘豆瓣书籍排行榜评分分布‘, fontweight=700)
30 plt.xlabel(‘scores‘)
31 plt.ylabel(‘numbers‘)
32
33 #绘制书籍评论数量的直方分布图
34 plt.subplot(222)
35 plt.hist(new_comment, bins=16, color=‘green‘, edgecolor=‘yellow‘)
36 plt.title(‘豆瓣书籍排行榜评价分布‘, fontweight=700)
37 plt.xlabel(‘评价数‘)
38 plt.ylabel(‘书籍数量(单位/本)‘)
39
40 #绘制书籍出版年份分布图
41 plt.subplot(2,2,3)
42 plt.hist(new_pubyear, bins=30, color=‘indigo‘,edgecolor=‘blue‘)
43 plt.title(‘书籍出版年份分布‘, fontweight=700)
44 plt.xlabel(‘出版年份/year‘)
45 plt.ylabel(‘书籍数量/本‘)
46
47 #寻找关系
48 plt.subplot(224)
49 plt.bar(new_pubyear,new_comment, color=‘red‘, edgecolor=‘white‘)
50 plt.title(‘书籍出版年份与评论数量的关系‘, fontweight=700)
51 plt.xlabel(‘出版年份/year‘)
52 plt.ylabel(‘评论数‘)
53
54 plt.savefig(‘C:\\Users\lenovo\Desktop\\douban_books_analysis.png‘)   #保存图片
55 plt.show()

这里需要注意的是,使用了正则表达式来提取评论数和出版年份,将其中的符合和问题剔除。

分析结果如下:

数据图像化的结果

本次分析的内容也较为简单,从上面的几个图形中我们也能得出一些结论。

这些高分书籍中绝大多数的评论数量都在50000以下;
多数排行榜上的高分书籍都出版在2000年以后;
出版年份在2000年后的书籍有更多的评论数量。
以上数据也见解的说明了在进入二十世纪后我国的图书需求量更大了,网络更发达,更多人愿意发表自己的看法。

本次的分享到此。若有错误,欢迎指正。有建议的话也可以留言。

Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析相关推荐

  1. python爬虫模块排名_Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析

    上次使用了beautifulsoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢.本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快. 本次爬取的豆瓣书籍排行榜的首页地 ...

  2. python爬取豆瓣书籍_Python利用lxml模块爬取豆瓣读书排行榜的方法与分析

    前言 上次使用了BeautifulSoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢.本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快. 本次爬取的豆瓣书籍排行榜的 ...

  3. python爬虫(一)爬取豆瓣电影排名前50名电影的信息

    python爬虫(一)爬取豆瓣电影排名前50名电影的信息 在Python爬虫中,我们可以使用beautifulsoup对网页进行解析. 我们可以使用它来爬取豆瓣电影排名前50名的电影的详细信息,例如排 ...

  4. Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题

      比如我们今天的案例,豆瓣电影分类页面.根本没有什么翻页,需要点击"加载更多"新的电影信息,前面的黑科技瞬间被秒--   又比如知乎关注的人列表页面:   我复制了其中两个人昵称 ...

  5. Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除)

    Python爬虫菜鸟入门,爬取豆瓣top250电影 (自己学习,如有侵权,请联系我删除) import requests from bs4 import BeautifulSoup import ti ...

  6. Python爬虫如何实用xpath爬取豆瓣音乐

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  7. 【python 爬虫】 scrapy 入门--爬取百度新闻排行榜

    scrapy 入门–爬取百度新闻排行榜 环境要求:python2/3(anaconda)scrapy库 开发环境:sublime text + windows cmd 下载scrapy(需要pytho ...

  8. Python爬虫-02 request模块爬取妹子图网站

    简介 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载 ...

  9. python爬虫———多线程threading模块爬取抖音用户信息

    爬虫背景: 由于原来的数据库中有1.5亿左右的用户id,但是其中有1.2亿的用户资料是不完整的(没有粉丝数量,点赞数量等,算是无用数据),现在老板要求将这些没有资料的用户更新信息,咋办? 刚开始的想法 ...

  10. python爬虫笔记一:爬取豆瓣中指定的明星所有图片

    从这个网址学习的:https://www.bilibili.com/read/cv10367703/ ------------------------------------------------- ...

最新文章

  1. Oceanus:美团HTTP流量定制化路由的实践
  2. sharepoint 2010 创建内容类型2
  3. Adreno GPU Profiler
  4. 【算法】图文并茂,一文了解 8 种常见的数据结构
  5. Wordpress如何打开调试模式
  6. GraphQL:验证与授权
  7. 浅谈开关量采集回路的设计及交流干扰问题解决方案
  8. 四大开源分布式存储_ipfs分布式存储行业面临着四大主要风险,你知道是哪些吗?...
  9. Unix系统的diff工具程序
  10. PHP正则表达式学习(一) 模式修正符
  11. 挑战程序设计竞赛第一章 笔记
  12. JavaWeb项目开发步骤
  13. 算法精解 c语言 源码,算法精解七(C语言版)
  14. 使用DOS命令操作MySQL
  15. 微信小程序:十二星座运势查询
  16. AutoLeader控制组——51单片机学习笔记(一)
  17. Oracle - Spool导出数据到TXT文件
  18. 纯干货!Java后端开发十二条经验分享!
  19. .NET与JAVA的区别【完整版】
  20. MySQL数据库快速入门

热门文章

  1. Box plot (箱形图) 中 quartile (四分位数)原理,及python_matplotlib中Q1和Q3定义的不同
  2. 当读/写磁盘文件时,read/write是不带缓冲机制的吗?请说明原因。
  3. 财务会计上的凭证冲销和SAP中的凭证冲销(红冲、蓝冲)
  4. matinee和matin区别_法语小灶 | an和année, jour和journée有什么区别?
  5. qt 嵌入web页面_Qt与Web混合开发(一)--简单使用
  6. 【好奇心驱动力】APP每日打卡自动化测试
  7. TIA Protal 精智面板中的动画外观
  8. 记英语单词中第一个易混淆的单词组attain achieve acquire
  9. LinkedIn前副总裁Brian Frank:三十亿美金销售缔造者的领导力思考
  10. 第九话 树结构实际应用