【问题标题】:Scrapy crawl from script always blocks script execution after scraping从脚本抓取抓取总是在抓取后阻止脚本执行
【发布时间】:2013-01-24 12:49:09
【问题描述】:

我正在按照本指南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 中的数字看到它)我的脚本的执行不会恢复。 可能不是scrapy问题。答案应该在扭曲的反应堆的某个地方。 如何释放线程执行?

【问题讨论】:

  • 将此代码包装在一个新脚本中并调用它?
  • 不确定您的评论是否正确。你是什​​么意思'调用脚本'?它挂在 reactor.run() 并且日志写给我:'INFO: Closing spider (finished)' 所以蜘蛛似乎已经完成了。

标签: python twisted scrapy


【解决方案1】:

蜘蛛完成后,您需要停止反应器。您可以通过监听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$

【讨论】:

  • 绝对应该在文档中描述。谢谢。
  • 我已经提交了一个拉取请求,描述了如何停止反应堆到scrapy文档,它应该很快就会出现:)
  • 当从这样的脚本运行scrapy时,我如何为scrapy传递参数?喜欢-o output.json -t json
  • 请问我应该把那个脚本放在哪里?
  • 而不是使用额外的stop_reactor,这可行:crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
【解决方案2】:

在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多