Vraag Scrapy crawl from script blokkeert altijd scriptuitvoering na het schrapen


Ik volg deze gids http://doc.scrapy.org/en/0.16/topics/practices.html#run-scrapy-from-a-script scrapy uitvoeren vanuit mijn script. Hier is een deel van mijn 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!"

Het werkt zoals het moet: bezoekt pagina's, schraapt benodigde info en slaat output json op waar ik het heb verteld (via FEED_URI). Maar wanneer de spin zijn werk beëindigt (ik kan het zien aan de hand van het nummer in uitvoer json) zou de uitvoering van mijn script niet worden hervat. Waarschijnlijk is het geen scrapy probleem. En het antwoord zou ergens in de reactor van twisted moeten zitten. Hoe kan ik de uitvoering van threads vrijgeven?


19
2018-02-08 17:18


oorsprong


antwoorden:


U moet de reactor stoppen wanneer de spin is voltooid. U kunt dit bereiken door te luisteren naar de spider_closed signaal:

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.')

En de uitvoer van de opdrachtregellog kan er ongeveer zo uitzien:

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$

28
2018-02-10 20:59



In scrapy 0.19.x zou je dit moeten doen:

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

Let op deze regels

settings = get_project_settings()
crawler = Crawler(settings)

Zonder dit zal je spider je instellingen niet gebruiken en zullen de items niet worden opgeslagen. Kostte me een tijdje om erachter te komen waarom het voorbeeld in de documentatie mijn items niet opsloeg. Ik heb een pull-aanvraag verzonden om het doc-voorbeeld op te lossen.

Een andere manier om het te doen is gewoon de opdracht rechtstreeks vanuit je script te bellen

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

6
2017-09-27 21:39