在 Celery 任务中运行 Scrapy 蜘蛛

2023-12-31

我有一个 Django 网站,当用户请求时会发生抓取,并且我的代码在新进程中启动 Scrapy 蜘蛛独立脚本。当然,这对于用户的增加来说是行不通的。

像这样的事情:

class StandAloneSpider(Spider):
    #a regular spider

settings.overrides['LOG_ENABLED'] = True
#more settings can be changed...

crawler = CrawlerProcess( settings )
crawler.install()
crawler.configure()

spider = StandAloneSpider()

crawler.crawl( spider )
crawler.start()

我决定使用 Celery 并使用工作人员对抓取请求进行排队。

然而,我遇到了龙卷风反应堆无法重新启动的问题。第一个和第二个蜘蛛运行成功,但后续蜘蛛将抛出 ReactorNotRestartable 错误。

任何人都可以分享在 Celery 框架内运行 Spider 的任何技巧吗?


好的,这就是我如何让 Scrapy 与我的 Django 项目一起工作,该项目使用 Celery 对要抓取的内容进行排队。实际的解决方法主要来自 joehillen 的代码位于此处http://snippets.scrapy.org/snippets/13/ http://snippets.scrapy.org/snippets/13/

首先是tasks.py file

from celery import task

@task()
def crawl_domain(domain_pk):
    from crawl import domain_crawl
    return domain_crawl(domain_pk)

然后crawl.py file

from multiprocessing import Process
from scrapy.crawler import CrawlerProcess
from scrapy.conf import settings
from spider import DomainSpider
from models import Domain

class DomainCrawlerScript():

    def __init__(self):
        self.crawler = CrawlerProcess(settings)
        self.crawler.install()
        self.crawler.configure()

    def _crawl(self, domain_pk):
        domain = Domain.objects.get(
            pk = domain_pk,
        )
        urls = []
        for page in domain.pages.all():
            urls.append(page.url())
        self.crawler.crawl(DomainSpider(urls))
        self.crawler.start()
        self.crawler.stop()

    def crawl(self, domain_pk):
        p = Process(target=self._crawl, args=[domain_pk])
        p.start()
        p.join()

crawler = DomainCrawlerScript()

def domain_crawl(domain_pk):
    crawler.crawl(domain_pk)

这里的技巧是“from multiprocessing import Process”,它绕过了 Twisted 框架中的“ReactorNotRestartable”问题。因此,基本上,Celery 任务调用“domain_crawl”函数,该函数一遍又一遍地重用“DomainCrawlerScript”对象来与 Scrapy 蜘蛛交互。 (我知道我的示例有点多余,但我在使用多个版本的 python 设置时这样做是有原因的 [我的 django Web 服务器实际上使用 python2.4,我的工作服务器使用 python2.7])

在我的示例中,“DomainSpider”只是一个修改后的 Scrapy Spider,它获取 url 列表,然后将它们设置为“start_urls”。

希望这可以帮助!

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

