我的Scrapy爬虫未抓取到数据,请求帮忙排查问题
问题分析与修复方案
从你提供的Scrapy运行日志和代码来看,爬虫未抓取到任何数据的核心原因如下:
1. 静态time.sleep完全无效
你在类定义中直接写入time.sleep(0.5),这行代码只会在爬虫类加载阶段执行一次,不会在请求过程中起到延迟作用。Scrapy是异步框架,这种同步sleep方式完全不适用,要实现请求限流,应该在settings.py中配置DOWNLOAD_DELAY。
2. XPath选择器过于脆弱且存在结构匹配错误
你的LinkExtractor依赖精确的style属性值和表格索引,一旦网站前端样式微调(比如style里的空格、表格顺序变动),选择器就会失效。另外,浏览器调试时看到的tbody标签大多是浏览器自动补全的,Scrapy获取的原始HTML中可能不存在该标签,直接使用会导致路径断裂,无法定位到目标链接。
3. 未验证响应内容与页面实际结构是否匹配
虽然日志显示请求返回200状态码,但你需要确认Scrapy获取的响应内容是否和浏览器中看到的一致——部分网站会通过反爬策略返回空内容或伪装页面,这时候需要打印response.text来验证实际返回的HTML结构。
修复后的代码示例
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class SoccerstatsSpider(CrawlSpider): name = 'soccerstats' allowed_domains = ['soccerstats.com'] start_urls =['https://www.soccerstats.com/latest.asp?league=turkey'] # 改用更健壮的CSS选择器,避免依赖精确属性和tbody标签 rules = ( Rule(LinkExtractor(restrict_css="div[style*='width:644px'] table tr.odd td:nth-child(2) a"), callback='parse_item', follow=True), ) def parse_item(self, response): # 简化Team选择器,增加容错性 team_name = response.xpath(".//div[@id='content']//font/text()").get() if team_name: yield{ 'Team' : team_name.strip() }
额外配置建议(修改settings.py)
# 启用下载延迟,替代无效的time.sleep DOWNLOAD_DELAY = 1 # 确保User-Agent正确生效 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' # 禁用Cookies,避免部分反爬拦截 COOKIES_ENABLED = False
内容的提问来源于stack exchange,提问作者erenA
相关产品推荐
相关产品推荐

