pycharm Scrapy:扭曲的.internet.错误.ReactorNotRestartable从运行爬网过程()

fcg9iug3  于 2022-11-08  发布在  PyCharm
关注(0)|答案(3)|浏览(248)

我正在尝试从脚本运行我的scrapy。我正在使用CrawlerProcess,我只有一个蜘蛛要运行。
我已经被这个错误卡住了一段时间了,我已经尝试了很多方法来更改设置,但是每次我运行蜘蛛程序时,我都会得到
twisted.internet.error.ReactorNotRestartable
我一直在寻找解决这个错误的方法,我相信只有当你多次调用process.start()时才会出现这个错误,但是我没有。
下面是我的代码:

import scrapy
from scrapy.utils.log import configure_logging

from scrapyprefect.items import ScrapyprefectItem
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

class SpiderSpider(scrapy.Spider):
    name = 'spider'
    start_urls = ['http://www.nigeria-law.org/A.A.%20Macaulay%20v.%20NAL%20Merchant%20Bank%20Ltd..htm']

    def __init__(self, *args,**kwargs):
        super().__init__(*args,**kwargs)

    def parse(self, response):
        item = ScrapyprefectItem()
        ...

        yield item

process = CrawlerProcess(settings=get_project_settings())
process.crawl('spider')
process.start()

错误:

Traceback (most recent call last):
  File "/Users/pluggle/Documents/Upwork/scrapyprefect/scrapyprefect/spiders/spider.py", line 59, in <module>
    process.start()
  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/scrapy/crawler.py", line 309, in start
    reactor.run(installSignalHandlers=False)  # blocking call
  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 1282, in run
    self.startRunning(installSignalHandlers=installSignalHandlers)
  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 1262, in startRunning
    ReactorBase.startRunning(self)
  File "/Users/pluggle/Documents/Upwork/scrapyprefect/venv/lib/python3.7/site-packages/twisted/internet/base.py", line 765, in startRunning
    raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable

我注意到只有当我试图将我的项目保存到mongodb时才会发生这种情况。pipeline.py:

import logging
import pymongo

class ScrapyprefectPipeline(object):
    collection_name = 'SupremeCourt'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        # pull in information from settings.py
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE')
        )

    def open_spider(self, spider):
        # initializing spider
        # opening db connection
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        # clean up when spider is closed
        self.client.close()

    def process_item(self, item, spider):
        # how to handle each post
        self.db[self.collection_name].insert(dict(item))
        logging.debug("Post added to MongoDB")
        return item

如果我将www.example.com更改pipeline.py为默认值,即...

import logging
import pymongo

class ScrapyprefectPipeline(object):
    def process_item(self, item, spider):
        return item

...脚本运行良好。我认为这与我如何设置pycharm设置来运行代码有关。因此,为了参考,我还包括了我的pycharm设置

我希望有人能帮助我。让我知道如果需要更多的细节

bkhjykvo

bkhjykvo1#

雷纳尔多,
非常感谢-你拯救了我的项目!
你让我想到,这可能是因为你有一段if脚本,它在同一个文件中启动了一个进程,并带有你的spider定义。结果,每次scrapy导入你的spider定义时,它都会被执行。我不是scrapy方面的Maven,但可能它在内部执行了几次,因此我们遇到了这个错误问题。
你的建议显然解决了这个问题!
另一种方法可能是将spider类定义和运行它的脚本分开。可能,这就是scrapy假设的方法,这就是为什么在从脚本文档运行spider中甚至没有提到这个__name__检查。
所以我做的是:

  • 在项目根目录下有sites文件夹和site_spec.py文件。这只是一个包含目标站点特定信息(URL结构等)的实用程序文件。我在这里提到它只是为了向您展示如何将各种实用程序模块导入到spider类定义中;
  • 在项目根目录中,我有spider文件夹和my_spider.py类定义。在该文件中,我导入了site_spec.py文件,指令如下:
from sites import site_spec

必须指出的是,运行蜘蛛的脚本(您提供的那个)从类定义my_spider.py文件中被删除。另外,请注意,我导入的site_spec.py文件的路径与run.py文件相关(见下),但与类定义文件无关,在那里发出了这个指令,正如人们所期望的那样(我猜是python相对导入)

  • 最后,在项目根目录下,我有一个run.py文件,运行scrapy from脚本:
from scrapy.crawler import CrawlerProcess
from spiders.my_spider  import MySpider # this is our friend in subfolder**spiders**
from scrapy.utils.project import get_project_settings

# Run that thing!

process = CrawlerProcess(get_project_settings())
process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished

有了这个设置,我终于能够摆脱这个扭曲的。internet。error。ReactorNotRestartable
非常感谢!!!

von4xj4u

von4xj4u2#

好的,我解决了,所以我认为,在管道中,当scraper进入open_spider时,它会再次运行spider.py,并第二次调用process.start().
为了解决这个问题,我在spider中添加了这个函数,这样process.start()只会在运行spider时执行:

if __name__ == '__main__':
    process = CrawlerProcess(settings=get_project_settings())
    process.crawl('spider')
    process.start()
q35jwt9p

q35jwt9p3#

尝试改变Scrapy和扭曲的版本。这不是解决方案,但工作。
==22.1.0 pip安装扭曲==2.5.1

相关问题