scrapy 主動停止爬蟲 轉

2021-10-08 03:17:12 字數 2601 閱讀 5757

class closespider(object):

def __init__(self, crawler):

self.crawler = crawler

self.close_on =

if not any(self.close_on.values()):

raise notconfigured

self.counter = defaultdict(int)

if self.close_on.get('errorcount'):

crawler.signals.connect(self.error_count, signal=signals.spider_error)

if self.close_on.get('pagecount'):

crawler.signals.connect(self.page_count, signal=signals.response_received)

if self.close_on.get('timeout'):

crawler.signals.connect(self.spider_opened, signal=signals.spider_opened)

if self.close_on.get('itemcount'):

crawler.signals.connect(self.item_scraped, signal=signals.item_scraped)

crawler.signals.connect(self.spider_closed, signal=signals.spider_closed)

@classmethod

def from_crawler(cls, crawler):

return cls(crawler)

def error_count(self, failure, response, spider):

self.counter['errorcount'] += 1

if self.counter['errorcount'] == self.close_on['errorcount']:

self.crawler.engine.close_spider(spider, 'closespider_errorcount')

def page_count(self, response, request, spider):

self.counter['pagecount'] += 1

if self.counter['pagecount'] == self.close_on['pagecount']:

self.crawler.engine.close_spider(spider, 'closespider_pagecount')

def spider_opened(self, spider):

self.task = reactor.calllater(self.close_on['timeout'], \

self.crawler.engine.close_spider, spider, \

reason='closespider_timeout')

def item_scraped(self, item, spider):

self.counter['itemcount'] += 1

if self.counter['itemcount'] == self.close_on['itemcount']:

self.crawler.engine.close_spider(spider, 'closespider_itemcount')

def spider_closed(self, spider):

task = getattr(self, 'task', false)

if task and task.active():

task.cancel()

1  上述**是乙個scrapy 關閉爬蟲的乙個的擴充套件類,從**中可以看出主要是實現了timeout, itemcount, pagecount, errorcount 4種方式,因此可以在setting中設定這4種方式,當觸發條件的時候會自動停止爬蟲

在setting中設定

closespider_timeout # 指定時間退出

closespider_itemcount # 生成了指定數量的item

closespider_pagecount # 抓取了指定數量的響應

closespider_errorcount # 在發生指定數量的錯誤

# 開啟extensions擴充套件

extensions =

2  從closespider類中可以了解到停止爬蟲是使用了 self.crawler.engine.close_spider() 方法,因此當滿足一定條件的時候我們也可以呼叫這個方法停止scrapy

# 在spider檔案中

self.crawler.engine.close_spider(self, '關閉爬蟲')

# 在middlewares檔案中

spider.crawler.engine.close_spider(spider, '關閉爬蟲')

scrapy爬蟲框架

作者經過幾周的python爬蟲實踐之後,深入學習了一下scrapy這個爬蟲框架,現將一些基本知識和 總結整理一下,以備後查。2.scrapy的命令列使用 這部分網上很多部落格都有總結,不需要背,理解會用主要的命令 startproject crawl fetch list genspider.即可,...

scrapy 爬蟲框架

1.安裝 公升級pip版本 pip install upgrade pip 通過pip安裝scrapy框架 pip install scrapy 安裝成功 只執行scrapy 進行測試是否安裝成功 2.scrapy startproject 爬蟲專案名稱 執行此命令,可以生成乙個爬蟲專案 會預先生成...

爬蟲安裝scrapy

scrapy框架結構清晰,基於twisted的非同步架構可以充分利用計算機資源,是爬蟲做大的必備基礎。本文將講解如何快速安裝此框架並使用起來。2.1 同安裝lxml庫 2.2 安裝twisted 開啟命令提示符視窗,輸入命令 twisted庫安裝成功後,安裝scrapy就簡單了,在命令提示符視窗直接...