Scrapy 中的内存泄漏

2023-12-22

我编写了以下代码来抓取电子邮件地址(用于测试目的):

import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.selector import Selector
from crawler.items import EmailItem

class LinkExtractorSpider(CrawlSpider):
    name = 'emailextractor'
    start_urls = ['http://news.google.com']

    rules = ( Rule (LinkExtractor(), callback='process_item', follow=True),)

    def process_item(self, response):
        refer = response.url
        items = list()
        for email in Selector(response).re("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}"):

            emailitem = EmailItem()
            emailitem['email'] = email
            emailitem['refer'] = refer
            items.append(emailitem)
        return items

不幸的是,似乎对Requests的引用没有正确关闭,与scrapy telnet控制台一样,Requests的数量增加了5k/s。在大约 3 分钟和 10k 刮擦页面后,我的系统开始交换(8GB RAM)。 有人知道出了什么问题吗? 我已经尝试删除引用并使用“复制”字符串

emailitem['email'] = ''.join(email)

没有成功。 抓取后,这些项目将保存到 BerkeleyDB 中,计算它们的出现次数(使用管道),因此引用应该在之后消失。

返回一组项目和单独生成每个项目有什么区别?

EDIT:

经过相当长一段时间的调试后,我发现请求没有被释放,因此我最终得到:

$> nc localhost 6023
>>> prefs()
Live References
Request 10344   oldest: 536s ago
>>> from scrapy.utils.trackref import get_oldest
>>> r = get_oldest('Request')
>>> r.url
<GET http://news.google.com>

这实际上是起始网址。 有人知道问题是什么吗?缺少对 Request 对象的引用在哪里?

EDIT2:

在服务器(具有 64GB RAM)上运行约 12 小时后,使用的 RAM 约为 16GB(使用 ps,即使 ps 不是合适的工具)。问题是,抓取的页面数量显着下降,而抓取的项目数量自数小时以来一直保持为 0:

INFO: Crawled 122902 pages (at 82 pages/min), scraped 3354 items (at 0 items/min)

EDIT3: I did the objgraph analysis which results in the following graph (thanks @Artur Gaspar): Python Objgraph Backlink

我似乎无法影响它?


对我来说,最终的答案是使用基于磁盘的队列与工作目录结合作为运行时参数。

这会将以下代码添加到 settings.py 中:

DEPTH_PRIORITY = 1 
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

之后,使用以下命令行启动爬网程序会使更改永久保留在给定目录中:

scrapy 爬行 {spidername} -s JOBDIR=crawls/{spidername}有关详细信息,请参阅 scrapy 文档 http://doc.scrapy.org/en/latest/topics/jobs.html

此方法的额外好处是,可以随时暂停和恢复爬网。 我的蜘蛛现在运行超过 11 天,阻塞 ~15GB 内存(磁盘 FIFO 队列的文件缓存内存)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy 中的内存泄漏 的相关文章

  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是

