web-dev-qa-db-ja.com

1つのWebサイトで複数のスパイダーをスクレイプで並行して実行していますか?

2つの部分からなるWebサイトをクロールしたいのですが、スクリプトが必要な速度ではありません。

最初の部分を削るために1つ、2番目の部分のために2つ目の、2つのスパイダーを起動することは可能ですか?

2つの異なるクラスを作成して実行しようとしました

scrapy crawl firstSpider
scrapy crawl secondSpider

でも賢くないと思います。

scrapydのドキュメント を読みましたが、それが私の場合に適しているかどうかはわかりません。

6
parik

私はあなたが探しているものはこのようなものだと思います:

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 を参照してください。

10
K Hörnell

または、このように実行することもできます。このコードを、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()
5
Yuda Prawira

より良い解決策は、(複数のスパイダーがある場合)動的にスパイダーを取得して実行することです。

_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()
_

(2番目のソリューション):spiders.list()はScrapy1.4で非推奨になっているため、Yudaソリューションは次のようなものに変換する必要があります。

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

setting = get_project_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()
_
3
Yusef