如何使 scrapy 中的 start_url 从消息队列中使用?

2024-01-17

我正在构建一个 scrapy 项目,其中有多个蜘蛛(每个域一个蜘蛛)。现在,要抓取的 URL 是动态地来自用户给定的查询。所以基本上我不需要进行广泛的爬行,甚至不需要跟踪链接。将会有一个接一个的网址,我只需要使用选择器进行提取。所以我在想,如果我可以将 URL 传递到 scrapy 蜘蛛可以使用的消息队列上,那就没问题了。但我无法弄清楚。我检查过

https://github.com/darkrho/scrapy-redis https://github.com/darkrho/scrapy-redis

但我觉得它不适合我的目的,因为我需要多个队列(每个蜘蛛一个队列)。 据我了解,一种方法似乎是覆盖蜘蛛中的 start_requests 方法。但我再次不清楚该怎么做(对于 python 和 scrapy 来说是新手)。我可以将它视为任何普通的 python 脚本并 ovverride 使用(任何)消息队列的方法吗? 另外,我需要蜘蛛 24*7 运行,并在队列中有请求时进行抓取。我想我应该使用信号并在某处引发 DontCloseSpider 异常。但我该在哪里做呢?我很迷失。请帮忙。

这是我正在考虑的场景:

用户 -> 查询 -> 来自 abc.com 的 url -> abc-spider

          -> url from xyz.com -> xyz-spider

          -> url from ghi.com -> ghi-spider

现在,每个网站的每个网址都有相同的内容需要抓取。所以我有选择器在每个蜘蛛中执行此操作。我需要的是,这只是一个单一用户场景。当有多个用户时,同一个蜘蛛会收到多个不相关的网址。所以它会是这样的:

查询1、查询2、查询3

abc.com -> url_abc1,url_abc2,url_abc3

xyz.com -> url_xyz1,url_xyz2,url_xyz3

ghi.com -> url_ghi1,url_ghi2, url_ghi3

因此,对于每个网站,这些 URL 都会动态出现,并被推送到各自的消息队列中。 现在,每个用于该网站的蜘蛛都必须消耗各自的队列,并在消息队列上有请求时向我提供抓取的项目


这是将 scrapy 构建为数据管道一部分的一种非常常见且(IMO)出色的方法;我一直这样做。

你是正确的,你想覆盖蜘蛛的start_requests()方法。如果您定义了 start_requests() 以及 start_urls 变量,我不知道 scrapy 的行为如何,但如果您从数据库等动态源进行消费,我建议仅使用 start_requests() 。

一些示例代码,未经测试,但应该给您正确的想法。如果您需要更多信息,请告诉我。它还假设您的队列已由另一个进程填充。

class ProfileSpider( scrapy.Spider ):
    name = 'myspider'

    def start_requests( self ):
        while( True ):
            yield self.make_requests_from_url(
                self._pop_queue()
            )

    def _pop_queue( self ):
        while( True ):
            yield self.queue.read()

这将您的队列公开为生成器。如果您想最大程度地减少空循环量(因为队列很多时候可能为空),您可以在 _pop_queue 循环中添加睡眠命令或指数退避。 (如果队列为空,则休眠几秒钟,然后尝试再次弹出。)

假设您的代码中没有发生致命错误,我相信这不应该因为循环/生成器的构造而终止。

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

如何使 scrapy 中的 start_url 从消息队列中使用? 的相关文章

