Python中使用Scrapy爬取豆瓣读书时,如何解决无法多页面爬取的问题?
初学 Python ,在用 scrapy 来爬取豆瓣读书练习。目前爬取单页面的书籍没有问题
在用 scrapy 提供的 Rule 和 LinkExtractor 模块练习爬取多页面的时候,始终无法获取的到下一页的结果,折腾一天无解
爬虫主要代码在下面,请各位给看看问题所在,感谢!
https://gist.github.com/loricheung/b51503a835aa8b8af238b99a4104fb21 <button onclick="lazyGist(this)"> 显示 Gist 代码 </button>
Python中使用Scrapy爬取豆瓣读书时,如何解决无法多页面爬取的问题?
10 回复
return book --> yield book
遇到Scrapy爬豆瓣读书只能抓一页的问题,通常是分页逻辑没处理好。核心在于正确提取下一页链接并交给Scrapy跟进。
下面是一个可运行的示例,重点在parse方法里的分页处理:
import scrapy
from urllib.parse import urljoin
class DoubanBookSpider(scrapy.Spider):
name = 'douban_book'
allowed_domains = ['book.douban.com']
start_urls = ['https://book.douban.com/tag/小说']
def parse(self, response):
# 1. 提取当前页的书籍信息
books = response.css('ul.subject-list li.subject-item')
for book in books:
item = {
'title': book.css('h2 a::attr(title)').get(),
'link': book.css('h2 a::attr(href)').get(),
'rating': book.css('span.rating_nums::text').get(),
}
yield item
# 2. 关键:提取下一页链接
next_page = response.css('span.next a::attr(href)').get()
if next_page:
# 豆瓣用的是相对路径,需要拼接完整URL
next_url = urljoin(response.url, next_page)
yield scrapy.Request(next_url, callback=self.parse)
常见问题排查点:
- 检查CSS选择器是否正确匹配到“下一页”链接(豆瓣的下一页通常在
span.next > a里) - 确保用
urljoin处理相对路径 - 确认目标网站没有反爬机制阻止翻页(可尝试添加
headers和DOWNLOAD_DELAY)
一句话建议: 重点检查分页链接提取逻辑和URL拼接是否正确。
LinkExtractor 的正则写错了 r’/tag/小说?start=\d+’
return 也可以
不知道你这是不是 Python2 可能要加 u ur’/tag/小说?start=\d+’
你没有加翻页功能吧,加上翻页判断。
使用的 Python3 ,正则表达式我测试过,可正确检测到对应的链接文本
scrapy 框架已经帮做了这个事情
问题出在 rules 上, callback 随便重新写个函数,不用覆盖 parse 就行了
确实是这个问题。很奇怪,我在开始使用 Rule 来爬取多页的时候,就把 callback 函数重写了,但是当时也是只能只能爬取单个页面……

