在 For 循环中运行 Scrapy 在第一次运行后挂起

吉米·桑切斯

我想在 for 循环中运行 Scrapy,列表中的每个 URL 一个循环。(注意:我不希望所有这些 URL 都为start_urls,我需要它们一次运行一个)。

twisted.internet.error.ReactorNotRestartable在循环的第一次迭代后,我的第一次尝试给了我错误。

对 SO 的搜索给出了先前的答案,说process.start(stop_after_crawl=False)应该解决这个问题。这摆脱了 Twisted 错误,但现在只是在循环的第一次迭代后挂起。这不是那个问题的重复。

我目前的代码是:

for url in urls:
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        'DEPTH_LIMIT': 4
    })

    process.crawl(MySpider, url)
    process.start(stop_after_crawl=False)

第一个 URL 运行良好,然后它就挂了:

 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2018, 8, 12, 21, 12, 29, 963422)}
2018-08-12 22:12:30 [scrapy.core.engine] INFO: Spider closed (finished)
臭名昭著的。没有

您应该能够使用一些 Twisted 模块来做到这一点。这是一个快速示例:

from scrapy.crawler import CrawlerRunner
from twisted.internet import defer, tasks

@tasks.react
@defer.inlineCallbacks
def crawl_my_sites(reactor):
    runner = CrawlerRunner({})
    for url in urls:
        yield runner.crawl(MySpider, url)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在第一次循环后,在while循环中运行`rg`会中断

Pytest 在第一次失败后停止运行

scheduleAtFixedRate第一次运行后未执行

在控制台循环中运行时,setTimeout在for循环中第一次打印意外的垃圾值

嵌套 while 循环以及如何在第一次运行后访问内部循环

第一次运行jstree

使功能第一次使用Tkinter单击后只能运行一次吗?

第一次运行后,AppleScript重复循环变慢

使用 selenium 运行循环会在第一次迭代后引发错误

第一次迭代后嵌套 for 循环未在 python 中运行

在Python中运行for循环:第一次正常运行,但其余运行未正常运行

“运行时错误 92:未初始化 For 循环”第一次成功运行后出错

Java第一次运行后不更新变量

第一次执行后,Visual Studio无法运行功能

Laravel 在第一次运行后不增加登录值

react-native run-ios 仅在安装 pod 后第一次运行

第一次运行后,go-sdl2不清除窗口表面

第一次运行修改后的代码时编译失败

第一次运行后,jQuery Datatables Ajax调用被破坏

第一次运行后停止播放此动画

ddrescue:第一次运行后重试失败的块

Spring Boot @Schedular 在第一次执行后没有运行

第一次失败/成功操作后,存在运行aspnet_regiis进行循环加密的操作

在 for 循环中运行函数

While 循环在第一次迭代后停止

While 循环在第一次迭代后中断

第一次循环代码后,“闹钟”中断

For循环在第一次迭代后停止

循环在第一次迭代后停止吗?