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

Scrapy任务异常结束后如何重新运行及处理错误URL

Scrapy重爬亚马逊错误URL的可行方案

不需要编写复杂的独立脚本,通过修改现有爬虫逻辑或简单辅助脚本就能实现,下面是两种实用方案:

方案1:直接修改现有爬虫,读取错误文件启动请求

在你的爬虫代码里加入读取错误文件的逻辑,启动时优先处理失败的URL,处理完后归档错误文件避免重复爬取。

示例爬虫代码(amazon_spider.py):

import os
import scrapy

class AmazonSpider(scrapy.Spider):
    name = 'amazon'
    error_file_path = 'error_urls.txt'
    main_data_file = 'main_file.csv'

    def start_requests(self):
        # 优先处理错误URL
        if os.path.exists(self.error_file_path):
            with open(self.error_file_path, 'r', encoding='utf-8') as f:
                lines = f.readlines()
                # 跳过第一行的"URL"表头
                for line in lines[1:]:
                    url = line.strip()
                    if url:
                        yield scrapy.Request(
                            url=url,
                            callback=self.parse,
                            meta={'is_retry': True}  # 标记为重爬请求,方便后续区分处理
                        )
            # 处理完成后归档错误文件,防止重复爬取
            os.rename(self.error_file_path, f'{self.error_file_path}_processed_{int(time.time())}')
        # 无错误文件时,按原逻辑从主文件读取数据
        else:
            with open(self.main_data_file, 'r', encoding='utf-8') as f:
                next(f)  # 跳过表头
                for line in f:
                    cols = line.strip().split(',')
                    main_link = cols[2]
                    yield scrapy.Request(url=main_link, callback=self.parse)

    def parse(self, response):
        # 保留你原有的解析逻辑
        try:
            # 解析商品数据的代码...
            pass
        except Exception as e:
            # 重爬失败时,重新写入错误文件(自动添加表头)
            with open(self.error_file_path, 'a', encoding='utf-8') as f:
                if os.path.getsize(self.error_file_path) == 0:
                    f.write('URL\n')
                f.write(f'{response.url}\n')

方案2:编写轻量启动脚本(不修改原爬虫)

如果不想改动原有爬虫,可以写个简单脚本读取错误文件,把URL作为参数传给爬虫。

1. 编写启动脚本(retry_crawl.py)

import os
import subprocess
import time

error_file = 'error_urls.txt'
if os.path.exists(error_file):
    with open(error_file, 'r', encoding='utf-8') as f:
        # 提取有效URL,跳过表头
        retry_urls = [line.strip() for line in f.readlines()[1:] if line.strip()]
    # 把URL列表作为参数传给爬虫
    cmd = ['scrapy', 'crawl', 'amazon', '-a', f'retry_urls={",".join(retry_urls)}']
    subprocess.run(cmd)
    # 归档错误文件
    os.rename(error_file, f'{error_file}_processed_{int(time.time())}')
else:
    print('没有需要重爬的错误URL')

2. 修改原爬虫接收参数

class AmazonSpider(scrapy.Spider):
    name = 'amazon'

    def __init__(self, retry_urls=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.retry_urls = retry_urls.split(',') if retry_urls else []

    def start_requests(self):
        # 优先处理重爬URL
        if self.retry_urls:
            for url in self.retry_urls:
                yield scrapy.Request(url=url, callback=self.parse, meta={'is_retry': True})
        # 原逻辑:读取主文件
        else:
            with open('main_file.csv', 'r', encoding='utf-8') as f:
                next(f)
                for line in f:
                    cols = line.strip().split(',')
                    main_link = cols[2]
                    yield scrapy.Request(url=main_link, callback=self.parse)

关键注意事项

  • 避免再次被拦截:在settings.py里增加延迟、配置多User-Agent或使用代理
DOWNLOAD_DELAY = 3  # 每次请求间隔3秒
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'
# 或者使用User-Agent中间件轮换UA
RETRY_ENABLED = True
RETRY_TIMES = 3  # 单个请求重试3次
RETRY_HTTP_CODES = [500, 502, 503, 403, 429]  # 指定需要重试的状态码
  • 错误文件处理:每次重爬完成后一定要归档或删除,避免重复处理相同URL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:27:26