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

Scrapy爬虫抓取数据量不足及实现无限循环运行相关问题咨询

问题1:爬虫无法抓取全部法术数据的解决方法
  • 首先修复代码中的显性错误:你当前parse_spell方法中,zip遍历得到的变量名为name/level/components/resistance,但yield Spell时使用的是未定义的spell_name/spell_level等变量,如果没有在省略的逻辑中做变量赋值,会直接抛出NameError,导致对应请求的数据直接丢失,这是数据量缺失的核心原因之一,直接将yield部分的变量名和遍历得到的变量名对齐即可。
  • 修复XPath匹配逻辑错误:你在article节点下使用//开头的XPath是全局匹配而非相对当前节点匹配,会导致拿到页面中其他位置的内容,引发后续正则匹配失败,将对应XPath改为相对路径即可:
# 原来的写法
contents = article.xpath('//div[has-class("article-content")]')
all_names = article.xpath("h1/text()").getall()
# 修改为相对路径
contents = article.xpath('.//div[has-class("article-content")]')
all_names = article.xpath('./h1/text()').getall()
  • 避免zip截断数据:正则匹配得到的四个列表all_names/all_levels/all_components/all_resistances如果长度不一致,zip会以最短的列表长度为准,导致长列表中的多余数据被丢弃,添加长度校验逻辑,长度不一致时打印当前页面URL单独排查即可。
  • 调整Scrapy配置规避站点限流:在项目的settings.py中添加以下配置,避免并发过高被站点拦截:
# 替换默认UA,避免被站点识别为爬虫
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
# 降低并发数
CONCURRENT_REQUESTS = 2
CONCURRENT_REQUESTS_PER_DOMAIN = 2
# 添加请求间隔,单位为秒
DOWNLOAD_DELAY = 1
# 开启重试机制,增加重试次数
RETRY_ENABLED = True
RETRY_TIMES = 5
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]
  • 开启DEBUG日志排查丢失请求:运行爬虫时添加参数scrapy crawl Pathfinder2 -O XXX.json --logfile=scrapy.log --loglevel=DEBUG,可以在日志中查看所有被丢弃的请求的具体原因,包括被去重、域名不在允许列表、重试失败等情况。
问题2:实现爬虫无限循环运行的方法

支持添加等待时长实现无限循环,推荐两种实现方案:

  • 外部脚本调度(更稳定,推荐):写shell或者Python脚本循环执行爬虫命令,示例shell脚本如下:
#!/bin/bash
while true
do
    scrapy crawl Pathfinder2 -O XXX.json
    sleep 86400 # 等待时长,单位为秒,此处为间隔1天重跑一次,可自行调整
done
  • 爬虫内部实现循环:通过监听爬虫关闭信号,等待指定时间后重启爬虫,示例代码如下:
import time
from scrapy import signals
from twisted.internet import reactor

class Pathfinder2Spider(scrapy.Spider):
    # 此处保留你原有爬虫的所有代码
    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super().from_crawler(crawler, *args, **kwargs)
        crawler.signals.connect(spider.restart_spider, signal=signals.spider_closed)
        return spider

    def restart_spider(self):
        # 等待指定时长后重启爬虫,单位为秒
        time.sleep(86400)
        reactor.callLater(0, self.crawler.engine.start)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:27:00