在 Scrapy >= 0.14 中以编程方式启动爬虫的最简单方法是啥

Posted

技术标签:

【中文标题】在 Scrapy >= 0.14 中以编程方式启动爬虫的最简单方法是啥【英文标题】:What is the simplest way to programatically start a crawler in Scrapy >= 0.14在 Scrapy >= 0.14 中以编程方式启动爬虫的最简单方法是什么 【发布时间】:2012-06-28 03:42:46 【问题描述】:

我想在 Scrapy 中从 Python 模块启动爬虫。我想从本质上模仿$ scrapy crawl my_crawler -a some_arg=value -L DEBUG的本质

我有以下几点:

项目的 settings.py 文件 项目和管道 扩展 BaseSpider 并在初始化时需要参数的爬虫类。

我可以很高兴地使用上面指定的scrapy 命令运行我的项目,但是我正在编写集成测试并且我想以编程方式:

使用settings.py 中的设置和具有my_crawler 名称属性的爬虫启动爬网(我可以从我的测试模块轻松实例化此类。 我希望按照settings.py 中的规范使用所有管道和中间件。 我很高兴在爬虫完成之前阻止进程。管道将内容转储到数据库中,这是我将在爬网完成后检查的数据库内容以满足我的测试。

那么,谁能帮帮我?我在网上看到了一些例子,但它们要么是针对多个蜘蛛的黑客攻击,要么是绕过 Twisted's 阻塞性质,或者不适用于 Scrapy 0.14 或更高版本。我只需要一些真正简单的东西。 :-)

【问题讨论】:

subprocess.check_output(['scrapy', ...], stderr=subprocess.STDOUT) 有什么问题? 我觉得启动另一个进程并执行外部脚本有点hack。我知道可以在同一个过程中做到这一点(显然),我想知道如何自己做。 :-) 如果它是一个集成测试,它不是一个 hack,否则你将依赖于特定版本的 scrapy(内部变化比命令行界面更快) 查看这篇文章:tryolabs.com/Blog/2011/09/27/calling-scrapy-python-script @J.F.Sebastian 我在 OSX 上工作,如果我只使用两个子进程,即两个 Scrapy 实例,第二个实例会消耗 90% 的 CPU。这是不可行的。 【参考方案1】:
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy import log, signals
from testspiders.spiders.followall import FollowAllSpider

spider = FollowAllSpider(domain='scrapinghub.com')
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

见this part of the docs

【讨论】:

【参考方案2】:

官方文档中@wilfred 的回答工作正常,除了日志记录部分,这是我的:

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()
crawler = crawler = Crawler(get_project_settings())
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start_from_settings(get_project_settings())
reactor.run()

【讨论】:

以上是关于在 Scrapy >= 0.14 中以编程方式启动爬虫的最简单方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试中以编程方式执行 Unwind Segue

在 Woocommerce 3 中以编程方式设置自定义运费

可以以编程方式重置位置和隐私设置吗?

在 replaceAll 中以编程方式获取捕获组

在 EclipseLink 中以编程方式创建 <class> 定义

如何在 Python 中以编程方式传递密码