Scrapy爬虫未调用callback函数问题求助
解决Scrapy爬虫Callback未被调用的问题
我来帮你排查下这个问题哈,你遇到的parse_screener没被触发的情况,大概率是Rule里的LinkExtractor匹配规则出了问题,咱们一步步来解决:
核心问题:正则匹配规则错误
你代码里的正则用了&,但这是HTML转义后的字符,Scrapy在解析页面链接时,会把页面里的&转换成实际的&,所以用&根本匹配不到真实的链接。另外,写完整URL的正则也容易出问题,不如直接匹配相对路径更稳妥。
修改后的代码
from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class ScreenerSpider(CrawlSpider): name = 'screener' allowed_domains = ['finviz.com'] start_urls = ['https://finviz.com/screener.ashx'] rules = [ # 修正正则:用&代替&,匹配相对路径,r参数支持1位或多位数字 Rule(LinkExtractor(allow=r'/screener\.ashx\?v=111&r=\d+'), callback='parse_screener', follow=True) ] def parse_screener(self, response): # 先加个调试输出,确认函数是否被调用 print(f"✅ 成功进入parse_screener,当前处理URL: {response.url}") # 在这里编写你的数据解析逻辑 pass
额外排查点
如果修改后还是没触发callback,可以试试这些方法:
- 调试LinkExtractor:打开Scrapy Shell,输入
scrapy shell https://finviz.com/screener.ashx,然后执行以下代码,看看是否能提取到目标链接:
如果输出为空,说明页面里的链接不符合规则,需要检查页面源码里的链接格式。from scrapy.linkextractors import LinkExtractor le = LinkExtractor(allow=r'/screener\.ashx\?v=111&r=\d+') links = le.extract_links(response) print([link.url for link in links]) - 检查动态内容:如果页面里的链接是JavaScript动态生成的,LinkExtractor默认无法提取,这时候需要用Splash或Playwright来处理动态渲染的页面。
- 开启调试日志:在Scrapy的
settings.py里设置LOG_LEVEL='DEBUG',运行爬虫后查看日志,看看Scrapy有没有提取到链接,或者有没有其他报错信息。
内容的提问来源于stack exchange,提问作者Elgin Cahangirov
相关产品推荐
相关产品推荐

