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)
额外验证步骤
- 用Scrapy Shell测试选择器:运行
scrapy shell https://ilibrary.ru/text/94/p.1,执行response.css("[title='Дальше']::attr(href)").get(),确认能否获取到有效相对URL; - 查看日志:运行爬虫时添加
--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,提问作者Фома Ф
相关产品推荐
相关产品推荐

