Scrapy爬虫运行中速度逐渐变慢的问题排查求助
Scrapy爬虫速度逐渐下降问题排查与优化建议
问题描述
我开发了一个Scrapy爬虫,初始运行正常,但爬取过程中速度逐渐变慢。已经配置了并发请求、download_delay:0以及AUTOTHROTTLE_ENABLED:False,但问题依旧。怀疑和缓存有关,但不确定是否需要清理缓存,也不清楚具体原因。附上爬虫代码和log_stats信息,寻求解决建议。
爬虫代码
import scrapy from scrapy.crawler import CrawlerProcess import pandas as pd import scrapy_xlsx itemList=[] class plateScraper(scrapy.Spider): name = 'scrapePlate' allowed_domains = ['dvlaregistrations.dvla.gov.uk'] FEED_EXPORTERS = {'xlsx': 'scrapy_xlsx.XlsxItemExporter'} custom_settings = {'FEED_EXPORTERS' :FEED_EXPORTERS,'FEED_FORMAT': 'xlsx','FEED_URI': 'output_r00.xlsx', 'LOG_LEVEL':'INFO','DOWNLOAD_DELAY': 0,'CONCURRENT_ITEMS':300,'CONCURRENT_REQUESTS':30,'AUTOTHROTTLE_ENABLED':False} def start_requests(self): df=pd.read_excel('data.xlsx') columnA_values=df['PLATE'] for row in columnA_values: global plate_num_xlsx plate_num_xlsx=row base_url =f"https://dvlaregistrations.dvla.gov.uk/search/results.html?search={plate_num_xlsx}&action=index&pricefrom=0&priceto=&prefixmatches=¤tmatches=&limitprefix=&limitcurrent=&limitauction=&searched=true&openoption=&language=en&prefix2=Search&super=&super_pricefrom=&super_priceto=" url=base_url yield scrapy.Request(url,callback=self.parse, cb_kwargs={'plate_num_xlsx': plate_num_xlsx}) def parse(self, response, plate_num_xlsx=None): plate = response.xpath('//div[@class="resultsstrip"]/a/text()').extract_first() price = response.xpath('//div[@class="resultsstrip"]/p/text()').extract_first() try: a = plate.replace(" ", "").strip() if plate_num_xlsx == plate.replace(" ", "").strip(): item = {"plate": plate_num_xlsx, "price": price.strip()} itemList.append(item) print(item) yield item else: item = {"plate": plate_num_xlsx, "price": "-"} itemList.append(item) print(item) yield item except: item = {"plate": plate_num_xlsx, "price": "-"} itemList.append(item) print(item) yield item process = CrawlerProcess() process.crawl(plateScraper) process.start() import winsound winsound.Beep(555,333)
Log Stats信息
{'downloader/request_bytes': 1791806, 'downloader/request_count': 3459, 'downloader/request_method_count/GET': 3459, 'downloader/response_bytes': 38304184, 'downloader/response_count': 3459, 'downloader/response_status_count/200': 3459, 'dupefilter/filtered': 6, 'elapsed_time_seconds': 3056.810985, 'feedexport/success_count/FileFeedStorage': 1, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2023, 1, 27, 22, 31, 17, 17188), 'httpcompression/response_bytes': 238767410, 'httpcompression/response_count': 3459, 'item_scraped_count': 3459, 'log_count/INFO': 61, 'log_count/WARNING': 2, 'response_received_count': 3459, 'scheduler/dequeued': 3459, 'scheduler/dequeued/memory': 3459, 'scheduler/enqueued': 3459, 'scheduler/enqueued/memory': 3459, 'start_time': datetime.datetime(2023, 1, 27, 21, 40, 20, 206203)} 2023-01-28 02:31:17 [scrapy.core.engine] INFO: Spider closed (finished) Process finished with exit code 0
问题分析与优化建议
1. 目标网站动态限流
从日志看所有请求都返回200,但速度衰减大概率是目标网站对IP做了动态限速——即使你设置download_delay=0,网站会根据请求频率逐步拉长响应延迟,甚至静默限流(不返回错误码但拖慢响应)。
- 优化:降低
CONCURRENT_REQUESTS(比如从30调到15),或开启随机延迟:DOWNLOAD_DELAY=0.5+RANDOMIZE_DOWNLOAD_DELAY=True,模拟正常用户访问节奏。
2. 内存累积冗余
代码中全局列表itemList完全多余——Scrapy已通过Feed Exporter处理数据导出,持续往列表追加数据会占用内存,数据量越大影响越明显。
- 优化:删除全局
itemList及所有itemList.append(item)代码,减少内存消耗。
3. 全局变量不必要使用
start_requests中用了全局变量plate_num_xlsx,但已经通过cb_kwargs传递参数,全局变量不仅多余,还可能引发潜在线程安全问题。
- 优化:删除
global plate_num_xlsx这一行,直接依赖cb_kwargs传递参数即可。
4. 缓存排除
Scrapy默认关闭HttpCacheMiddleware,你的配置中也未开启HTTPCACHE_ENABLED=True,所以缓存不是速度下降的原因。若要彻底排除,可在custom_settings中明确添加HTTPCACHE_ENABLED=False。
5. 导出IO瓶颈
使用scrapy_xlsx持续写入Excel文件,当item数量增加时,频繁IO操作可能拖慢爬虫速度。
- 优化:改用Scrapy原生CSV导出(
FEED_FORMAT='csv')测试速度,或设置FEED_EXPORT_BATCH_ITEM_COUNT批量写入,减少IO频率。
6. Excel读取优化
当前pd.read_excel一次性加载整个文件,若后续Excel文件变大,会占用大量内存。
- 优化:用分批读取方式:
pd.read_excel('data.xlsx', chunksize=100),分批次生成请求,降低内存占用。
内容的提问来源于stack exchange,提问作者xlmaster
相关产品推荐
相关产品推荐

