You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:35:08