在 Celery 任务中运行 Scrapy 蜘蛛 的相关文章

  • Python Nose 导入错误

    我似乎无法理解鼻子测试框架 https nose readthedocs org en latest 识别文件结构中测试脚本下方的模块 我已经设置了演示该问题的最简单的示例 下面我会解释一下 这是包文件结构 init py foo py t
  • 为什么 tkinter / window.update 在我的程序中随着时间的推移变得更慢?

    我发现当我调用 window update 时 当向窗口写入的内容较少时 它的运行速度会更快 但后来 当我向窗口写入更多元素时 window update 需要更长的时间 请参阅下面的我的代码 您可以看到它在更新窗口之前一次向屏幕 100
  • 将 API 数据存储到 DataFrame 中

    我正在运行 Python 脚本来从 Interactive Brokers API 收集金融市场数据 连接到API后 终端打印出请求的历史数据 如何将数据保存到数据帧中而不是在终端中流式传输 from ibapi wrapper impor
  • conda 无法从 yml 创建环境

    我尝试运行下面的代码来从 YAML 文件创建虚拟 Python 环境 我在 Ubuntu 服务器上的命令行中运行代码 虚拟环境名为 py36 当我运行下面的代码时 我收到下面的消息 环境也没有被创建 这个问题是因为我有几个必须使用 pip
  • 如何从谷歌云存储桶读取音频文件并在datalab笔记本中使用ipd播放

    我想在数据实验室笔记本中播放我从谷歌云存储桶中读取的声音文件 这个怎么做 import numpy as np import IPython display as ipd import librosa import soundfile as
  • 字典中的列表,Python 中的循环

    我有以下代码 TYPES hotmail type hotmail lookup mixed dkim no signatures S Return Path email protected cdn cgi l email protecti
  • 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

    使用 Scipy 保存二维 Numpy 数组 单个值 时toimage or imsave像素值与 Numpy 数组中的像素值不完全匹配 相反 在某些区域 主要是边缘 图像算法似乎使用某种插值 是否有一个选项可以停止插值并保留准确的数据 例
  • 为 Networkx 图添加标题?

    我希望我的代码创建一个带有标题的图 使用下面的代码 可以创建绘图 但没有标题 有人可以告诉我我做错了什么吗 import pandas as pd import networkx as nx from networkx algorithms
  • 用Python中的嵌套for循环替换重复的if语句?

    在我编写的下面的代码中 n 4 所以有五个 if 语句 所以如果我想将 n 增加到 比如说 10 那么就会有很多 if 语句 因此我的问题是 如何用更优雅的东西替换所有 if 语句 n p 4 5 number of trials prob
  • 如何使用 Pandas 将巨大的 CSV 转换为 SQLite?

    我有一个巨大的表 大约 60 GB 采用存档的 CSV 文件形式 我想将其转换为 SQLite 文件 我现在所做的事情如下 import pandas import sqlite3 cnx sqlite3 connect db sqlite
  • Django - 电子邮件发送两次

    每当我使用如下所示的电子邮件设置从views py调用下面的方法时 电子邮件的两份副本都会发送给收件人 并且我收到如下所示的错误 def sendEmailBasic request msg EmailMessage Request Cal
  • 如何使用 PySpark 有效地将这么多 csv 文件(大约 130,000 个)合并到一个大型数据集中?

    我之前发布了这个问题并得到了一些使用 PySpark 的建议 如何有效地将这一大数据集合并到一个大数据框中 https stackoverflow com questions 60259271 how can i merge this la
  • pip 安装软件包两次

    不幸的是我无法重现它 但我们已经见过几次了 pip 将一个软件包安装两次 如果卸载第一个 第二个就会可见并且也可以被卸载 我的问题 如果一个包安装了两次 如何用 python 检查 背景 我想编写一个测试来检查这一点 devOp Updat
  • Python正则表达式从字符串中获取浮点数

    我正在使用正则表达式来解析字符串中的浮点数 re findall a zA Z d d t 是我使用的代码 这段代码有问题 如果数字和任何字符之间没有空格 则不会解析该数字 例如 0 1 2 3 4 5 6 7 8 9 的预期输出为 0 1
  • 如何检查列表是否为空?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 例如 如果通过以下内容 a 我如何检查是否a是空的 if not a print Lis
  • 为什么“return self”返回 None ? [复制]

    这个问题在这里已经有答案了 我正在尝试获取链的顶部节点getTopParent 当我打印出来时self name 它确实打印出了父实例的名称 然而 当我回来时self 它返回 None 为什么是这样 class A def init sel
  • 从 IMDbPy 结果中的片目中获取电影 ID

    我正在尝试创建一个数据集 允许我根据 Python IMDb API 中的演员 ID 和电影 ID 加入演员和电影 现在 我正在尝试从演员的电影作品中提取电影 ID 列表 但无法做到 例如 我知道 Rodney Dangerfield 在
  • 如何强制 Y 轴仅使用整数

    我正在使用 matplotlib pyplot 模块绘制直方图 我想知道如何强制 y 轴标签仅显示整数 例如 0 1 2 3 等 而不显示小数 例如 0 0 5 1 1 5 2 等 我正在查看指导说明并怀疑答案就在附近matplotlib
  • SQLAlchemy:避免声明式样式类定义中的重复

    我正在使用 SQLAlchemy 并且我的对象模型中的许多类具有相同的两个属性 id 和 整数和主键 以及名称 字符串 我试图避免在每个类中声明它们 如下所示 class C1 declarative base id Column Inte
  • issubclass() 对从不同路径导入的同一类返回 False

    目的是实现某种插件框架 其中插件是同一基类 即 A 的子类 即 B 基类使用标准导入加载 而子类使用 imp load module 从众所周知的包 即 pkg 的路径加载 pkg init py mod1 py class A mod2

