Запуск нескольких пауков в scrapy для 1 веб-сайта параллельно?

Я хочу сканировать веб-сайт из 2 частей, и мой сценарий работает не так быстро, как мне нужно.

Можно ли запустить 2 паука, один для очистки первой части и второй для второй части?

Я пытался иметь 2 разных класса, и запустить их

scrapy crawl firstSpider
scrapy crawl secondSpider

но я думаю, что это не умно.

Я прочитал документацию по Scripyd, но я не знаю, хорошо ли это для моего случая.

3 ответа

Решение

Я думаю, что вы ищете что-то вроде этого:

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

Вы можете прочитать больше на: запуск нескольких пауков в том же процессе.

Или вы можете запустить с этим, вам нужно сохранить этот код в том же каталоге, что и 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()

Лучшее решение (если у вас есть несколько пауков), оно динамически получает пауков и запускает их.

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

(Второе решение): потому что spiders.list() устарела в Scrapy 1.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()
Другие вопросы по тегам