2.Request爬取豆瓣短评

本文介绍了Python的Requests库,包括其安装方法、主要功能及使用技巧,通过实例展示了如何利用Requests库爬取网页数据,并遵循网络爬虫的基本规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Requests爬取豆瓣短评
Python爬虫(入门+进阶) DC学院

本节课程的内容是介绍什么是Requests库、如何安装Requests库以及如何使用Requests库进行实际运用。

Requests库介绍:
Requests库官方的介绍有这么一句话:Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
这句话直接并霸气地宣示了Requests库是python最好的一个HTTP库。
为什么它有这样的底气?请阅读Requests官方文档。

如何安装Requests:
这里介绍两种常用的python安装第三方库的方法,建议大家首先使用第一种方法,如果使用第一种方法安装库的时候出现错误,或者使用第一种方法下载速度过慢,再使用第二种方法。

第一种方法:pip安装

打开cmd命令行,输入pip install requests
 Alt text
   出现Successfully installed,即表示成功安装。

然后进入python,输入:
import requests
   没有报错的话即表示可以使用requests库了。

阅读pyhton之pip常用命令,了解如何使用python安装三方库之利器 —– pip 的使用方法。
第二种方法:下载包再安装

前往http://www.lfd.uci.edu/~gohlke/pythonlibs/,手动下载需要安装的第三方包(注意对应你的python版本是32位还是64位)。
然后在下载下来的文件所在目录按住shift并点击鼠标右键,选择在此处打开Powershell窗口,在此命令行中使用“pip install + 下载下来文件全名”,即可完成安装。
 Alt text
 Alt text

安装完成后同样需要进入python并import一下,确定可以正常使用。

Requests的简单用法
Requests库的七个主要方法

方法 说明
requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML网页提交删除请求,对应于HTTP的DELETE
这里我们只需要掌握最常用的requests.get()方法即可。

Requests.get的用法:

import requests #导入Requests库
r = requests.get(url) #使用get方法发送请求,返回包含网页数据的Response并存储到Response对象r中
Response对象的属性:

r.status_code:http请求的返回状态,200表示连接成功(阅读HTTP状态码,了解各状态码含义)

r.text:返回对象的文本内容

r.content:猜测返回对象的二进制形式
r.encoding:分析返回对象的编码方式
r.apparent_encoding:响应内容编码方式(备选编码方式)
以知乎为例,展示上述代码的使用:

import requests
r = requests.get(‘https://www.zhihu.com/’)
r.status_code
500

r.text #省略
r.content #省略
r.encoding
‘ISO-8859-1’

r.apparent_encoding
‘ascii’
实战环节
分析豆瓣短评网页
首先通过浏览器工具来分析网页的加载方式,回忆一下上节课提到的同步加载和异步加载的区别。只有同步加载的数据才能直接在网页源代码中直接查看到,异步加载的数据直接查看网页源代码是看不到的。
 Alt text

把JavaScript由“允许”改为“阻止”,重新刷新页面,若网页正常加载,说明该网页的加载方式是同步加载,若网页没有正常加载,说明该网页的加载方式是异步加载。

使用Requests下载数据的步骤

导入Requests库
输入url
使用get方法
打印返回文本
抛出异常
import requests #导入Requests库

url = ’ ’ #输入url
r = requests.get(url,timeout=20) #使用get方法
print(r.text) #打印返回文本
print(r.raise_for_status()) #抛出异常
爬取网页通用框架

定义函数
设置超时
异常处理
调用函数
#定义函数
def getHTMLText(url):
try:
r = requests.get(url,timeout=20) #设置超时
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except: #异常处理
return “产生异常”

if name == ‘main’:
url = " "
print(getHTMLText(url)) #调用函数
爬虫协议
什么是爬虫协议:爬虫协议,也被叫做robots协议,是为了告诉网络蜘蛛哪些页面可以抓取,哪些页面不能抓取

如何查看爬虫协议:在访问网站域名后加上robots.txt即可,例如查看百度网站的爬虫协议:https://www.baidu.com/robots.txt

爬虫协议属性:
拦截所有的机器人:
User-agent: *
Disallow: /

允许所有的机器人:
User-agent: *
Disallow:

阅读robots协议,了解更多爬虫协议属性。

爬虫建议
爬取互联网公开数据
尽量放慢你的速度
尽量遵循robots协议
不要用于商业用途
不要公布爬虫程序与数据

<think>嗯,用户想用Python动态爬取豆瓣图书的短评。动态加载的话,可能涉及到JavaScript渲染的内容,所以传统的Scrapy可能不够,得结合Selenium或者Splash。之前用户提到的引用里有Scrapy和Selenium的例子,比如引用[2]和[3]都是关于豆瓣电影评论的,用户现在需要的是图书的短评,方法应该类似,但需要调整目标URL和解析部分。 首先,要确认豆瓣图书短评页面是否动态加载。比如,有些内容可能通过AJAX请求加载,或者需要滚动页面才能显示更多评论。这时候用普通的请求可能拿不到数据,得用浏览器自动化工具,比如Selenium。用户之前的问题里提到了Scrapy和Selenium的结合,引用[3]里就是用Scrapy+Selenium来爬取电影评论的。同样的方法可以应用到图书短评上。不过需要注意豆瓣的反爬机制,比如频率限制、验证码等,可能需要设置延迟或者使用代理。然后,解析动态内容的话,可能需要等待元素出现,使用WebDriverWait。例如,等待评论加载完成后再抓取。另外,分页处理可能需要模拟点击“下一页”按钮,或者分析AJAX请求的URL参数,构造请求链接。另外,用户提到数据抓取和动态加载,可能需要检查豆瓣图书短评的接口是否有直接的API返回JSON数据,这样可以直接用requests库获取,而不用渲染整个页面。比如,通过浏览器的开发者工具查看XHR请求,找到返回评论数据的接口,然后模拟这个请求。不过,如果接口有加密参数或者需要登录,可能会比较复杂。这时候用Selenium模拟登录,然后获取cookies,再用Scrapy或requests发送请求可能更可行。 还有,需要考虑豆瓣的robots.txt是否允许爬取,以及法律合规性问题,确保遵守网站的使用条款,不过用户可能已经了解这些,所以主要解决技术问题。 总结下来,可能的步骤是:使用Selenium打开豆瓣图书页面,处理动态加载,模拟滚动或翻页,提取评论数据。或者找到AJAX接口,直接请求JSON数据。结合Scrapy中间件来处理动态内容,比如使用scrapy-selenium这样的库。代码示例方面,可能需要展示如何配置Selenium与Scrapy,或者单独使用Selenium。比如,启动浏览器,访问图书短评URL,等待评论加载,然后解析HTML元素。同时,处理翻页循环,直到获取足够的数据。另外,用户可能需要存储数据,比如保存到Item里,然后导出为CSV或数据库。这部分可以引用之前提到的Scrapy Item定义,如引用[2]中的Exp1Item,调整字段为图书相关的信息。 最后,注意事项部分要强调反爬措施,比如设置请求头、延迟,避免被封IP。还有,豆瓣可能会有登录限制,未登录用户只能看到部分评论,所以可能需要处理登录流程,或者使用已有会话的cookies。</think>### 动态爬取豆瓣图书短评的方法 #### 1. 动态加载分析 豆瓣图书短评通常通过AJAX动态加载,需模拟浏览器行为或直接调用数据接口。以下提供两种实现方案: #### 2. 方案一:Selenium动态渲染 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time driver = webdriver.Chrome() driver.get("https://book.douban.com/subject/图书ID/comments/") # 滚动加载更多评论 for _ in range(3): # 控制加载次数 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 防封禁延迟 # 解析评论元素 comments = driver.find_elements(By.CLASS_NAME, 'comment-item') for comment in comments: user = comment.find_element(By.CLASS_NAME, 'comment-info').text content = comment.find_element(By.CLASS_NAME, 'short').text print(f"用户:{user}\n评论:{content}\n") driver.quit() ``` #### 3. 方案二:Scrapy+Selenium中间件 ```python # middlewares.py from scrapy import signals from selenium import webdriver from scrapy.http import HtmlResponse class SeleniumMiddleware: def process_request(self, request, spider): driver = webdriver.Chrome() driver.get(request.url) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, 'comment-item')) ) body = driver.page_source driver.quit() return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request) # items.py import scrapy class BookCommentItem(scrapy.Item): book_title = scrapy.Field() user = scrapy.Field() rating = scrapy.Field() content = scrapy.Field() ``` #### 4. 关键注意事项 - 反爬规避:需设置随机延迟(1-3秒)、更换User-Agent - 数据存储:建议使用MongoDB处理非结构化数据 - 登录验证:部分敏感内容需处理Cookie验证[^3] - 接口分析:可通过浏览器开发者工具捕获真实数据接口 #### 5. 动态接口示例 豆瓣短评真实接口模式: $$https://book.douban.com/subject/{book_id}/comments?start={page_num}&limit=20&status=P&sort=new_score$$ 可通过修改start参数实现分页抓取[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值