Scrapy: twisted.inte rnet .error.ReactorNotRestartable от запуска CrawlProcess () - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь запустить свою работу по сценарию. Я использую CrawlerProcess, и у меня есть только один паук для запуска.

Я застрял на этой ошибке на некоторое время, и я много чего пытался изменить настройки, но каждый раз я запустить паука, я получаю

twisted.inte rnet .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. pipe.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

Если я изменю pipe.py на значение по умолчанию, которое будет ...

import logging
import pymongo

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

... скрипт будет работать нормально. Я думаю, что это как-то связано с тем, как я устанавливаю настройки pycharm для запуска кода. Так что для справки, я также включаю мои настройки pycharm enter image description here

Я надеюсь, что кто-то может мне помочь. Дайте мне знать, если нужно больше деталей

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Рейнальдо,

большое спасибо - вы сохранили мой проект!

И вы подтолкнули меня к мысли, что, возможно, это происходит, потому что у вас есть этот кусок, если скрипт запускает процесс в том же файле с вашим определением паука. В результате, он выполняется каждый раз, когда скрап импортирует определение вашего паука. Я не большой специалист в области скрапа, но, возможно, он делает это несколько раз внутри страны, и поэтому мы сталкиваемся с этой ошибкой.

Ваше предложение явно решает проблему!

Другой подход может быть разделить определение класса паука и скрипт, выполняющий его. Возможно, это подход, который предполагает scrapy, и поэтому в его Запуске паука из скрипта в документации даже не упоминается эта проверка __name__.

Итак, я сделал следующее:

  • в проекте root У меня есть папка sites и в ней есть файл site_spe c .py . Это всего лишь служебный файл с некоторой информацией о целевом сайте c (структура URL и т. Д. c.). Я упомянул это здесь, просто чтобы показать вам, как вы можете импортировать различные служебные модули в определение класса вашего паука;

  • в проекте root У меня есть папка spiders и my_spider.py определение класса в нем. И в этом файле я импортирую site_spe c .py файл с директивой:

from sites import site_spec

Важно отметить, что скрипт запускает паука (тот, который вы представили) УДАЛЕН из файла определения класса my_spider.py file. Также обратите внимание, что я импортирую свой файл site_spe c .py с путем, связанным с файлом run.py (см. Ниже), но не связанным с файлом определения класса, где эта директива выдается так, как можно было ожидать (python относительный импорт, я думаю)

  • наконец, в проекте root у меня есть run.py файл, runnig сценарий из сценария:
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

С помощью этой настройки, наконец, я смог избавиться от этого витого.inte rnet .error.ReactorNotRestartable

Большое спасибо! !!

0 голосов
/ 27 февраля 2020

Хорошо. Я решил это. Поэтому я думаю, что в конвейере, когда скребок входит в open_spider, он снова запускает spider.py и вызывает process.start () второй раз.

Чтобы решить эту проблему, я добавляю это в паук, поэтому process.start () будет выполняться только при запуске паука:

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