用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值
这个爬虫小项目是中国大学MOOC的“用Python玩转数据”课程的一个课后作业,由南京大学张莉老师主讲,有兴趣的同学可以看一看。
虽然老师已经给出了参考代码,但由于豆瓣读书网站已经改版,参考代码中的爬取方法已经不可用,所以我将源代码稍作修改,并使之模块化,增强代码的可复用性。
爬取思路如下:
首先我们打开豆瓣读书的任何一本书的书评页,这里以《Python编程 从入门到实践(第2版)》为例。
在页面空白处右击鼠标选择“检查”查看网页的HTML代码(我用的是Edge浏览器,其他浏览器的操作方法也应该相似),点击左上角的箭头按钮,可以查看页面中模块对应的代码位置,如下图所示:
我们可以看到,每一条书评都放在一个列表模块<li>中,书评的内容嵌套在<span>模块中,class属性是“short”,相应的,评分(star)也放在<span>模块中,class属性是“user-stars allstar40 rating”,其中的数字40即表示评分,一颗星表示10分,四颗星就是40分。如下图:
爬取思路是用Python的requests库获取网页的HTML,再通过BeautifulSoup库解析HTML获取相应的书评和评分信息。
我们再来看看书评页面的具体信息,发现每页只能显示20条书评,那如果我们想爬取多于20条的书评,是不是要通过爬取一个页面换一个URL的“笨方法”呢?其实也不用,通过观察网页的URL可以发现,每个页面的URL只有"start="后面的数字不同,这个数字是控制页面从第几条书评开始显示,第一页就是从第0条书评开始,第二页就是从第20条开始,我们可以把这个数字改成其他值,相应的页面就会从那一条书评开始显示。
我们可以发现URL中还有一个参数limit,表示每一页显示的书评数,那我们可不可以把这个参数改成我们想要爬取的书评数目呢,这样我们就能在一个页面中完成爬取,但很可惜,试了一下发现不行,无论怎么改还是只能显示20条书评。
但既然每个页面的URL只有start的参数不同,我们就可以通过一个while循环(python的for循环好像只能用来遍历一个迭代器)来爬取多个页面。
为了代码的可复用性,我把这个项目分成信息获取和结果展示两个模块,分别定义两个函数getInfo(url, n) 和showRst(),函数getInfo中的两个参数表示要爬取的书评网页的URL和书评的数量。
下面是具体的代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 12 17:43:45 2021@discribe: douban_comments_spider
@author: 86150
"""#定义爬取信息的函数,其中参数url是爬取书评首页的地址,n是爬取书评的数量
def getInfo(url, n):#导入要用到的第三方库import requests from bs4 import BeautifulSoupimport reimport timecount = 0 #用于记录书评数量的计数器i = 0 #用于控制翻页的计数器lis_comments = [] #用于存放书评内容的列表lis_stars = [] #用于存放评分的列表header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
#用于向服务器发送请求的头部信息while count<n:url_n=url.split('?')[0]+'?start='+str(i)+url.split('?')[1] #调用字符串的split()方法,以'?'为分隔符将URL分成两个字符串,中间加入'?start='+str(i)字符串组成新的URLr = requests.get(url_n,headers=header) #调用requests的get()方法获取页面信息soup = BeautifulSoup(r.text, 'lxml') #以'xml'格式解析r.textcomments = soup.find_all('span','short') #调用soup对象的find_all方法获取具有“short”属性的所有span标签pattern = re.compile('<span class="user-stars allstar(.*?) rating"') #调用正则表达式库的compilere()方法,将正则表达式赋给pattern对象,(.*?)表示获取一个到多个除换行符以外的任意字符,加上?表示非贪婪匹配p = re.findall(pattern, r.text) #调用re的findall方法匹配HTML中的所有评分分数(star)for item in comments:lis_comments.append(item.string) #调用append方法将每一条书评添加到列表中for star in p:lis_stars.append(int(star)) #调用append方法将每一条评分添加到列表中count=len(lis_comments) #获取列表中的书评数目i+=20 #star数加上20,爬取下一个页面time.sleep(3) #根据豆瓣网的robot协议,每访问一个页面停留3秒钟,以免被当作恶意爬虫return lis_comments, lis_stars #返回书评和评分列表,便于被后面的函数调用#定义显示结果的函数,其中参数num是想要显示的书评数量
def showRst(num):c,s = getInfo(url, n) #获取getInfo函数的返回值print("前%d条书评如下:"%n)for i in range(num):print(i+1,c[i]) #打印出每一条书评及其序号print('--------------------------------------------------------------')print("前%d条评分的平均值为:"%len(s),sum(s)/len(s)) #调用python的内部函数len()和sum(),计算评分的平均值if __name__=="__main__": #程序的入口url='https://book.douban.com/subject/35196328/comments/?&limit=20&status=P&sort=new_score'n=100num=80getInfo(url, n) #调用getInfo函数获取前n条书评和评分,因为有些书评可能没有评分,所以评分数可能少于书评数showRst(num) #showRst函数显示前num条书评和评分的平均值
代码中用到正则表达式来匹配字符串,下面是常用的正则表达式:
爬取结果如下:
Life is short, I use Python.
用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值相关推荐
- Python爬取豆瓣电影的Top250(链接、电影名、评分和相关描述等属性)
用了三天的时间学习了简单的爬虫爬取网站数据的过程,循序渐进但也充满趣味,涉及的知识点也很多,尤其是伪装成浏览器.正则表达式.解析网页内容.爬取的数据存档数据库等内容,这是笔者使用python跟做的第一 ...
- Python爬取豆瓣动作电影好评前100名
获取豆瓣动作电影好评前100名 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # https://movie.douban.com/j/chart/ ...
- python 爬取豆瓣top100电影页面
python 爬取豆瓣top100电影页面 运行结果截图: 代码: (原网站:https://movie.douban.com/top250) 1.将页面保存 避免多次访问 (登陆状态需页面cooki ...
- 利用python爬取豆瓣电影top250
利用python爬取豆瓣电影top250: 注:本内容只是作为个人学习记录 1.业务分析 进入网页https://movie.douban.com/top250 可以看见每部电影都呈现在眼前,点击电影 ...
- Python爬取豆瓣电影top250的电影信息
Python爬取豆瓣电影top250的电影信息 前言 一.简介 二.实例源码展示 小结 前言 相信很多小伙伴在学习网络爬虫时,老师们会举一些实例案例讲解爬虫知识,本文介绍的就是经典爬虫实际案例–爬取豆 ...
- python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...
def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...
- python爬取豆瓣影评理论依据_我用Python爬取了豆瓣的影评
使用Python爬取豆瓣的影评,比爬取网易云简单,因为不需要设置特定的headers,关于网易云说几句,很难爬取,对请求头有着严格的要求,前几年那会还好些. 爬取结果分为:用户名,评价的星级,评论的内 ...
- python爬取豆瓣排行榜电影(静态爬取)(二次爬取)
目录 python爬取豆瓣排行榜电影(静态爬取) 获取网站url 获取网站headers get请求访问url BeautifulSoup解析网站 爬取html数据 完整代码 python爬取豆瓣排行 ...
- python爬取豆瓣读书并进行图形化分析
python爬取豆瓣读书并进行图形化分析 豆瓣读书网页数据爬取并保存至csv 对数据进行分析并汇成图形 绘制散点图 图形效果展示 以下代码内容大多是团队小伙伴的杰作,而本人只是为了能让更多的人学习到知 ...
最新文章
- 安装、连接MS SQL Server 2000的问题
- searcherinder.exe
- Android学习笔记(11):线性布局LinearLayout
- ICA处理后,如何判断眼电、心电等成分?
- 陈怡然团队最新研究:用复数神经网络提高梯度正则化准确度 | ICML 2021
- spark python3.6_在mac上搭建spark+ipython环境
- django 利用PIL 保存图片
- linux中的fork方法(python)
- spring学习(3):获取bean对象
- 大数据从入门到就业的四个必备常识
- Wi-Fi 还是蜂窝?搞物联网怎么选择连接协议?
- hdoj1176:免费馅饼(dp基础题-数塔思想)
- 如何运营好一个微信公众号?
- element的上传如何获取路径_element中文件上传
- 我以前的痛苦,你也拥有吗?
- 下载频道2013下半年超人气精华资源汇总网址
- 领域驱动设计,为何又死灰复燃了?
- canvas实现3D魔方
- LockSupport的park和unpark的原理
- 联想机型报 enter your input here
热门文章
- 2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)整理合集
- 一个简单的登录界面设计
- Python爬虫 —— 以北京天气数据爬取为例
- python 协程库_python 协程库gevent学习--源码学习(一)
- Dweb:使用WebRTC / WebTorrent构建弹性Web
- 一文带您了解亚细胞定位(Subcellular Localization)
- 精选汇总 | 科普知识
- ARM 开发板嵌入式linux系统与主机PC通过串口传输文件
- Express Pi 嵌入式开发板
- 使用 vue-direction-key 快速切换 input 的焦点 focus