随机推荐

  • Php - Pdo SSH 隧道

    现在我正在创建一个 ssh 隧道 这样我就可以连接到我的远程数据库 但由于某种原因连接仍然拒绝 我的脚本 try host remote host sshuser ssh user sshpass ssh password dbuser d
  • Rust:如何逐块读取文件

    我对生锈完全陌生 我想逐块 块读取文件 每个块应包含 16 个字节 并将其 对于此测试场景 写入另一个文件 f2 所以我首先在这里尝试使用以下代码 let mut buf 0 16 let mut count 0 for byte in f
  • “const”和“val”有什么区别?

    我最近读到了有关const关键字 我很困惑 我找不到任何区别const和val关键字 我的意思是我们可以使用它们来创建一个不可变变量 还有什么我遗漏的吗 consts 是编译时常数 这意味着它们的值必须在编译时分配 这与vals 可以在运行
  • 获取当前位置后如何停止更新位置?

    我正在使用 Parse 并使用 geoPointForCurrentLocationInBackground 一旦收到位置 我就可以停止更新 而无需手动停止它 如何使用 CLLocationManager 收到位置后立即停止更新位置 Edi
  • 减少授权大小 python AWS Lambda@Edge

    我正在尝试在我的云前端发行版中实施授权 到目前为止它一直有效 直到我遇到尺寸限制 我现在遇到了 cloudfront 错误消息Max allowed 1048576 大约约为 1MB 但是安装完之后authlib包总大小约为6MB 我验证令
  • 干净地中断 HttpListener 的 BeginGetContext 方法

    我正在使用一个Http监听器 http msdn microsoft com en us library 34xswsd2 28v vs 100 29 aspx并使用开始获取上下文 http msdn microsoft com en us
  • 如何在 Codable 结构中添加自定义瞬态属性

    我有以下可按预期工作的可编码结构 struct VideoAlbum Codable let id image String let video mediaType JSONNull let type deleted createdOn S
  • 我应该将参数存储类说明符放在函数定义中还是同时放在声明和定义中?

    我正在努力将一些旧的 K R 代码移植到 ANSI C 因此我正在编写缺少的函数原型声明 很多函数定义的参数都带有寄存器存储类 但我不确定函数原型中是否可以省略寄存器存储类说明符 无论有或没有寄存器存储类特定声明 代码都能正确编译 我尝试了
  • 是否可以将多个静态库捆绑到一个静态库中[C++]?

    我为我的 C 代码创建了一个静态库 该库依赖于 CentOS 7 环境中的 Boost OpenSSL CURL 和 Threads 可以捆绑吗libboost system a libssl a libcrypto a libcurl a
  • 更改 MediaStream 对象的 VideoTrack

    简而言之 我正在尝试改变VideoTrack of a MediaStream object 文档 https developer mozilla org en US docs WebRTC MediaStream API https de
  • 如何在记事本++中进行非贪婪的正则表达式查询?

    我正在用乳胶写论文 不小心写了 cite 代替 cite 我可以手动浏览整个文档 但我想知道如何使用正则表达式在记事本 中执行此操作 我最初尝试过 cite 并替换为 cite 1 适用于简单的情况 例如 cite hello world
  • Oracle SQL:如何通过预定义贡献获取每个组的随机记录

    这是参考此处描述的先前问题 Oracle SQL 如何获取每组的随机记录 https stackoverflow com questions 36628912 oracle sql how to get random records by
  • Paypal付款成功后返回Ionic应用程序

    我创建了一个 Ionic 应用程序 我有一些物品要订购 付款是使用 Paypal 完成的 我使用 window open url 调用了一个 web url 它将我重定向到 Paypal 我能够成功付款 但是有人可以告诉我付款成功后如何返回
  • 在 SAS 中,捕获语法错误的好技术/选项是什么?

    在增强的编辑器中 颜色可能会给您提示 然而 在大型机上 我不相信编辑器中有任何东西可以帮助您 I use OPTIONS OBS 0 noreplace obs 0 选项指定从输入中读入 0 个观测值 dataset 和 NOREPLACE
  • iPhone开发-模拟内存警告

    背景 我有一个标签栏应用程序 每个选项卡都包含导航控制器 允许用户从一个视图转换到另一个视图 显示数据的深入信息 每个视图都由视图控制器处理 每个视图控制器类都有didReceiveMemoryWarning方法 通过从 Web 服务中提取
  • 透明背景WKWebView(NSView)

    我正在使用 Swift 构建 Mac 应用程序 因此 我想使 WKWebView 透明 以便它显示加载的 HTML 文本 但我的底层 NSWindow 的背景是可见的 我试过 webView layer backgroundColor NS
  • ANDROID:java.lang.NoClassDefFoundError:解析失败:Lcom/mysql/cj/MysqlType

    我正在尝试将我的项目与 mysql 数据库连接 但我在驱动程序中收到此错误 E AndroidRuntime FATAL EXCEPTION main Process com example catalyst PID 12531 java
  • 具有链接轴的 PyQtGraph 网格

    使用 PyQtGraph 进行简单的图形布局 其中图的 x 轴链接在一起 并且网格也显示在两个图中 from pyqtgraph Qt import QtGui QtCore import pyqtgraph as pg app QtGui
  • 具有固定 x 轴和 y 轴的 NVD3.js 多图

    我正在使用 NVD3 js 多图来显示各种数据 是否可以为 x 轴和 y 轴设置固定范围 我做了一个 Plunker 的例子 http plnkr co edit OLN87eIE21tImHktYIH6 p preview http pl
  • 在 Celery 任务中运行 Scrapy 蜘蛛

    我有一个 Django 网站 当用户请求时会发生抓取 并且我的代码在新进程中启动 Scrapy 蜘蛛独立脚本 当然 这对于用户的增加来说是行不通的 像这样的事情 class StandAloneSpider Spider a regular