文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
12.12 启动爬虫
本节主要讲解爬虫的启动,我们之前运行爬虫采取的都是命令行的方式,输入命令为scrapy crawl spider_name。除了这种方式,Scrapy还提供了API可以让我们在程序中启动爬虫。
由于Scrapy是在Twisted异步网络库上构建的,因此必须在Twisted reactor里运行。
第一种通用的做法是使用CrawlerProcess类,这个类内部将会开启Twisted reactor、配置log和设置Twisted reactor自动关闭。下面给我们的cnblogs爬虫添加启动脚本,在cnblogs_spider.py下面添加如下代码:
if __name__=='__main__': process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' }) process.crawl(CnblogsSpider) process.start()
可以在CrawlerProcess初始化时传入设置的参数,使用crawl方式运行指定的爬虫类。
也可以在CrawlerProcess初始化时传入项目的settings信息,在crawl方法中传入爬虫的名字。代码如下:
if __name__=='__main__': process = CrawlerProcess(get_project_settings()) process.crawl('cnblogs') process.start()
另一种启动的办法是使用CrawlerRunner,这种方法稍微复杂一些。在spider运行结束后,必须自行关闭Twisted reactor,需要在CrawlerRunner.crawl所返回的对象中添加回调函数。代码如下:
if __name__=='__main__': configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'}) runner = CrawlerRunner() d = runner.crawl(CnblogsSpider) d.addBoth(lambda _: reactor.stop()) reactor.run()
代码中使用configure_logging配置了日志信息的打印格式,通过CrawlerRunner的crawl方法添加爬虫,并通过addBoth添加关闭Twisted reactor的回调函数。
以上的两种方式都是在一个进程中启动了一个爬虫,其实我们可以在一个进程中启动多个爬虫。第一种实现方式的示例代码如下:
import scrapy from scrapy.crawler import CrawlerProcess class MySpider1(scrapy.Spider): # Your first spider definition ... class MySpider2(scrapy.Spider): # Your second spider definition ... process = CrawlerProcess() process.crawl(MySpider1) process.crawl(MySpider2) process.start()
第二种实现方式的示例代码如下:
import scrapy from twisted.internet import reactor from scrapy.crawler import CrawlerRunner from scrapy.utils.log import configure_logging class MySpider1(scrapy.Spider): # Your first spider definition ... class MySpider2(scrapy.Spider): # Your second spider definition ... configure_logging() runner = CrawlerRunner() runner.crawl(MySpider1) runner.crawl(MySpider2) d = runner.join() d.addBoth(lambda _: reactor.stop()) reactor.run()
第三种实现方式的示例代码如下:
from twisted.internet import reactor, defer from scrapy.crawler import CrawlerRunner from scrapy.utils.log import configure_logging class MySpider1(scrapy.Spider): # Your first spider definition ... class MySpider2(scrapy.Spider): # Your second spider definition ... configure_logging() runner = CrawlerRunner() @defer.inlineCallbacks def crawl(): yield runner.crawl(MySpider1) yield runner.crawl(MySpider2) reactor.stop() crawl() reactor.run()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论