如何以编程方式设置和启动 Scrapy 蜘蛛(url 和设置)

2024-01-07

我用 scrapy 写了一个工作爬虫,
现在我想通过Django webapp来控制它,也就是说:

  • 设置1个或多个start_urls
  • 设置1个或多个allowed_domains
  • Set settings values
  • 启动蜘蛛
  • 停止/暂停/恢复蜘蛛
  • 运行时检索一些统计数据
  • 蜘蛛完成后检索一些统计数据。

起初我以为scrapyd https://scrapy.readthedocs.org/en/latest/topics/scrapyd.html是为此而设计的,但在阅读文档后,它似乎更像是一个能够管理“打包蜘蛛”(又名“碎蛋”)的守护进程;并且所有设置(start_urls , allowed_domains, settings)仍然必须硬编码在“scrapy Egg”本身中;所以它看起来不像是我的问题的解决方案,除非我错过了一些东西。

我也看了这个问题:如何给scrapy提供URL进行爬取? https://stackoverflow.com/questions/9681114/how-to-give-url-to-scrapy-for-crawling/12749782#12749782; 但提供多个 url 的最佳答案被作者 Himeslf 称为“丑陋的黑客”,涉及一些 python 子进程和复杂的 shell 处理,所以我认为在这里找不到解决方案。另外,它可能适用于start_urls,但似乎不允许allowed_domains or settings.

然后我看了看scrapy网络服务 https://scrapy.readthedocs.org/en/latest/topics/webservice.html?highlight=webservices#topics-webservice-crawler: 这似乎是检索统计数据的好解决方案。然而,它仍然需要一个正在运行的蜘蛛,并且没有任何改变的线索settings

关于这个主题有几个问题,但没有一个问题令人满意:

  • 使用一个 scrapy-spider 处理多个网站 https://stackoverflow.com/questions/2396529/using-one-scrapy-spider-for-several-websites这个似乎已经过时了,因为 scrapy 自 0.7 以来已经发展了很多
  • 创建一个通用的 scrapy-spider https://stackoverflow.com/questions/9814827/creating-a-generic-scrapy-spider没有接受的答案,仍在讨论调整 shell 参数。

我知道生产环境使用的是scrapy;像 scrapyd 这样的工具表明,肯定有一些方法可以处理这些要求(我无法想象 scrapyd 正在处理的 scrapy Eggs 是手工生成的!)

非常感谢你的帮助。


起初我以为 scrapyd 就是为此而设计的,但读完文档后,它似乎更像是一个能够管理“打包蜘蛛”(又名“scrapy Eggs”)的守护进程;并且所有设置(start_urls、allowed_domains、settings)仍然必须硬编码在“scrapy Egg”本身中;所以它看起来不像是我的问题的解决方案,除非我错过了一些东西。

我不同意上面的说法,start_urls 不需要硬编码,它们可以动态传递给类,你应该能够将它作为参数传递,如下所示

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

或者您应该能够从数据库或文件中检索 URL。我从这样的数据库中获取它

class WikipediaSpider(BaseSpider):
    name = 'wikipedia'
    allowed_domains = ['wikipedia.com']
    start_urls = []

    def __init__(self, name=None, url=None, **kwargs):
        item = MovieItem()
        item['spider'] = self.name
        # You can pass a specific url to retrieve 
        if url:
            if name is not None:
                self.name = name
            elif not getattr(self, 'name', None):
                raise ValueError("%s must have a name" % type(self).__name__)
            self.__dict__.update(kwargs)
            self.start_urls = [url]
        else:
            # If there is no specific URL get it from Database
            wikiliks = # < -- CODE TO RETRIEVE THE LINKS FROM DB -->
            if wikiliks == None:
                print "**************************************"
                print "No Links to Query"
                print "**************************************"
                return None

            for link in wikiliks:
                # SOME PROCESSING ON THE LINK GOES HERE
                self.start_urls.append(urllib.unquote_plus(link[0]))

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

如何以编程方式设置和启动 Scrapy 蜘蛛(url 和设置) 的相关文章

