Python中Scrapy在Linux下内存占用非常大的问题如何解决?

我是爬取一个视频网站,爬取到地址放到 file piplines 中去下载

在 Mac 上占用内存很小,只有 100M 多

放到了阿里云上,内存占用非常大,有 700M 多

请教这是怎么回事
Python中Scrapy在Linux下内存占用非常大的问题如何解决?

5 回复

贴代码,还有两个环境部署的文件配置,阿里云什么系统什么配置


这个问题我遇到过,Scrapy在Linux下内存飙升通常是因为请求队列和中间件数据堆积。

核心解决方法是控制并发和及时清理内存。在settings.py里加上这些配置:

# 控制并发请求数
CONCURRENT_REQUESTS = 16
CONCURRENT_REQUESTS_PER_DOMAIN = 8

# 启用自动限速
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 5.0
AUTOTHROTTLE_MAX_DELAY = 60.0

# 调整调度器队列
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.pqueues.FifoMemoryQueue'

# 及时清理请求对象
REQUEST_FINGERPRINTER_IMPLEMENTATION = '2.7'

# 禁用不需要的中间件
EXTENSIONS = {
    'scrapy.extensions.memusage.MemoryUsage': None,
}

如果还不行,在spider里手动控制:

class MySpider(scrapy.Spider):
    custom_settings = {
        'CLOSESPIDER_ITEMCOUNT': 1000,  # 抓取1000个item后自动停止
        'DOWNLOAD_DELAY': 0.5,  # 下载延迟
    }
    
    def parse(self, response):
        # 及时释放response内存
        data = response.css('div.content').get()
        response = None  # 手动释放
        
        # 控制yield频率
        for item in self.process_data(data):
            yield item
            if self.should_pause():  # 自定义暂停逻辑
                import time
                time.sleep(1)

telnet监控内存:telnet localhost 6023,然后输入est()查看状态。

建议用scrapy bench测试不同配置下的内存表现。

配置用的默认的,阿里云就是最低配的那个 1 核 1G 内存 Ubuntu 18 的系统

我自己分析发现,减少并发数量可以降低内存,推测是由于服务器网速快,所以默认的 16 个线程都能满速下载,然后下载的时候,scrapy 用的 requests 应该设置的 chunked 比较大



我这个推测应该不准,我修改了配置文件,改成了 ip 域名,都是 3 个线程,依然内存会爆

回到顶部