scrapy 2.3 暫停和恢復(fù)爬行

2021-06-17 16:32 更新

有時(shí),對于大型網(wǎng)站,暫停爬行并稍后恢復(fù)爬行是可取的。

Scrapy通過提供以下功能來支持此功能:

  • 在磁盤上保持預(yù)定請求的計(jì)劃程序
  • 重復(fù)的篩選器,用于將訪問的請求保持在磁盤上
  • 在批處理之間保持某些蜘蛛狀態(tài)(鍵/值對)持久的擴(kuò)展。

作業(yè)目錄

要啟用持久性支持,只需定義 作業(yè)目錄 通過 JOBDIR 設(shè)置。此目錄將用于存儲(chǔ)所有必需的數(shù)據(jù),以保持單個(gè)作業(yè)(即spider運(yùn)行)的狀態(tài)。需要注意的是,該目錄不能由不同的spider共享,甚至不能由同一spider的不同作業(yè)/運(yùn)行共享,因?yàn)樗怯脕泶鎯?chǔ) 單一的 工作。

如何使用它

要在啟用持久性支持的情況下啟動(dòng)spider,請按如下方式運(yùn)行:

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

然后,您可以隨時(shí)安全地停止蜘蛛(通過按ctrl-c或發(fā)送信號),然后通過發(fā)出相同的命令恢復(fù)蜘蛛:

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

保持批之間的持久狀態(tài)

有時(shí)您需要在暫停/恢復(fù)批處理之間保持一些持久的蜘蛛狀態(tài)。你可以使用 spider.state 屬性,它應(yīng)該是dict。當(dāng)spider啟動(dòng)和停止時(shí),有一個(gè)內(nèi)置擴(kuò)展負(fù)責(zé)從作業(yè)目錄序列化、存儲(chǔ)和加載該屬性。

下面是一個(gè)使用spider狀態(tài)的回調(diào)示例(為了簡潔起見,省略了其他spider代碼):

def parse_item(self, response):
    # parse item here
    self.state['items_count'] = self.state.get('items_count', 0) + 1

持久性問題

如果您想使用零碎的持久性支持,需要記住以下幾點(diǎn):

cookies過期

Cookie可能過期。因此,如果你不盡快恢復(fù)你的蜘蛛,計(jì)劃的請求可能不再有效。如果你的蜘蛛不依賴cookies,這就不是問題了。

請求序列化

為了堅(jiān)持工作, ?Request? 對象必須可以用序列化 ?pickle? ,除了 ?callback? 和 ?errback? 傳遞給他們的值 ?__init__? 方法,它必須是運(yùn)行的方法  ?Spider? 班級。

如果要記錄無法序列化的請求,可以設(shè)置 ?SCHEDULER_DEBUG? 設(shè)置為 True 在項(xiàng)目的“設(shè)置”頁中。它是 False 默認(rèn)情況下。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號