Трубопроводы Scrapy Item не включены на PythonAnywhere.com - PullRequest
2 голосов
/ 17 марта 2019

Я развернул проект scrappy / flask на PythonAnywhere.com (PA), который работает на моей локальной машине и почти полностью работает на PA. У меня проблема в том, что когда я планирую задачу для запуска моего паука, конвейеры не включаются. Это очевидно проблема, так как мой MongoDB и конвейеры изображений не будут обновляться. Любые идеи относительно того, почему у меня возникла эта проблема и как ее решить? Я могу запросить MongoDB, и мой сайт отображается так, как и ожидалось, просто во время сканирования не включены никакие конвейеры, поэтому я остался с устаревшим сайтом. При ближайшем рассмотрении выясняется, что сканер использует неверного бота. Смотрите следующие выводы; первый с моей локальной машины и второй с PA:

Правильно - моя локальная машина:

2019-03-16 15:51:12 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: mycorrectbot)
2019-03-16 15:51:12 [scrapy.utils.log] INFO: Versions: lxml 4.3.2.0, libxml2 2.9.9, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 18.9.0, Python 3.7.1 (default, Nov 28 2018, 11:51:47) - [Clang 10.0.0 (clang-1000.11.45.5)], pyOpenSSL 19.0.0 (OpenSSL 1.1.1b  26 Feb 2019), cryptography 2.6.1, Platform Darwin-18.2.0-x86_64-i386-64bit
2019-03-16 15:51:12 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'mycorrectbot', 'DOWNLOAD_DELAY': 0.25, 'NEWSPIDER_MODULE': 'mine.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['mine.spiders'], 'USER_AGENT': 'mine (+https://mine.com)'}

Неправильно - на PA:

2019-03-16 22:57:11 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: scrapybot)
2019-03-16 22:57:11 [scrapy.utils.log] INFO: Versions: lxml 4.3.2.0, libxml2 2.9.9, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 18.9.0, Python 3.7.0 (default, Aug 22 2018, 20:50:05) - [GCC 5.4.0 20160609], pyOpenSSL 19.0.0 (OpenSSL 1.1.1b  26 Feb 2019), cryptography 2.6.1, Platform Linux-4.4.0-1075-aws-x86_64-with-debian-stretch-sid
2019-03-16 22:57:11 [scrapy.crawler] INFO: Overridden settings: {}

Структура проекта:

├── LICENSE
├── README.md
├── flask_app
│   ├── __init__.py
│   ├── flask_app.py
│   ├── static
│   │   ├── css
│   │   │   └── home.css
│   │   ├── images
│   │   │   └── full
│   │   │       ├── 1.jpg
│   │   │       ├── 2.jpg
│   │   │       ├── 3.jpg
│   │   └── vendor
│   │       ├── bootstrap
│   │       │   ├── css
│   │       │   │   ├── bootstrap.css
│   │       │   │   ├── bootstrap.css.map
│   │       │   │   ├── bootstrap.min.css
│   │       │   │   └── bootstrap.min.css.map
│   │       │   └── js
│   │       │       ├── bootstrap.bundle.js
│   │       │       ├── bootstrap.bundle.js.map
│   │       │       ├── bootstrap.bundle.min.js
│   │       │       ├── bootstrap.bundle.min.js.map
│   │       │       ├── bootstrap.js
│   │       │       ├── bootstrap.js.map
│   │       │       ├── bootstrap.min.js
│   │       │       └── bootstrap.min.js.map
│   │       └── jquery
│   │           ├── jquery.js
│   │           ├── jquery.min.js
│   │           ├── jquery.min.map
│   │           ├── jquery.slim.js
│   │           ├── jquery.slim.min.js
│   │           └── jquery.slim.min.map
│   └── templates
│       └── index.html
├── scrapy_app
│   ├── scrapy_app
│   │   ├── __init__.py
│   │   ├── items.py
│   │   ├── middlewares.py
│   │   ├── pipelines.py
│   │   ├── settings.py
│   │   └── spiders
│   │       ├── __init__.py
│   │       └── mine.py
│   └── scrapy.cfg
└── requirements.txt

Насколько я понимаю, я не могу напрямую вызвать .py для своего паука-скрапа в PA Tasks и вместо этого должен полагаться на отдельный файл, чтобы сделать вызов "scrapy crawl my spider", который я обычно делал бы. Тем не менее, это не работает, как ожидалось. Я ссылался на эту страницу документа , но я должен что-то упустить.

Вот файл, который я создал для выполнения альтернативного вызова и на который указывает PA Task:

import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from scrapy_app.spiders import mine

class MySpider('my spider'):
    # Your spider definition
    pass

if __name__ == "__main__":
    process = CrawlerProcess(get_project_settings())

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

Ниже приводится запланированное задание, которое я добавил на PA (не в структуре проекта - не обращайте внимания на этот факт):

/home/myuserid/.virtualenvs/myvirtualenv/bin/python /home/myuserid/flask_app/flask_app/scheduler.py

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 17 марта 2019

Ничего себе. Я сделал это намного сложнее, чем мне нужно. Единственным различием между моим PA и локальным приложением был тип виртуальной среды, в которой я работал. Я удалил рекомендуемый VE на PA и вместо этого использовал venv. Затем я написал простой сценарий для активации виртуальной среды, запуска своего паука и деактивации. Сценарий выглядит следующим образом (scheduler.sh):

#!/bin/bash

cd ~
source myvenv/bin/activate
cd /home/userid/project/scrapy_app/scrapy_app
scrapy crawl my spider
deactivate

Теперь все работает, как и ожидалось, несмотря на ужасные рекомендации по ПА и скрапингу. Надеюсь, это поможет кому-то еще!

...