随机推荐

  • java,获取设置方法

    这个问题之前已经被问过 但即使在阅读之后 Java 获取 和 设置 方法 https stackoverflow com questions 23189672 java get and set methods Java Get Set 方法
  • 如何在 Anaconda Jupyter 笔记本上运行金字塔自动 arima?

    显然 Anaconda 有一个不同的金字塔包 它是针对 Web 框架的 https anaconda org anaconda pyramid https anaconda org anaconda pyramid arima Pyrami
  • Firebase UI - facebook、google 和电子邮件登录无法正常工作

    我在我的应用程序中使用 firebase ui 进行登录 当我在调试模式下运行它时 一切正常 完全没有错误 我用手机运行它 效果很好 当我将应用程序上传到 Play 商店时 我的问题就开始了 当用户尝试使用 Facebook 登录时 它会告
  • Amazon DynamoDB——特定于区域的连接

    我正在使用botoPython 中的库用于连接到 DynamoDB 以下代码对我来说效果很好 import boto key abc secret 123 con boto connect dynamodb key secret table
  • 如何防止跟踪的配置文件被 git 中的合并更改?

    我有一个 Web 项目 有两个 git 分支 开发和生产 每个分支连接到不同的服务器 开发和生产 每个分支都有一组跟踪的配置文件 例如不同的 URL 数据库选项 sql 导出文件等 这些文件在两个分支上都是不同的 每次我尝试合并这些分支时
  • 按对象类型进行 LINQ 选择

    我有一个包含两种类型的对象 A 和 B 的集合 Class Base Class A Base Class B Base List collection new List collection Add new A collection Ad
  • 关于 Swagger API 的建议

    我正在使用 SpringBoot 和 Spring REST 服务使用 Java 8 构建 API 我刚刚发现了 Swagger API 现在我想让我的 API Swagger 兼容 据我所知 Swagger 是一个记录 API 的工具 除
  • 从 Azure Cosmos DB 导出数据(其中类型为 MongoDB API)

    我需要将数据以 CSV 或 JSON 格式从 Azure Cosmos DB 导出到本地系统 有人能帮我吗 你可以使用cosmos 数据库迁移工具 https learn microsoft com en us azure cosmos d
  • 分隔来自套接字的数据

    在我的 Java 应用程序中 有一个 Socket 打开 并且正在从其 InputStream 读取数据 在最佳条件下 每个传入的数据包都会调用 read 返回其应用层数据 这就是我想要得到的 每一条 消息 packet 但是 数据可能会根
  • 如何调用离用户最近的云函数

    我有一个像这样的云函数 它已设置为在多个区域运行 export const cloudFunction functions region asia south1 us central1 europe west1 southamerica e
  • Android Firebase如何在特定用户下保存和检索数据

    我正在尝试将我的应用程序与 firebase 集成以在云上保存简单数据 Example 用户打开应用程序并登录 用户写一些东西 数据保存在云端 当用户再次使用该应用程序时 他将看到他的数据 我已阅读文档 但我找不到任何示例 结构在用户和数据
  • Dapper:具有重复列名称的多重映射

    我有一个看起来像这样的表 ID ERR1 ERR2 ERR3 05A2 A001 B223 C212 06B3 B392 C234 D234 我想将其映射到如下所示的对象 public class Entry public string I
  • 如何在没有 UIWebView 的情况下播放 youtube 视频或当 youtube 视频开始使用 webview 播放时检测视频播放器?

    我需要在我的 iOS 应用程序中播放 YouTube 视频 并且在播放视频时我需要在视频上添加叠加层 1 现在如何在本机播放器中运行 youtube 视频 2 如果我在 UIWebview 中播放视频 那么我如何检测该视频是 播放以及如何在
  • 使用gdb查找程序卡在哪里

    我的程序无法正常工作 看起来它陷入了无限循环或错误的互斥锁定 解锁 但是 我不知道错误在哪里 我尝试使用 gdb 进行调试 我无法使用 gdb backtrace 命令 因为我没有指定断点 我无法指定它 因为我不知道错误在哪里 gdb 有
  • Awesome-wm 中特定标签下的应用程序自动启动

    我读过了在 Awesome wm 中为特定应用程序设置窗口布局 https stackoverflow com questions 5120399 setting windows layout for a specific applicat
  • NuGet - 从命令行添加新的包源

    我有一个场景 我在 VSTS 中创建构建 我无权访问托管代理的虚拟机 并且未将其设置为包含我们的内部包源 我确实可以通过命令行 powershell 进行访问 如何通过命令行向 VS2017 添加新的包源 或者我什至可以这样做 您可以使用
  • symfony 4 设置以匿名身份登录

    我正在研究一个Symfony 4项目 尝试登录后 它使用匿名令牌将我重定向回登录页面 我的设置是使用来自的登录表单symfony docs 单击登录后 我的会话只有csrf authenticate属性 有什么想法我做错了什么吗 安全 ya
  • 企业架构师显示奇怪的符号。这是什么意思?

    有时 我在开始更详细的 UML 工作和开发之前构建的一些 不是全部 需求工件上会出现一个红色三角形 我不知道是什么原因造成的 也不知道它想表达什么 更重要的是 我无法摆脱它 据我所知 这与 UML 或 SysML 规范无关 是吗 谁能解释一
  • 对话框布局双层错误透明背景

    我想制作一个白色的 无边框的弹出视图 为了实现此目的 我使用具有自定义样式的自定义对话框 public Builder createNewDialog int type AlertDialog Builder dlg null switch
  • 如何以编程方式设置和启动 Scrapy 蜘蛛(url 和设置)

    我用 scrapy 写了一个工作爬虫 现在我想通过Django webapp来控制它 也就是说 设置1个或多个start urls 设置1个或多个allowed domains Set settings values 启动蜘蛛 停止 暂停