用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 BeautifulSoup
    import re
    import time
    count = 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)字符串组成新的URL
            r = requests.get(url_n,headers=header) #调用requests的get()方法获取页面信息
            soup = BeautifulSoup(r.text, 'lxml') #以'xml'格式解析r.text
            comments = 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=100
    num=80
    getInfo(url, n) #调用getInfo函数获取前n条书评和评分,因为有些书评可能没有评分,所以评分数可能少于书评数
    showRst(num) #showRst函数显示前num条书评和评分的平均值
    

代码中用到正则表达式来匹配字符串,下面是常用的正则表达式:

 爬取结果如下:

 Life is short, I use Python.

%左右%
关注 关注
  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
网络虫之豆瓣评论、原文摘要抓
菜鸡的博客
04-29 2074
相信很多观众老爷们喜欢耍豆瓣啥的,看看书,喝喝茶的(ps:拉倒吧),哈哈哈,经过10800秒的研究,我分析了豆瓣图书的结构,发现在不登录的情况下,短评论只能220条的数据,但是!!!注意!!!! 长评论是没有限制的啊,那还不用力抓???原文摘录和读书笔记都是没有限制额,还不抓???安排 ...
【学习记录】Scrapy框架豆瓣图书短评数据,并存储成Excel,TXT(增加xpath处理方法)。
weixin_45645036的博客
07-31 1481
运用scrapy的知识,豆瓣图书TOP2502页的书籍(50本)的短评数据(包括书名、评论ID、短评内容),并存储成Excel。 网址链接:https://book.douban.com/top250 (虫精进14) Windows 10 系统,Python 3.7 分析网页代码 多往后翻几页发现规律已经有了: "https://book.douban.com/top250?start=" + “0” , “25” , "50……" 用 for…in range() 循环可以得到全部网址,我们只
使用Python豆瓣top250
最新发布
ChinaBILI6的博客
05-13 6057
Python虫 文章目录Python虫@[toc]1)任务介绍2)虫知识3)基本流程3.1) 准备工作3.2)获数据3.3)解析内容3.4)保存数据 1)任务介绍 需求分析 豆瓣电影Top250的基本信息,包括电影的名称、豆瓣评分、评价数、电影概况、电影链接等。 链接:https://movie.douban.com/top250 2)虫知识 什么是虫 网络虫,是一种按照一定规则,自动抓互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓
Scrapy+Selenium关键字豆瓣书评
姬小野的博客
06-27 1339
文章目录思路1. 根据关键字构造豆瓣搜索url, 根据结果获书的id2. 根据id, 构造该书评论的url链接3. 网页内容, 并构造下一页url4. 重复步骤3, 反复过程1. 页面测试2. 使用selenium工具获id3. 将selenium集成到scrapy中4. 结果5. 阶段性spider代码ip异常问题1. 给selenium添加代理2. 给scrapy添加代理3...
豆瓣图书并进行评论的特征提
Phoebus2617的博客
04-23 1614
1.运用python和数据库的持久化存储 2.学会TF-IDF方法进行特征提 一、scrapy虫框架介绍 · Scrapy是用纯Python实现一个为了网站数据、提结构性数据而编写的应用框架,用途非常广泛 · 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个虫,用来抓网页内容以及各种图片,非常之方便 制作 Scrapy 虫 一共需要4步: 1.新建项目 (scrapy startproject xxx):新建一个新的虫项目 2.明确目标 (编写items.py):明确
python--虫】豆瓣读书用户评分
qq_43017750的博客
03-07 3419
豆瓣读书用户评分虫 最近有好友不会做豆瓣读书的评论和评分虫求助博主,博主做完后发给了该好友,本着造福小白的心理,博主在这里给大家分享自己写的豆瓣虫。 1.分析网页 这里我们先随便打开一本书的评论 (https://book.douban.com/subject/30442488/comments/) 在页面源代码中查找评论的位置,在class属性为&amp;quot;short&amp;quot;的&amp;amp;lt;span&amp;amp;gt;标.
Python豆瓣网图书评
weixin_30907935的博客
04-21 1606
准备工作 1、进入豆瓣网图书频道:https://book.douban.com 2、寻找感兴趣的图书,进入其页面并查看该图书的评论 3、分析评论数据URL地址特性,得到其共有部分为:https://book.douban.com/subject/book_id/comments?   其中book_id为图书在网页地址栏中的编号 编码实现虫 # 获HTML页面 def ge...
python豆瓣书评实战——初级
hu_wei123的博客
05-10 2169
豆瓣最受欢迎的书评网址:https://book.douban.com/review/best/ import requests import csv from pyquery import PyQuery as pq import io import sys # 改变标准输出的默认编码 sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8') # 请求headers处理,伪装成浏览器,防止反虫问题 headers = {.
Python3虫新手项目详解:豆瓣读书的50条评论内容并显示评分。提示:有的评论不包含评分
mmprintf的博客
08-10 4033
《三体》,相关网页内容如下: https://book.douban.com/subject/2567698/comments/hot?p=1 开始之我们先明确一下虫的基本步骤: 抓 urllib内建模块 urllib.request requests第三方库(中小型) scrapy框架(大型) 解析 BeautifulSoup库 re模块 这次我们就用到...
Python豆瓣top250电影数据,并导入MySQL,写入excel
12-21
Python豆瓣top250电影数据,并导入MySQL,写入excel 具体数据:电影链接、电影名称、电影评分评分人数、电影概括 import pymysql import xlwt from bs4 import BeautifulSoup from urllib import request ...
python豆瓣top250并下载图片
10-03
根据b站学习视频一步步做到这里,代码作用,豆瓣top250,信息导入到excel表内,并且下载图片,刚入门,仅供参考
Python-豆瓣读书的
08-10
Python所写,豆瓣读书的虫,方便大家搜罗各种美美书!
Python豆瓣电影分类排行榜(保存至本地)
08-08
Python 豆瓣电影分类排行榜并保存到本地excel文件 作者博客:https://blog.csdn.net/weixin_52132159 文章链接:https://blog.csdn.net/weixin_52132159/article/details/119505289
Python豆瓣视频信息代码实例
09-18
主要介绍了Python豆瓣视频信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Python豆瓣电影评分Top250
09-26
Python豆瓣电影评分Top250(内附源码地址与效果图),通过可视化分析得到豆瓣评分Top250平均评分最高的电影类别),通过Python使用BeautifulSoup库豆瓣电影网址,url地址:豆瓣电影 Top 250 (douban.com) 。...
Python学习记录】虫笔记2——豆瓣评论
SinceNov
07-08 506
程序是某一特定的作品的指定页码区间内的用户名称、用户评论、赞同数、和评论时间的。 本来想写根据输入作品的名称然后指定区间内的信息,然后失败了,没有弄清楚为什么根据作品名搜索之后,下来的html代码只显示部, 如图所示该标签的root部分的信息是没有的。。我尝试了在请求头加入登陆之后的cookies之后依然无法获该部分信息,想了想有点头疼…还是先放着吧,哪一天明白原理了再去深究好了。。...
使用Python编写网络虫提网络书评网站的读者评论和评分
2201_76125393的博客
07-19 117
网络虫是一种自动化程序,它可以浏览互联网并收集特定网页上的信息。在本篇博客中,我们将使用Python编写一个网络虫,来提网络书评网站上的读者评论和评分。我们将使用Python的一些强大的库来实现这一目标,包括requests和。本篇博客介绍了如何使用Python编写网络虫来提网络书评网站上的读者评论和评分。我们使用了requests库来发送HTTP请求并获网页内容,使用库来解析HTML文档并提所需的数据。
通过Python虫获【小说网站】数据,保姆级教学
红目香薰
01-12 4656
通过Python虫获【小说网站】数据,保姆级教学
python实例:自动豆瓣读书短评,分析短评内容
dengjieai3347的博客
08-31 1443
思路: 1、打开书本“更多”短评,复制链接 2、脚本分析链接,通过获短评数,计算出页码数 3、通过页码数,循环当页短评 4、短评写入到txt文本 5、读txt文本,处理文本,输出出现频率最高的词组(X)----通过分析得到其他结果可自由发散 用到的库: lxml 、re、jieba、time 整个脚本如下 # -*-coding:utf8-*- # en...
3.在豆瓣网上某本书的50条短评内容并计算评分平均值(自学正则表达式)
05-16
这里提供一个Python的实现,需要使用requests和re两个库: ```python import requests import re # 目标书籍在豆瓣的ID book_id = '1084336' # 请求的URL url = f'https://book.douban.com/subject/{book_id}/comments/' # 发送请求 response = requests.get(url) # 使用正则表达式匹配评分和短评内容 pattern = '<span class="user-stars allstar(.*?) rating" title=".*?"></span>.*?<span class="short">(.*?)</span>' result = re.findall(pattern, response.text, re.S) # 计算评分平均值 total_score = 0 for item in result[:50]: score, comment = item total_score += int(score) average_score = total_score / len(result[:50]) print(f"评分平均值为:{average_score}") ``` 需要注意的是,豆瓣网的反虫机制比较严格,如果请求过于频繁可能会被封IP,建议加上适当的延时或使用代理IP。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值 2331
  • 解决python “[WinError 193] %1 不是有效的 Win32 应用程序”的一个简单办法 1939

最新评论

  • 用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值

    2301_81689808: 加1,没有任何反应

  • 用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值

    青山L: 作者大大,为什么我复制你的代码不报错,但是没出结果

  • 用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值

    Lucifer765: 差点错过一篇写得这么好的博客,讲得好详细,或许可以考虑一下把南大课程习题都讲一遍吗呜呜

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 解决python “[WinError 193] %1 不是有效的 Win32 应用程序”的一个简单办法
2021年2篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

%左右%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源通话录音googleearth在线工厂起名免费网月嫂中心起名麻辣江湖职业江西省国土资源厅smba一起赚钱的群名火命的人公司起名字功夫不负有心人作文400字睿字男孩起名测五行的起名龙凤胎 怎么起名八字缺金起什么名称姓猴起名废旧物资回收公司起名大全起名 亦字奇迹少女小鸠鱼姓起名hitwh提醒软件公司免费起名测试打分结果起名使用的字典女孩起名姓史可爱的卡通qq头像豪放派诗词狗起什么英文名字好听他的小祖宗恃宠生娇了店铺起名名字打分生活态度淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化