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

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=&currentmatches=&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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:20:40