在Scrapy中同时运行多个爬虫来爬取一个网站?

7
我希望能够用脚本爬取一个包含两部分的网站,但我的脚本速度不够快。是否可以启动两个爬虫,一个用于获取第一部分,另一个用于获取第二部分?
我试过使用两个不同的类,并运行它们。
scrapy crawl firstSpider
scrapy crawl secondSpider

但是我认为这并不聪明。

我阅读了Scrapyd文档,但我不确定它是否适用于我的情况。

3个回答

13

我认为你要找的是这样的东西:

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() # the script will block here until all crawling jobs are finished

你可以在此处阅读更多内容:running-multiple-spiders-in-the-same-process


11
如果我有300只需要运行的蜘蛛,这个实现方案能否支持? - vdkotian
我们可以把结果单独存储吗? - Pyd
这个解决方案不会并行运行所有的爬虫。爬虫将会从最后一个到第一个一个接一个地运行。 - Kingname
1
@ScottStafford 你将如何运行shell? - Adeena Lathiya

7

或者您可以这样运行,您需要在与scrapy.cfg相同的目录中保存此代码(我的Scrapy版本是1.3.3):

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

setting = get_project_settings()
process = CrawlerProcess(setting)

for spider_name in process.spiders.list():
    print ("Running spider %s" % (spider_name))
    process.crawl(spider_name,query="dvh") #query dvh is custom argument used in your scrapy

process.start()

3
更好的解决方案是(如果您有多个爬虫),它可以动态获取爬虫并运行它们。
from scrapy import spiderloader
from scrapy.utils import project
from twisted.internet.defer import inlineCallbacks


@inlineCallbacks
def crawl():
    settings = project.get_project_settings()
    spider_loader = spiderloader.SpiderLoader.from_settings(settings)
    spiders = spider_loader.list()
    classes = [spider_loader.load(name) for name in spiders]
    for my_spider in classes:
        yield runner.crawl(my_spider)
    reactor.stop()

crawl()
reactor.run()

(第二种解决方案): 由于Scrapy 1.4版本中spiders.list()已被弃用,因此Yuda的解决方案需要转换为类似以下内容:

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

settings = get_project_settings()
process = CrawlerProcess(settings)
spider_loader = spiderloader.SpiderLoader.from_settings(settings)

for spider_name in spider_loader.list():
    print("Running spider %s" % (spider_name))
    process.crawl(spider_name)
process.start()

这两个解决方案是否都能同时运行所有的爬虫? - fractal397

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接