CrawlerProcess vs CrawlerRunner

Документация Scrapy 1.x объясняет, что есть два способа запуска Spider spider из script:

В чем разница между этими двумя? Когда следует использовать "процесс" и "бегун"?

Ответы

Ответ 1

Документация по скрипированию делает довольно плохую работу по предоставлению примеров для реальных приложений обоих.

CrawlerProcess предполагает, что единственная вещь, которая собирается использовать скрученный реактор, - это единственная в мире. Если вы используете потоки в python для запуска другого кода, это не всегда так. Возьмем это в качестве примера.

from scrapy.crawler import CrawlerProcess
import scrapy
def notThreadSafe(x):
    """do something that isn't thread-safe"""
    # ...
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
notThreadSafe(3) # it will get executed when the crawlers stop

Теперь, как вы можете видеть, функция будет выполняться только при остановке сканеров, что, если я хочу, чтобы функция выполнялась во время сканирования сканера в том же реакторе?

from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
import scrapy

def notThreadSafe(x):
    """do something that isn't thread-safe"""
    # ...

class MySpider1(scrapy.Spider):
    # Your first spider definition
    ...

class MySpider2(scrapy.Spider):
    # Your second spider definition
    ...
runner = CrawlerRunner()
runner.crawl(MySpider1)
runner.crawl(MySpider2)
d = runner.join()
d.addBoth(lambda _: reactor.stop())
reactor.callFromThread(notThreadSafe, 3)
reactor.run() #it will run both crawlers and code inside the function

Класс Runner не ограничивается этой функциональностью, вам могут потребоваться некоторые пользовательские настройки в вашем реакторе (отложить, потоки, getPage, настраивать отчеты об ошибках и т.д.)

Ответ 2

CrawlerRunner:

Этот класс не должен быть нужен (поскольку Scrapy отвечает за его использование), если не написано скриптов, которые вручную обрабатывают процесс обхода. См. "Пробег" в script для примера.

CrawlerProcess:

Эта утилита должна быть лучше, чем CrawlerRunner, если вы используете другой реактор Twisted в своем приложении.

Похоже, что CrawlerProcess - это то, что вам нужно, если вы не добавляете сканеры в существующее приложение Twisted.