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
相关产品推荐
相关产品推荐

