这个爬虫小项目是中国大学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)的平均值相关推荐

  1. Python爬取豆瓣电影的Top250(链接、电影名、评分和相关描述等属性)

    用了三天的时间学习了简单的爬虫爬取网站数据的过程,循序渐进但也充满趣味,涉及的知识点也很多,尤其是伪装成浏览器.正则表达式.解析网页内容.爬取的数据存档数据库等内容,这是笔者使用python跟做的第一 ...

  2. Python爬取豆瓣动作电影好评前100名

    获取豆瓣动作电影好评前100名 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # https://movie.douban.com/j/chart/ ...

  3. python 爬取豆瓣top100电影页面

    python 爬取豆瓣top100电影页面 运行结果截图: 代码: (原网站:https://movie.douban.com/top250) 1.将页面保存 避免多次访问 (登陆状态需页面cooki ...

  4. 利用python爬取豆瓣电影top250

    利用python爬取豆瓣电影top250: 注:本内容只是作为个人学习记录 1.业务分析 进入网页https://movie.douban.com/top250 可以看见每部电影都呈现在眼前,点击电影 ...

  5. Python爬取豆瓣电影top250的电影信息

    Python爬取豆瓣电影top250的电影信息 前言 一.简介 二.实例源码展示 小结 前言 相信很多小伙伴在学习网络爬虫时,老师们会举一些实例案例讲解爬虫知识,本文介绍的就是经典爬虫实际案例–爬取豆 ...

  6. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  7. python爬取豆瓣影评理论依据_我用Python爬取了豆瓣的影评

    使用Python爬取豆瓣的影评,比爬取网易云简单,因为不需要设置特定的headers,关于网易云说几句,很难爬取,对请求头有着严格的要求,前几年那会还好些. 爬取结果分为:用户名,评价的星级,评论的内 ...

  8. python爬取豆瓣排行榜电影(静态爬取)(二次爬取)

    目录 python爬取豆瓣排行榜电影(静态爬取) 获取网站url 获取网站headers get请求访问url BeautifulSoup解析网站 爬取html数据 完整代码 python爬取豆瓣排行 ...

  9. python爬取豆瓣读书并进行图形化分析

    python爬取豆瓣读书并进行图形化分析 豆瓣读书网页数据爬取并保存至csv 对数据进行分析并汇成图形 绘制散点图 图形效果展示 以下代码内容大多是团队小伙伴的杰作,而本人只是为了能让更多的人学习到知 ...

最新文章

  1. 安装、连接MS SQL Server 2000的问题
  2. searcherinder.exe
  3. Android学习笔记(11):线性布局LinearLayout
  4. ICA处理后,如何判断眼电、心电等成分?
  5. 陈怡然团队最新研究:用复数神经网络提高梯度正则化准确度 | ICML 2021
  6. spark python3.6_在mac上搭建spark+ipython环境
  7. django 利用PIL 保存图片
  8. linux中的fork方法(python)
  9. spring学习(3):获取bean对象
  10. 大数据从入门到就业的四个必备常识
  11. Wi-Fi 还是蜂窝?搞物联网怎么选择连接协议?
  12. hdoj1176:免费馅饼(dp基础题-数塔思想)
  13. 如何运营好一个微信公众号?
  14. element的上传如何获取路径_element中文件上传
  15. 我以前的痛苦,你也拥有吗?
  16. 下载频道2013下半年超人气精华资源汇总网址
  17. 领域驱动设计,为何又死灰复燃了?
  18. canvas实现3D魔方
  19. LockSupport的park和unpark的原理
  20. 联想机型报 enter your input here

热门文章

  1. 2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)整理合集
  2. 一个简单的登录界面设计
  3. Python爬虫 —— 以北京天气数据爬取为例
  4. python 协程库_python 协程库gevent学习--源码学习(一)
  5. Dweb:使用WebRTC / WebTorrent构建弹性Web
  6. 一文带您了解亚细胞定位(Subcellular Localization)
  7. 精选汇总 | 科普知识
  8. ARM 开发板嵌入式linux系统与主机PC通过串口传输文件
  9. Express Pi 嵌入式开发板
  10. 使用 vue-direction-key 快速切换 input 的焦点 focus