Scrapy - Одновременный запуск нескольких пауков - CrawlerProcess - Файловая структура

Я пытаюсь использовать CrawlerProcess для одновременного запуска нескольких Scrapy Spider, но не уверен в файловой структуре. Оба паука работают правильно, когда запускаются индивидуально через scrapy crawl indeed и scrapy crawl monster (обозначенные имена моих классов пауков).

Моя текущая файловая структура выглядит следующим образом:

- scrapy
  - tutorial
    - spiders
      - __init__.py
      - indeed_spider.py
      - monster_spider.py
    - __init__.py
    - crawler.py
    - functions.py
    - items.py
    - middlewares.py
    - pipelines.py
    - settings.py
  - scrapy.cfg

Как видите, моя настройка crawler.py находится в основном каталоге tutorial.

Код для crawler.py выглядит следующим образом:

from scrapy.crawler import CrawlerProcess
from tutorial.spiders.indeed_spider import IndeedSpider
from tutorial.spiders.monster_spider import MonsterSpider
from scrapy.utils.project import get_project_settings

settings = get_project_settings()
process = CrawlerProcess(settings)
process.crawl(IndeedSpider)
process.crawl(MonsterSpider)
process.start()

Когда я захожу в каталог tutorial и запускаю python crawler.py, я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "crawler.py", line 3, in <module>
    from tutorial.spiders.indeed_spider import IndeedSpider
ModuleNotFoundError: No module named 'tutorial'

Это странно, потому что явно есть tutorial модуль. В документации Scrapy нет ничего о файловой структуре и одновременном запуске нескольких пауков; он дает простой пример, который мало помогает (документ сканера).

Мои вопросы:

  • Как запустить несколько пауков через CrawlerProcess в командной строке? Это не scrapy crawl {spider_name}. Я предполагаю, что это python crawler.py, но это не сработало с моей нынешней структурой.
  • Где следует хранить crawler.py в каталоге проекта?
  • Требуются ли дальнейшие манипуляции с pipelines.py или settings.py для инициирования CrawlerProcess?

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


person Ian Forrest    schedule 28.04.2020    source источник
comment
Не входите в tutorial каталог, иначе вы удаляете tutorial из путей импорта Python. Запустите python tutorial/crawler.py или добавьте путь, содержащий папку tutorial, в переменную среды PYTHONPATH.   -  person Gallaecio    schedule 28.04.2020


Ответы (1)


Вы все сделали правильно, ошибка связана с выполнением импорта python.

Traceback (most recent call last):
  File "crawler.py", line 3, in <module>
    from tutorial.spiders.indeed_spider import IndeedSpider
ModuleNotFoundError: No module named 'tutorial'

это известное препятствие в питоне. Я предлагаю вам создать setup.py в каталоге scrapy со следующим кодом:

from setuptools import setup, find_packages

setup(name='nameofproject', version='version', packages=find_packages())

Итак, ваша структура должна быть:

> - scrapy
>   - setup.py
>   - tutorial
>     - spiders
>       - __init__.py
>       - indeed_spider.py
>       - monster_spider.py
>     - __init__.py
>     - crawler.py
>     - functions.py
>     - items.py
>     - middlewares.py
>     - pipelines.py
>     - settings.py
>   - scrapy.cfg

Затем вы должны выполнить в каталоге scrapy следующую команду в своей оболочке:

pip install -e .

Теперь интерпретатор python должен уметь идентифицировать tutorial как модуль.

person Vinícius OA    schedule 01.04.2021