[871]一个Scrapy项目下的多个爬虫如何同时运行

我们知道,如果要在命令行下面运行一个 Scrapy 爬虫,一般这样输入命令:

scrapy crawl xxx

此时,这个命令行窗口在爬虫结束之前,会一直有数据流动,无法再输入新的命令。如果要运行另一个爬虫,必须另外开一个命令行窗口。

我们也知道,可以通过两条Python 代码,在 Python 里面运行 Scrapy 爬虫:

from scrapy.cmdline import execute

execute('scrapy crawl xxx'.split())

假设我们把这两行代码放在一个Scrapy 项目根目录下名为 main.py 的文件里面。当我们运行这个文件python3 main.py,Scrapy 爬虫也能正常启动。

但如果我们要运行同一个项目下面的两个爬虫,也需要开两个命令窗口。

那么,有没有什么办法,在一个命令窗口里面,同时运行同一个 Scrapy 项目下面的多个爬虫呢?

假设我们有一个 Scrapy 项目叫做test_multple_crawler,它下面有两个爬虫exerciseua

运行exercise时,爬虫输出如下图所示:

image

运行ua时,爬虫输出如下图所示:

image

如果我把运行两个爬虫的代码同时写到main.py里面会怎么样呢?我们试试看:

image

可以看到,这两个爬虫是串行运行的。首先第一个爬虫运行。直到它里面所有代码全部运行完成了,它结束了以后,第二个爬虫才会开始运行。这显然不是我们需要的。

为了让同一个 Scrapy 项目下面的多个爬虫实现真正的同时运行,我们可以使用 Scrapy 的CrawlerProcess

它的用法如下:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

settings = get_project_settings()

crawler = CrawlerProcess(settings)
crawler.crawl('爬虫名1')
crawler.crawl('爬虫名2')
crawler.crawl('爬虫名3')
crawler.start()

使用这种方法,可以在同一个进程里面跑多个爬虫。

回到我们的例子中,修改 main.py代码为:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

settings = get_project_settings()

crawler = CrawlerProcess(settings)

crawler.crawl('exercise')
crawler.crawl('ua')

crawler.start()
crawler.start()

运行效果如下图所示:

image

可以看到,两个爬虫真正实现了同时运行。

来源:https://mp.weixin.qq.com/s?__biz=MzI2MzEwNTY3OQ==&mid=2648978999&idx=2&sn=5eac3ca647717dcff6b9a856f4411c04&chksm=f2506bd7c527e2c15ca965976fab2ab5797ec49d57970f7f30ccfbfb8f5303f16772660a27b5&scene=158#rd

好的,下面是一个简单的使用Scrapy框架编写爬虫的例子: 1. 创建项目 首先,需要在终端中使用以下命令创建一个Scrapy项目: ``` scrapy startproject <项目名> ``` 2. 定义Item 接下来,需要定义要爬取的数据的结构。在Scrapy中,可以使用Item类来定义数据结构。在项目目录下,创建一个items.py文件,并定义Item类,例如: ```python import scrapy class MyItem(scrapy.Item): title = scrapy.Field() content = scrapy.Field() ``` 这里定义了一个名为MyItem的Item类,包含两个字段:title和content。 3. 编写Spider 接下来,需要编写Spider,定义如何爬取网站数据。在项目目录下,创建一个spiders目录,并在其中创建一个名为myspider.py的文件。在该文件中定义Spider,例如: ```python import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = 'myspider' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] def parse(self, response): item = MyItem() item['title'] = response.xpath('//title/text()').extract_first() item['content'] = response.xpath('//body/text()').extract_first() yield item ``` 这里定义了一个名为MySpider的Spider类,包含三个属性:name、allowed_domains和start_urls。其中,name是Spider的名称,allowed_domains是允许爬取的域名列表,start_urls是Spider开始爬取的URL列表。 parse方法定义了如何解析爬取到的网页数据。在这个例子中,我们使用XPath表达式获取title和body字段,并将结果存储到MyItem对象中。最后,使用yield语句将MyItem对象传递给Scrapy引擎。 4. 运行爬虫 在终端中使用以下命令来运行Spider: ``` scrapy crawl myspider ``` 这里的myspider是Spider的名称,对应于MySpider类中的name属性。 以上就是一个简单的使用Scrapy框架编写爬虫的例子。当然,这只是Scrapy的基础用法,Scrapy还有很多高级功能和用法,可以根据自己的需求进行学习和使用。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值