scrapy 2.3 怎么從腳本中運(yùn)行

2021-06-16 10:49 更新

你可以使用 API 從腳本運(yùn)行scrapy,而不是運(yùn)行scrapy via的典型方式 ?scrapy crawl? .

記住,scrappy構(gòu)建在TwistedAsynchronicNetworkLibrary之上,所以需要在TwistedReactor中運(yùn)行它。

你能用來(lái)運(yùn)行蜘蛛的第一個(gè)工具是 ?scrapy.crawler.CrawlerProcess? . 這個(gè)類將為您啟動(dòng)一個(gè)扭曲的反應(yīng)器,配置日志記錄和設(shè)置關(guān)閉處理程序。這個(gè)類是所有slapy命令使用的類。

下面是一個(gè)示例,演示如何使用它運(yùn)行單個(gè)蜘蛛。

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    # Your spider definition
    ...

process = CrawlerProcess(settings={
    "FEEDS": {
        "items.json": {"format": "json"},
    },
})

process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished

在CrawlerProcess中定義字典中的設(shè)置。一定要檢查 ?CrawlerProcess? 了解其使用細(xì)節(jié)的文檔。

如果您在一個(gè)零碎的項(xiàng)目中,有一些額外的幫助器可以用來(lái)導(dǎo)入項(xiàng)目中的那些組件。你可以自動(dòng)輸入蜘蛛的名字 ?CrawlerProcess? 及使用 ?get_project_settings? 得到一個(gè) ?Settings? 具有項(xiàng)目設(shè)置的實(shí)例。

下面是一個(gè)如何使用 testspiders 以項(xiàng)目為例。

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

process = CrawlerProcess(get_project_settings())

# 'followall' is the name of one of the spiders of the project.
process.crawl('followall', domain='scrapinghub.com')
process.start() # the script will block here until the crawling is finished

還有另一個(gè)Scrapy實(shí)用程序,它提供了對(duì)爬行過程的更多控制: ?scrapy.crawler.CrawlerRunner? . 這個(gè)類是一個(gè)薄包裝器,它封裝了一些簡(jiǎn)單的幫助器來(lái)運(yùn)行多個(gè)爬行器,但是它不會(huì)以任何方式啟動(dòng)或干擾現(xiàn)有的反應(yīng)器。

使用這個(gè)類,在調(diào)度spider之后應(yīng)該顯式地運(yùn)行reactor。建議您使用 ?CrawlerRunner? 而不是 ?CrawlerProcess? 如果您的應(yīng)用程序已經(jīng)在使用Twisted,并且您希望在同一個(gè)反應(yīng)器中運(yùn)行Scrapy。

請(qǐng)注意,蜘蛛完成后,您還必須自己關(guān)閉扭曲的反應(yīng)堆。這可以通過將回調(diào)添加到由 ?CrawlerRunner.crawl? 方法。

下面是一個(gè)使用它的例子,以及在 ?MySpider? 已完成運(yùn)行。

from twisted.internet import reactor
import scrapy
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging

class MySpider(scrapy.Spider):
    # Your spider definition
    ...

configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
runner = CrawlerRunner()

d = runner.crawl(MySpider)
d.addBoth(lambda _: reactor.stop())
reactor.run() # the script will block here until the crawling is finished

參見

Reactor Overview

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)