20

このガイドhttp://doc.scrapy.org/en/0.16/topics/practices.html#run-scrapy-from-a-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 の番号で確認できます)、スクリプトの実行が再開されません。おそらくそれはスクレイピーの問題ではありません。そして答えはツイストの原子炉のどこかにあるはずです。スレッドの実行を解放するにはどうすればよいですか?

4

2 に答える 2

28

スパイダーが終了したら、reactor を停止する必要があります。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$
于 2013-02-10T20:59:35.120 に答える
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)

これがないと、スパイダーは設定を使用せず、アイテムを保存しません。ドキュメントの例でアイテムが保存されない理由を理解するのにしばらく時間がかかりました。ドキュメントの例を修正するためにプル リクエストを送信しました。

それを行うもう1つの方法は、スクリプトから直接コマンドを呼び出すことです

from scrapy import cmdline
cmdline.execute("scrapy crawl followall".split())  #followall is the spider's name
于 2013-09-27T21:39:34.113 に答える