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)

常见问题排查点:

  1. 检查CSS选择器是否正确匹配到“下一页”链接(豆瓣的下一页通常在span.next > a里)
  2. 确保用urljoin处理相对路径
  3. 确认目标网站没有反爬机制阻止翻页(可尝试添加headersDOWNLOAD_DELAY

一句话建议: 重点检查分页链接提取逻辑和URL拼接是否正确。

LinkExtractor 的正则写错了 r’/tag/小说?start=\d+’

return 也可以

不知道你这是不是 Python2 可能要加 u ur’/tag/小说?start=\d+’

你没有加翻页功能吧,加上翻页判断。

使用的 Python3 ,正则表达式我测试过,可正确检测到对应的链接文本

scrapy 框架已经帮做了这个事情

问题出在 rules 上, callback 随便重新写个函数,不用覆盖 parse 就行了

确实是这个问题。很奇怪,我在开始使用 Rule 来爬取多页的时候,就把 callback 函数重写了,但是当时也是只能只能爬取单个页面……

回到顶部