You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬虫无法遍历分页:仅爬取第一页问题排查

问题分析与解决

核心问题1:allowed_domains配置错误

你的allowed_domains填写了带https://的完整URL,Scrapy要求此处仅填写纯域名,带协议的格式会导致后续请求被判定为跨域,直接被过滤。

修复代码:

allowed_domains = ["ilibrary.ru"]

核心问题2:CSS选择器与URL拼接的冗余问题

  • CSS选择器[title='Дальше'] ::attr(href)中,属性选择器和::attr之间的空格会导致匹配失败,需去掉空格;
  • response.follow本身支持直接传入相对URL,无需手动拼接完整域名,冗余拼接可能引发URL格式错误。

修复这部分代码:

next_chapter = response.css("[title='Дальше']::attr(href)").get()
if next_chapter is not None:
    yield response.follow(next_chapter, callback=self.parse)

额外验证步骤

  1. 用Scrapy Shell测试选择器:运行scrapy shell https://ilibrary.ru/text/94/p.1,执行response.css("[title='Дальше']::attr(href)").get(),确认能否获取到有效相对URL;
  2. 查看日志:运行爬虫时添加--logfile scrapy.log,若出现Filtered offsite request to 'ilibrary.ru'提示,说明域名配置问题确实存在。

完整修复后的代码

import scrapy
from urllib.parse import urlsplit

class Litspider2Spider(scrapy.Spider):
    name = "litspider2"
    allowed_domains = ["ilibrary.ru"]
    start_urls = ["https://ilibrary.ru/text/94/p.1"]

    def parse(self, response):            
        yield {
            "url" : urlsplit(response.url)[2],
            "teil" : response.xpath("//h2/text()").get(),
            "kapitell" : response.xpath("//h3/text()").get(),
            "text" : " ".join(response.css("span.p::text").getall()).strip("', ").replace("\x97", "—")
        }
            
        next_chapter = response.css("[title='Дальше']::attr(href)").get()
        if next_chapter is not None:
            yield response.follow(next_chapter, callback=self.parse)

内容的提问来源于stack exchange,提问作者Фома Ф

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:52:36