随机推荐

  • DBMS_XPLAN.DISPLAY_CURSOR 与解释计划(如果不使用 Gather_plan_statistics 提示)

    只是要求澄清两者之间的区别 据我所知 解释计划为您提供了理论的执行计划 而 DBMS XPLAN DISPLAY CURSOR 为您提供actual带有语句执行统计信息的执行计划 EXPLAIN PLAN 将此数据存储在 PLAN TABL
  • Blazor onclick 事件从循环传入计数器

    我目前正在通过 Blazor 中的本地解决方案实现表分页 但遇到了一些困难 麻烦的代码如下 用于渲染网格下方的分页按钮 for int i 0 i lt vm TotalPages i
  • easy_install 安装了各种版本的 python、mac osx

    我在 mac OSX 10 6 机器上有各种版本的 python 其中一些安装了 macports gt python select l Available versions current none python24 python26 p
  • 如何防止命令行参数由 R 解释而不是仅由我的脚本解释?

    我正在使用docopt https github com docopt docopt RR 的实现 我的脚本有一个命令行选项 其缩写形式为 g 当我运行我的脚本时 似乎这个参数首先由 R 解释 然后由我的脚本解释 因此 我因为没有为 GUI
  • SoapClient 尝试获取架构文件时出现 401 身份验证错误

    我的应用程序通常连接到第三方服务器以通过 SOAP WSDL 获取数据 this gt soap client new SoapClient https the domain 443 path wsdl array trace gt 1 l
  • 如何优化 EF Code First 查询?

    已更新 请参阅底部的更新 我使用 EF 代码优先 并且总体上对此感到满意 然而 一个简单 且常见 的操作导致 EF 生成极其复杂的 SQL 这降低了我的应用程序的速度 我只是使用 整数 ID 列表来获取一组实体 但因为我需要大量子实体的详细
  • 在 C++ 中前向声明静态 C 结构实例

    我正在编写一个代码生成器 实际上是一个数据生成器 它将生成这种形式的数据结构 显然实际的数据结构要复杂得多 typedef struct Foo int a struct Foo foo Foo extern Foo f1 extern F
  • 使用 Pandas Excelwriter 写入 StringIO 对象?

    我可以将 StringIO 对象传递给 pd to csv 就好 io StringIO StringIO pd DataFrame to csv io 但是当我使用excel writer时 我遇到了很多麻烦 io StringIO St
  • jQuery serializeArray() 键值对

    我在序列化表单时遇到了一些麻烦
  • Bootstrap 一次轮播多个框架

    这是我试图用 Bootstrap 3 轮播实现的效果 它不是一次只显示一帧 而是并排显示 N 帧 然后 当您滑动 或自动滑动时 时 它会像以前一样移动幻灯片组 这可以吗与 bootstrap 3 的轮播 我希望我不必去寻找另一个 jQuer
  • 检查 MongoDB 文档中是否存在多个字段

    我正在尝试查询一个数据库集合 该集合保存具有特定字段的文档的流程文档 为简单起见 想象以下通用文档模式 timestamp ISODate result1 pass result2 fail 现在 当一个进程启动时 会插入一个仅包含时间戳的
  • 在继续当前脚本的同时异步运行单独的 PowerShell 脚本

    PowerShell 脚本 1 执行以下操作 Performs FTP ops ending with saving updated remote directory data in a local file 该脚本快速运行 直到必须使用
  • WPF 全局字体大小

    我正在创建一个 WPF 应用程序 我想知道能够更改 ui 中每个元素的字体大小的最佳方法 我是否创建资源字典并设置样式来设置我使用的所有控件的字体大小 最佳实践是什么 我会这样做
  • CSS3 月亮形状

    我正在尝试创建一个像这样的按钮 我不知道如何在按钮顶部创建一个浅月形状 这还很遥远 小提琴演示 https jsfiddle net wgnp9ygh 2 moon width 50px height 50px border radius
  • 软删除 - 使用 IsDeleted 标志还是单独的连接表?

    我们应该使用软删除标志还是单独的连接表 哪个更有效率 数据库是SQL Server 背景资料 不久前 我们有一位数据库顾问进来查看我们的数据库架构 当我们软删除一条记录时 我们将更新相应表上的 IsDeleted 标志 有人建议不要使用标志
  • .NET Core 2.1 Swashbuckle - 按区域对控制器进行分组

    我的情况比较简单 我有一个非常大的 NET Core 2 1 MVC WebApi 分为几个区域 代表我系统的不同模块 我使用 Swagger SwashBuckle 效果非常好 我的路由就像 area controller action
  • 从 Java 运行“who -m”命令会产生空结果

    我正在尝试从 Java 中查找当前登录的用户名 Process p try p Runtime getRuntime exec who m p waitFor BufferedReader reader new BufferedReader
  • Perl 中的命名参数

    我正在尝试在 Perl 中使用命名参数 我一直在使用http perldesignpatterns com NamedArguments http web archive org web 20160920193219 http perlde
  • LazyEvaluation的性能优势到底从何而来?

    在过去的几天里 我研究了惰性评估 主要是在性能方面 想知道LazyEvalutaion 的性能优势由此显现 我阅读各种文章并不清楚 但其中很少包括 惰性求值有什么优点 https stackoverflow com questions 21
  • Scrapy 中的内存泄漏

    我编写了以下代码来抓取电子邮件地址 用于测试目的 import scrapy from scrapy contrib spiders import CrawlSpider Rule from scrapy contrib linkextra