2013-02-08 4 views
19

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

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), выполнение моего скрипта не возобновится. Возможно, это не проблема с scrapy. И ответ должен где-то в реакторе скручиваться. Как я могу освободить выполнение потока?

+0

Wrap этот код в новый сценарий и называют это возможно? – Talvalin

+0

Не уверен, что я получил ваш комментарий. Что значит «называть скрипт»? Он висит прямо в реакторе.run(), и журнал пишет мне: «INFO: Закрывающий паук (законченный)», поэтому паук, похоже, закончен. –

ответ

28

Вам необходимо остановить реактор, когда паук заканчивается. Вы можете сделать это путем прослушивания 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.') 

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

[email protected]:/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. 
[email protected]:/srv/scrapy/testspiders$ 
+2

Это определенно должно быть описано в документах. Благодарю. –

+0

Я подал запрос на растяжение, в котором описывается, как остановить реактор для документации по скрипированию, он должен быть в ближайшее время :) –

+1

При запуске scrapy из сценария, как это, как передать аргументы для scrapy? Как '-o output.json -t json' – Medeiros

6

В 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 
Смежные вопросы