python爬虫书籍经典(Python利用lxml模块爬取豆瓣读书排行榜的方法与分析)
python爬虫书籍经典
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析前言
上次使用了beautifulsoup库爬取电影排行榜,爬取相对来说有点麻烦,爬取的速度也较慢。本次使用的lxml库,我个人是最喜欢的,爬取的语法很简单,爬取速度也快。
本次爬取的豆瓣书籍排行榜的首页地址是:
https://www.douban.com/doulist/1264675/?start=0&sort=time&playable=0&sub_type=
该排行榜一共有22页,且发现更改网址的 start=0 的 0 为25、50就可以跳到排行榜的第二、第三页,所以后面只需更改这个数字然后通过遍历就可以爬取整个排行榜的书籍信息。
本次爬取的内容有书名、评分、评价数、出版社、出版年份以及书籍封面图,封面图保存为图片,其他数据存为csv文件,方面后面读取分析。
本次的项目步骤:一、分析网页,确定爬取数据
二、使用lxml库爬取内容并保存
三、读取数据并选择部分内容进行分析
步骤一:
分析网页源代码可以看到,书籍信息在属性为的li标签中,打开发现,我们需要爬取的信息都在标签内部,通过xpath语法我们可以很简便的爬取所需内容。
(书籍各类信息所在标签)
所需爬取的内容在 class为post、title、rating、abstract的li标签中。
步骤二:
先定义爬取函数,爬取所需内容执行函数,并存入csv文件
具体代码如下:
|
import requests from lxml import etree import time import csv #信息头 headers = { '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' } #定义爬取函数 def douban_booksrank(url): res = requests.get(url, headers = headers) selector = etree.html(res.text) contents = selector.xpath( '//li[@class="article"]/li[contains(@class,"doulist-item")]' ) #循环点 for content in contents: try : title = content.xpath( 'li/li[2]/li[3]/a/text()' )[ 0 ] #书名 scores = content.xpath( 'li/li[2]/li[4]/span[2]/text()' ) #评分 scores.append( '9.0' ) #因为有一些书没有评分,导致列表为空,此处添加一个默认评分,若无评分则默认为9.0 score = scores[ 0 ] comments = content.xpath( 'li/li[2]/li[4]/span[3]/text()' )[ 0 ] #评论数量 author = content.xpath( 'li/li[2]/li[5]/text()[1]' )[ 0 ] #作者 publishment = content.xpath( 'li/li[2]/li[5]/text()[2]' )[ 0 ] #出版社 pub_year = content.xpath( 'li/li[2]/li[5]/text()[3]' )[ 0 ] #出版时间 img_url = content.xpath( 'li/li[2]/li[2]/a/img/@src' )[ 0 ] #书本图片的网址 img = requests.get(img_url) #解析图片网址,为下面下载图片 img_name_file = 'c:/users/lenovo/desktop/douban_books/{}.jpg" alt="python爬虫书籍经典(Python利用lxml模块爬取豆瓣读书排行榜的方法与分析)" border="0" /> #写入csv with open ( 'c:\\users\lenovo\desktop\\douban_books.csv' , 'a+' , newline = ' ', encoding=' utf - 8 ')as fp: #newline 使不隔行 writer = csv.writer(fp) writer.writerow((title, score, comments, author, publishment, pub_year, img_url)) #下载图片,为防止图片名导致格式错误,加入try...except try : with open (img_name_file, 'wb' )as imgf: imgf.write(img.content) except filenotfounderror or oserror: pass time.sleep( 0.5 ) #睡眠0.5s except indexerror: pass #执行程序 if __name__ = = '__main__' : #爬取所有书本,共22页的内容 urls = [ 'https://www.douban.com/doulist/1264675/?start={}&sort=time&playable=0&sub_type=' . format ( str (i)) for i in range ( 0 , 550 , 25 )] #写csv首行 with open ( 'c:\\users\lenovo\desktop\\douban_books.csv' , 'a+' , newline = ' ', encoding=' utf - 8 ')as f: writer = csv.writer(f) writer.writerow(( 'title' , 'score' , 'comment' , 'author' , 'publishment' , 'pub_year' , 'img_url' )) #遍历所有网页,执行爬取程序 for url in urls: douban_booksrank(url) |
爬取结果截图如下:
步骤三:
本次使用python常用的数据分析库pandas来提取所需内容。pandas的read_csv()函数可以读取csv文件并根据文件格式转换为series、dataframe或面板对象。
此处我们提取的数据转变为dataframe(数据帧)对象,然后通过matplotlib绘图库来进行绘图。
具体代码如下:
|
from matplotlib import pyplot as plt import pandas as pd import re plt.rcparams[ 'font.sans-serif' ] = [ 'simhei' ] #用来正常显示中文标签 plt.rcparams[ 'axes.unicode_minus' ] = false #用来正常显示负号 plt.subplots_adjust(wsapce = 0.5 , hspace = 0.5 ) #调整subplot子图间的距离 pd.set_option( 'display.max_rows' , none) #设置使dataframe 所有行都显示 df = pd.read_csv( 'c:\\users\lenovo\desktop\\douban_books.csv' ) #读取csv文件,并赋为dataframe对象 comment = re.findall( '\((.*?)人评价' , str (df.comment), re.s) #使用正则表达式获取评论人数 #将comment的元素化为整型 new_comment = [] for i in comment: new_comment.append( int (i)) pub_year = re.findall(r '\d{4}' , str (df.pub_year),re.s) #获取书籍出版年份 #同上 new_pubyear = [] for n in pub_year: new_pubyear.append( int (n)) #绘图 #1、绘制书籍评分范围的直方图 plt.subplot( 2 , 2 , 1 ) plt.hist(df.score, bins = 16 , edgecolor = 'black' ) plt.title( '豆瓣书籍排行榜评分分布' , fontweight = 700 ) plt.xlabel( 'scores' ) plt.ylabel( 'numbers' ) #绘制书籍评论数量的直方分布图 plt.subplot( 222 ) plt.hist(new_comment, bins = 16 , color = 'green' , edgecolor = 'yellow' ) plt.title( '豆瓣书籍排行榜评价分布' , fontweight = 700 ) plt.xlabel( '评价数' ) plt.ylabel( '书籍数量(单位/本)' ) #绘制书籍出版年份分布图 plt.subplot( 2 , 2 , 3 ) plt.hist(new_pubyear, bins = 30 , color = 'indigo' ,edgecolor = 'blue' ) plt.title( '书籍出版年份分布' , fontweight = 700 ) plt.xlabel( '出版年份/year' ) plt.ylabel( '书籍数量/本' ) #寻找关系 plt.subplot( 224 ) plt.bar(new_pubyear,new_comment, color = 'red' , edgecolor = 'white' ) plt.title( '书籍出版年份与评论数量的关系' , fontweight = 700 ) plt.xlabel( '出版年份/year' ) plt.ylabel( '评论数' ) plt.savefig( 'c:\\users\lenovo\desktop\\douban_books_analysis.jpg" alt="python爬虫书籍经典(Python利用lxml模块爬取豆瓣读书排行榜的方法与分析)" border="0" /> plt.show() |
这里需要注意的是,使用了正则表达式来提取评论数和出版年份,将其中的符号和文字等剔除。
分析结果如下:
本次分析的内容也较为简单,从上面的几个图形中我们也能得出一些结论。
这些高分书籍中绝大多数的评论数量都在50000以下;多数排行榜上的高分书籍都出版在2000年以后;出版年份在2000年后的书籍有更多的评论数量。
以上数据也见解的说明了在进入二十世纪后我国的图书需求量更大了,网络更发达,更多人愿意发表自己的看法。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。
原文链接:https://www.cnblogs.com/berryguotoshare/p/10708143.html
- python学生管理系统与数据库(python学生管理系统学习笔记)
- python 暗弱目标提取(Python提取频域特征知识点浅析)
- python使用门算法加密文件(python实现栅栏加解密 支持密钥加密)
- python外部如何调嵌套函数(python中嵌套函数的实操步骤)
- scrapy框架爬取小说的正文内容(Scrapy框架爬取Boss直聘网Python职位信息的源码)
- python多线程有两个参数怎么传(python从子线程中获得返回值的方法)
- python网络爬虫案例实战(python爬取cnvd漏洞库信息的实例)
- python微信防封(深入学习微信网址链接解封的防封原理visit_type)
- python抽奖转盘代码(详解python--模拟轮盘抽奖游戏)
- python读取mat文件(详解Python Matplot中文显示完美解决方案)
- Python实现合并两个有序链表的方法示例(Python实现合并两个有序链表的方法示例)
- pythonselenium判断网页加载完成(python 实现selenium断言和验证的方法)
- python实用教程(Python简直是万能的,这5大主要用途你一定要知道!推荐)
- python中if语句应学会什么(Python基础之条件控制操作示例if语句)
- wxpython 弹出对话框显示图片(WxPython建立批量录入框窗口)
- python正则表达式处理教学(使用Python正则表达式操作文本数据的方法)
- 这个全椒人被通报表彰,看看你认识吗(这个全椒人被通报表彰)
- 全椒人,38年集体回忆 1980-2018 ,看完不要哭(全椒人38年集体回忆)
- 董元奔吟咏历代文人 1012新旧均可 全椒人张璪 1022 -1093(董元奔吟咏历代文人)
- 泪目 这位 刷屏 的英雄,是全椒人的骄傲(泪目这位刷屏)
- 人从众 火炎焱 全椒再现 正月十六走太平 的魅力(人从众火炎焱全椒再现)
- 官宣 全椒籍明星许海峰 奚秀兰 方芳 王璐瑶携手回家 走太平(全椒籍明星许海峰)
热门推荐
- css before和after(CSS中灵活使用:before和:after)
- sql 基本函数(SQL开窗函数的具体实现详解)
- vue动态路由实现权限控制(vue2/vue3路由权限管理的方法实例)
- display和visibility的用法和区别
- 前端用图片隐藏请求接口(前端实现打印图像功能)
- docker容器运行环境(Docker 清理环境操作)
- 检查安装apache(Apache下MP3 防盗链的解决办法)
- vue中的watch属性(vue Watch和Computed的使用总结)
- sqlserver中有几种锁定模式(SQL Server 开窗函数 Over代替游标的使用详解)
- mysqljson字段查询(Mysql 查询JSON结果的相关函数汇总)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9