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

Scrapy 2.5.1运行CrawlSpider导出JSON文件为空问题求助

Scrapy爬虫输出空JSON排查方案

你的爬虫能正常发起请求、拿到200响应,但没有输出任何Item,核心是3个代码逻辑问题,和Scrapy 2.5.1版本本身无关:

  • 规则匹配范围错误
    你当前写的LinkExtractor(allow = r'category/stories-arcs-')规则,只会匹配URL路径中带category/stories-arcs-的分类列表页,真正包含小说章节标题、标签内容的详情页URL格式类似/arc-1-gestation/1-01/,路径中没有你写的匹配串,根本不会触发parse_item回调,自然没有数据输出。
  • XPath取值逻辑错误
    你写的/text()只会取当前节点的直接子文本,目标站点的h1.entry-title、span.tag-links节点内的文本是嵌套在子标签里的,直接取直接子文本会拿到空值。
  • 页面关闭阈值设置不合理
    你设置的CLOSESPIDER_PAGECOUNT=10阈值太小,CrawlSpider启动后会先批量把首页提取到的链接加入队列,触发关闭阈值时队列里的待爬请求仍会执行,但这些请求里大部分是分类列表页,还没爬到足够的详情页就会结束。

可直接复用的修复代码

修正Rule规则

把分类列表页和详情页的规则分开,列表页只做链接跟进,详情页触发数据解析:

rules = (
    # 分类列表页:仅跟进链接,不解析数据
    Rule(LinkExtractor(allow=r'category/stories-arcs-'), follow=True),
    # 章节详情页:匹配带/数字-数字/格式的章节URL,触发解析回调,无需继续跟进
    Rule(LinkExtractor(allow=r'/\d+-\d+(?:/)?$'), callback='parse_item', follow=False),
)

修正XPath取值逻辑

把/text()改成//text()获取节点下所有嵌套文本,单值字段用get()取单个结果,多值标签字段保留getall(),同时做简单的空值和空白字符处理:

def parse_item(self, response):
    yield {
        'Arco': response.xpath('//h1[@class="entry-title"]//text()').get('').strip(),
        'tags': [tag.strip() for tag in response.xpath('//span[@class="tag-links"]//text()').getall() if tag.strip()]
    }

验证方式

修改后重新执行scrapy crawl Worm -O Testeo.json,观察终端日志,如果出现[scrapy.core.scraper] DEBUG: Scraped from <200 xxx章节url>的日志行,就说明回调正常触发,JSON文件会正常写入数据。调试阶段可以先把CLOSESPIDER_PAGECOUNT配置注释掉,等确认能正常抓数据后再按需设置爬取上限。

注意:使用CrawlSpider时不要自定义名为parse的方法,会覆盖框架原生的规则匹配逻辑,导致所有规则失效。

内容的提问来源于stack exchange,提问作者Nicolas Blanco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:57:10