【问题标题】:Running Scrapy in a For Loop hangs after first run在 For 循环中运行 Scrapy 在第一次运行后挂起
【发布时间】:2018-08-12 21:19:28
【问题描述】:

我想在 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)

【问题讨论】:

标签: python-3.x scrapy twisted


【解决方案1】:

您应该能够使用一些 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)

【讨论】:

    【解决方案2】:

    对于使用scrapy循环遍历列表,我认为使用“start_requests”是个好主意:

    def start_requests(self):
        with open('./input/id_urls_10k.csv','r') as csvfile:
            urlreader = csv.reader(csvfile, delimiter=',',quotechar='"')
            for row in urlreader:
                if row[1]=="y":
                    yield scrapy.Request(url=row[2],meta={'urlkey':row[0]})
    

    【讨论】:

    • 问题依然存在。爬虫在第一次请求产生后断开连接。不循环
    猜你喜欢
    • 2012-05-20
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2018-06-25
    • 2019-12-19
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多