Scrapy使用LinkExtractor规则无法抓取元素,响应有数据却输出None该如何解决
问题排查及修复方案
错误点梳理
- Rule规则中
restrict_xpaths参数使用了HTML转义字符"代替实际引号,导致链接提取器无法正确匹配到详情页链接,parse_item回调根本没有被触发 set_user_agent方法参数错误,process_request钩子仅接收request和spider两个参数,多余的response参数会触发调用报错start_requests中请求头键名错误,标准头字段名是User-Agent而非User_Agent- 地址提取使用了绝对路径XPath,稳定性极差,页面任意层级的DOM变动都会导致匹配失败返回None
- 缺少反爬校验步骤,无法确认返回的页面内容和浏览器中看到的是否一致,不能排除动态渲染或者反爬返回异常页面的情况
修正后的完整代码
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class MobilesSpider(CrawlSpider): name = 'mobiles' allowed_domains = ['www.vcsdata.com'] user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36' def set_user_agent(self, request, spider): request.headers['User-Agent'] = self.user_agent return request def start_requests(self): yield scrapy.Request( url='https://www.vcsdata.com/companies_gurgaon.html', headers={'User-Agent': self.user_agent} ) rules = ( Rule( LinkExtractor(restrict_xpaths='//div/a[@class="text-dark"]'), callback='parse_item', follow=True, process_request='set_user_agent' ), ) def parse_item(self, response): # 调试时可先打印响应文本前1000个字符确认页面内容正常 # print(response.text[:1000]) # 改用特征匹配的稳定XPath提取地址 address = response.xpath('//*[contains(text(),"Address")]/following-sibling::h6/text()').get() yield { 'url': response.url, 'address': address.strip() if address else None }
额外调试建议
- 运行时添加
-s LOG_LEVEL=DEBUG参数查看Scrapy日志,确认链接是否被正常提取、请求是否返回200状态码 - 如果依然返回None,可以先保存当前页面的响应内容到本地文件,和浏览器端的页面结构做对比,确认是否存在反爬校验
内容的提问来源于stack exchange,提问作者Iswar Chand
相关产品推荐
相关产品推荐

