Scrapy中Response.follow无法跟进链接返回空结果的问题
解决思路
1. 先验证parse函数是否能抓取到目标链接
在parse函数里添加打印逻辑,确认选择器是否真的拿到了有效链接:
def parse(self, response): print(response.url) # 一次性获取所有链接并打印 links = response.css('.collection-link::attr(href)').getall() print(f"抓取到的链接数量:{len(links)}") print(f"具体链接:{links}") for link in links: yield response.follow(link, callback=self.parse_remedios)
如果打印结果是空列表,说明.collection-link::attr(href)这个选择器在起始页面里根本找不到对应元素,自然不会触发后续的回调函数。
2. 检查follow的链接有效性
有些网站的href可能是相对路径、空值、锚点(#)或者JavaScript伪链接,response.follow会自动忽略无效请求。要确认打印出的每个链接都是指向商品详情页的有效URL。
3. 查看Scrapy日志排查请求状态
运行爬虫时开启日志记录(比如执行scrapy crawl remedios --logfile=spider.log),查看日志里是否有parse_remedios对应的请求记录:
- 如果没有请求记录:说明选择器没抓到链接,或者链接被过滤
- 如果有请求但状态码异常(比如404、503、302):可能是链接无效,或者请求被网站反爬拦截
4. 核对allowed_domains配置
如果follow的链接域名不在allowed_domains列表里,Scrapy会自动过滤该请求。确认抓取到的链接域名完全匹配www.drogariaspachecopacheco.com.br,如果存在子域名差异,需要更新allowed_domains。
5. 添加浏览器请求头避免反爬拦截
很多网站会识别Scrapy默认的User-Agent并拦截请求,可以在settings.py里配置:
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'
或者在follow请求里单独设置headers:
yield response.follow(link, callback=self.parse_remedios, headers={'User-Agent': '你的浏览器UA'})
6. 验证回调页面的结构是否匹配选择器
即使直接用parse_remedios做主解析能拿到数据,也不代表follow跳转后的页面结构完全一致。可以在parse_remedios里先打印页面开头内容,确认页面是否正常加载:
def parse_remedios(self, response): # 打印页面前500个字符,确认内容是否正确 print(response.text[:500]) resultado = response.css('.container-fluid') yield { 'nome' : resultado.css('.productName::text').get(), 'preco' : resultado.css('.skuBestPrice::text').get() , 'link' : response.url, 'sku' : resultado.css('.skuReference::text').get() }
内容的提问来源于stack exchange,提问作者Plinio Leal
相关产品推荐
相关产品推荐

