Scrapy爬虫爬取0页问题:爬取StackOverflow问答页失败求助
我正在创建一个简单的Scrapy项目来深入了解它的用法,目标是爬取StackOverflow的问答页面。我的爬虫名为first,代码如下:
# -*- coding: utf-8 -*- import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class FirstSpider(CrawlSpider): name = 'first' allowed_domains = ['stackoverflow.com'] start_urls = ['https://stackoverflow.com/questions'] rules = ( Rule(LinkExt...
执行scrapy crawl first命令后出现“Crawled 0 pages”提示,请求排查原因并解决。
我的排查与解决方案
嘿,我来帮你搞定这个问题!用CrawlSpider却爬不到页面,大概率是几个常见的配置问题,咱们一个个来理清楚:
1. 你的Rules规则不完整(最可能的原因)
看你代码里的rules只写到Rule(LinkExt...就截断了,这绝对是核心问题!CrawlSpider完全靠rules来决定要跟进哪些链接、怎么解析页面——如果规则没写完,爬虫根本不知道该怎么处理起始页面的内容,自然不会爬取任何页面。
给你一个适配Stack Overflow问题列表的完整rules示例:
rules = ( # 跟进问题列表的分页链接(比如?page=2、?page=3这类) Rule(LinkExtractor(allow=r'/questions\?page=\d+'), follow=True), # 跟进具体的问题详情链接,并调用parse_item方法解析内容 Rule(LinkExtractor(allow=r'/questions/\d+/'), callback='parse_item', follow=False), )
别忘了在FirstSpider类里添加对应的解析方法:
def parse_item(self, response): # 这里写你要提取的内容逻辑,比如标题、问题描述 item = {} item['question_title'] = response.css('h1[itemprop="name"] a::text').get() item['question_content'] = response.css('div[itemprop="text"] ::text').getall() return item
2. 起始页面可能被反爬拦截
Stack Overflow会对爬虫请求做检测,如果你的请求没有模拟浏览器标识,可能会返回403禁止访问,导致爬虫拿不到页面内容。你可以先开启DEBUG日志看看请求状态:
scrapy crawl first --loglevel=DEBUG
如果日志里显示起始URL的响应状态是403,就去项目的settings.py里添加浏览器UA:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
3. 别犯CrawlSpider的低级错误
CrawlSpider有个特殊要求:不能自定义parse方法!因为它的默认parse方法已经用来处理rules的调度逻辑了,如果你自己写了parse函数,会直接覆盖掉默认行为,导致爬虫完全不按规则走。所以检查一下你的代码里有没有额外的parse方法,有的话赶紧删掉。
4. 检查allowed_domains是否正确
你的allowed_domains = ['stackoverflow.com']是没问题的,但如果后续跳转的链接属于子域名(比如xxx.stackoverflow.com),就需要把这些子域名也加进去,但Stack Overflow的问题页面都是主域名下的,这个问题可能性不大,但可以留个心眼。
按照上面的步骤调整后,再重新运行scrapy crawl first,应该就能正常爬取页面了!
内容的提问来源于stack exchange,提问作者Sam B.