随机推荐

  • 使用 sympy 计算多元函数的泰勒级数

    我正在尝试使用 SymPy 计算依赖于三角函数的函数的泰勒级数sinc here http docs sympy org dev modules mpmath functions trigonometric html sinc functi
  • @ActiveProfiles 值未分配给配置

    如果我将它们设置为虚拟机参数 我的活动配置文件将正常工作 我有一个想要使用的测试 ActiveProfiles local 这是我正在使用的类注释 RunWith SpringJUnit4ClassRunner class ContextC
  • 使用 Twitter Bootstrap,如何自定义一页的 h1 文本颜色,而将其他页面保留为默认颜色?

    在我的索引页面上 我希望 h1 文本颜色为白色并带有阴影 但我不想更改其他页面上 h1 的默认行为 我怎样才能实现这个目标 在 Bootstrap 3 中 以下是更改文本颜色的类 p class text muted p grey p cl
  • Python 中更快的套接字

    我有一个用 Python 编写的服务器客户端 它通过 LAN 运行 该算法的某些部分使用套接字密集读取 其执行速度比几乎一样的 http pastie org 3962231用 C 编写 有哪些解决方案可以使 Python 套接字读取速度更
  • 从视图创建位图使视图消失,如何获取视图画布?

    我发现了两种从视图创建位图的方法 但一旦我这样做了 视图就会消失 我就不能再使用它了 生成位图后如何重绘视图 1st public static Bitmap getBitmapFromView View view Bitmap retur
  • 如何从java中的另一个类更新jLabel或setText?

    我正在尝试创建一个JFrame哪里的jLabel和按钮位于另一个类中 我在其中创建了一个方法putTextNow这会将文本设置为jLabel 我读到应该使用多线程来完成 这对我来说更复杂 这是我的代码 NewJFrame java priv
  • 在 JBoss 上安装 SSL 证书

    我有一台运行 JBoss 的服务器 当我在该服务器上输入错误的 URL 时 它会给出如下版本 JBossWeb 2 0 1 GA JBoss 的版本是什么 我们将为我购买并提供 SSL 证书 以便我可以将其安装在 JBoss 中 我真的很感
  • 如何为 Mac OSX 编写虚拟打印机驱动程序 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要为 OSX 编写一个 虚拟打印机驱动程序 以便当用户按 Command P 打开 打印 对话框时
  • SQL模糊匹配

    希望我没有重复这个问题 在在这里发帖之前 我在这里做了一些搜索和谷歌 我正在使用启用全文的 SQL Server 2008R2 运行 eStore 我的要求 有一个产品表 其中包含产品名称 OEM 代码 该产品适合的型号 一切都在文字中 我
  • 我如何使用 zip(), python

    例如 我有这些变量 a 1 2 b 3 4 如果我使用函数zip 对于它 结果将是 1 3 2 4 但我有这个清单 a 1 2 3 4 而且 我需要得到与第一个结果相同的结果 1 3 2 4 但是 当我这样做时 zip a I get 1
  • 在 C 中写入多个文件并迭代其名称

    我试图通过迭代 进行一些计算并将索引添加到文件名来编写一堆文件 这是我的代码的一部分 我强调了代码停止编译的位置 float AltAzCalc int d float t float Lon float RA float Dec floa
  • 计算所有 k 乘积之和的高效算法

    假设给你一个列表L of n数字和整数k
  • Jenkins 以非常高的 CPU 使用率运行

    我最近从 Jenkins 1 6 升级到 2 5 这样做之后 我注意到 CPU 使用率非常高 有时超过 300 只有 4 个核心 所以我认为它不会超过 400 我不知道从哪里开始调试这个 但这是一个线程转储 https gist githu
  • 在哪里可以找到 dojo 工具包 dijit 小部件的图标图像列表?

    我想这是一个简单的问题 但尽管进行了一些谷歌搜索 我仍然没有找到答案 有谁知道在哪里可以找到 Dojo 工具包中可用图标的列表 最好看的地方是Dojo Toolkit nightly 图标目录 http archive dojotoolki
  • 在子文件夹中搜索 VSCode,而不是整个工作区

    如何仅在工作区的一个子文件夹中进行搜索 CTRL SHIFT F searches in the whole workspace and since this is large I get way too many hits in unre
  • Objective-C - 将 CSV 解析为数组

    我如何将 CSV 解析为数组 它只是我转换为 CSV 的一列电子表格 所以应该不会太难吧 我该怎么做 使用适当的 CSV 解析器 例如https github com davedelong CHCSVParser https github
  • 如何在整数列上指定“喜欢”?

    这让我很困惑 我想我会将其提交给 SO 社区寻求帮助 用户想要选择以某个 ID 开头的所有订单 例如 123会回来123 12345 1238790等等 但是 ID 是一个 int 列 我正在使用 nHibernate 目前我的线路是 cr
  • C++ 异常会通过 C 代码安全传播吗?

    我有一个 C 应用程序调用SQLite http www sqlite org 的 SQLite 使用 C 语言 sqlite3 exec http www sqlite org c3ref exec html它又可以调用我用 C 实现的回
  • 无法在本地以及 docker 中启动“django”项目

    我在用Docker部署Python2 7申请与Django1 8 过去两天我遇到了一些问题 我发现错误如下 Docker 镜像 python 2 7 slim buster Error root 64f8c580dd0a code pyth
  • 如何使 scrapy 中的 start_url 从消息队列中使用?

    我正在构建一个 scrapy 项目 其中有多个蜘蛛 每个域一个蜘蛛 现在 要抓取的 URL 是动态地来自用户给定的查询 所以基本上我不需要进行广泛的爬行 甚至不需要跟踪链接 将会有一个接一个的网址 我只需要使用选择器进行提取 所以我在想 如