Скрабирование из скрипта всегда блокирует выполнение скрипта после очистки

Я следую этому руководству http://doc.scrapy.org/en/0.16/topics/practices.html#run-scrapy-from-a-script для запуска scrapy из моего скрипта. Вот часть моего скрипта:

    crawler = Crawler(Settings(settings))
    crawler.configure()
    spider = crawler.spiders.create(spider_name)
    crawler.crawl(spider)
    crawler.start()
    log.start()
    reactor.run()
    print "It can't be printed out!"

Он работает так, как должен: посещает страницы, собирает необходимую информацию и сохраняет вывод json там, где я сказал (через FEED_URI). Но когда паук заканчивает свою работу (я вижу это по номеру в выводе json), выполнение моего скрипта не возобновляется. Вероятно, это не щепетильная проблема. А ответ должен где-то в искривленном реакторе. Как я могу освободить выполнение потока?


person Eugene Nagorny    schedule 08.02.2013    source источник
comment
Оберните этот код в новый скрипт и, возможно, назовите его?   -  person Talvalin    schedule 09.02.2013
comment
Не уверен, что правильно понял ваш комментарий. Что вы имеете в виду под «вызовом сценария»? Он висит прямо в реакторе.run(), и журнал пишет мне: «ИНФОРМАЦИЯ: Закрытие паука (завершено)», так что паук, кажется, закончен.   -  person Eugene Nagorny    schedule 09.02.2013


Ответы (2)


Вам нужно будет остановить реактор, когда паук закончит. Вы можете сделать это, прослушивая сигнал spider_closed:

from twisted.internet import reactor

from scrapy import log, signals
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy.xlib.pydispatch import dispatcher

from testspiders.spiders.followall import FollowAllSpider

def stop_reactor():
    reactor.stop()

dispatcher.connect(stop_reactor, signal=signals.spider_closed)
spider = FollowAllSpider(domain='scrapinghub.com')
crawler = Crawler(Settings())
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
log.msg('Running reactor...')
reactor.run()  # the script will block here until the spider is closed
log.msg('Reactor stopped.')

И вывод журнала командной строки может выглядеть примерно так:

stav@maia:/srv/scrapy/testspiders$ ./api
2013-02-10 14:49:38-0600 [scrapy] INFO: Running reactor...
2013-02-10 14:49:47-0600 [followall] INFO: Closing spider (finished)
2013-02-10 14:49:47-0600 [followall] INFO: Dumping Scrapy stats:
    {'downloader/request_bytes': 23934,...}
2013-02-10 14:49:47-0600 [followall] INFO: Spider closed (finished)
2013-02-10 14:49:47-0600 [scrapy] INFO: Reactor stopped.
stav@maia:/srv/scrapy/testspiders$
person Steven Almeroth    schedule 10.02.2013
comment
Это обязательно должно быть описано в документации. Спасибо. - person Eugene Nagorny; 13.02.2013
comment
Я отправил запрос на вытягивание, в котором описывается, как остановить реактор, в документации по скраппингу, он скоро появится :) - person Sjaak Trekhaak; 26.06.2013
comment
При запуске scrapy из такого скрипта, как мне передать аргументы для scrapy? Нравится -o output.json -t json - person Medeiros; 26.09.2013
comment
пожалуйста, куда мне положить этот скрипт? - person William Kinaan; 09.02.2014
comment
не могли бы вы помочь мне здесь, пожалуйста? stackoverflow .com/questions/25353650/ - person Marco Dinatsoli; 18.08.2014
comment
вместо использования дополнительного stop_reactor это работает: crawler.signals.connect(reactor.stop, signal=signals.spider_closed) - person arcolife; 05.09.2014
comment
@coldspeed Да, взгляните на документация - person Steven Almeroth; 22.02.2019

В scrapy 0.19.x вы должны сделать это:

from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from testspiders.spiders.followall import FollowAllSpider
from scrapy.utils.project import get_project_settings

spider = FollowAllSpider(domain='scrapinghub.com')
settings = get_project_settings()
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run() # the script will block here until the spider_closed signal was sent

Обратите внимание на эти строки

settings = get_project_settings()
crawler = Crawler(settings)

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

Еще один способ сделать это - просто вызвать команду прямо из вашего скрипта.

from scrapy import cmdline
cmdline.execute("scrapy crawl followall".split())  #followall is the spider's name
person Medeiros    schedule 27.09.2013