【问题标题】:Scrapy: fail to re-run in Jupyter Notebook script, reporting ReactorNotRestartableScrapy:在 Jupyter Notebook 脚本中重新运行失败,报 ReactorNotRestartable
【发布时间】:2017-07-03 16:25:18
【问题描述】:

我的scrapy代码是这样的:

import scrapy
from scrapy.crawler import CrawlerProcess

class MovieSpider(scrapy.Spider):
    name = "movies"
    start_urls = [
        'https://movie.douban.com/subject/25934014/',
        'https://movie.douban.com/subject/25852314/',
    ]

    def parse(self, response):
        title = response.css('div#wrapper div#content h1 span::text').extract_first()
        year = response.css('div#wrapper div#content h1 span.year::text').extract_first()
        yield {
            'url': response.url,
            'title': title,
            'year': year,
        }

我是这样运行的

process = CrawlerProcess({
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
    'FEED_FORMAT': 'json',
    'FEED_URI': 'movie.json',
    'FEED_EXPORT_ENCODING':'utf-8'
})

process.crawl(MovieSpider)
process.start() #

这是docs 中推荐的方式。

问题是,在我运行上面的脚本之后,我无法再次运行它。 Jupyter notebook 返回错误ReactorNotRestartable

如果我在jupyter中重新启动内核,第一次运行就可以了。

我认为问题在Scrapy crawl from script always blocks script execution after scraping中说明了

我也许可以通过使用他们的代码来解决这个问题。但是,对于这么小的事情,他们的代码非常复杂,与文档中推荐的 CrawlerProcess 方式相去甚远。

我想知道是否有更好的方法来解决这个问题?

我尝试在脚本末尾添加process.stop()。它没有帮助。

【问题讨论】:

  • Twisted 使用了大量的全局变量,这些变量将绑定到笔记本进程并且不会被清理。这意味着你只能运行一次爬虫,你需要找到另一种方式来运行爬虫
  • 尝试使用文档中的 CrawlerRunner 配方,在末尾添加 reactor.stop()
  • 我也遇到了同样的问题,我猜你应该像 crawler_process = CrawlerProcess(yoursettings) crawler_process.start() 那样启动进程

标签: python scrapy jupyter-notebook


【解决方案1】:

在使用 notebook 时,我相信你必须遵循Running Scrapy as a Script 中描述的方法之一。

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多