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

您所在的位置:网站首页 豆瓣书评怎么看评分 用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值

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

2024-07-02 00:28| 来源: 网络整理| 查看: 265

 这个爬虫小项目是中国大学MOOC的“用Python玩转数据”课程的一个课后作业,由南京大学张莉老师主讲,有兴趣的同学可以看一看。

虽然老师已经给出了参考代码,但由于豆瓣读书网站已经改版,参考代码中的爬取方法已经不可用,所以我将源代码稍作修改,并使之模块化,增强代码的可复用性。

爬取思路如下:

首先我们打开豆瓣读书的任何一本书的书评页,这里以《Python编程 从入门到实践(第2版)》为例。

 在页面空白处右击鼠标选择“检查”查看网页的HTML代码(我用的是Edge浏览器,其他浏览器的操作方法也应该相似),点击左上角的箭头按钮,可以查看页面中模块对应的代码位置,如下图所示:

 我们可以看到,每一条书评都放在一个列表模块中,书评的内容嵌套在模块中,class属性是“short”,相应的,评分(star)也放在模块中,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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3