在scrapy使用過程中,很多情況下需要根據實際需求定製自己的擴充套件,小到實現自己的pipelines,大到用新的scheduler替換預設的scheduler。
擴充套件可以按照是否需要讀取crawler大致分為兩種,對於不需要讀取的,比如pipelines的編寫,只需要實現預設的方法porcess_item。需要讀取的,如scheduler的編寫又存在另外的方式。
這種處理起來比較簡單,一般是根據scrapy的signals實現相應的處理。具體實現可見文件pipelines的編寫方法。
這種方式和第一種的主要區別是需要使用crawler內部資訊,比如接收內部訊號,如signals.spider_opened等。還體現在對設定setting.py的是否需要讀取上。
i)讀取設定一般通過from_settings函式實現。一下是scrapy-redis中scheduler的from_settings的實現方法:
def from_settings(cls, settings):
persist = settings.get('scheduler_persist', scheduler_persist)
queue_key = settings.get('scheduler_queue_key', queue_key)
queue_cls = load_object(settings.get('scheduler_queue_class', queue_class))
dupefilter_key = settings.get('dupefilter_key', dupefilter_key)
idle_before_close = settings.get('scheduler_idle_before_close', idle_before_close)
server = connection.from_settings(settings)
return cls(server, persist, queue_key, queue_cls, dupefilter_key, idle_before_close)
ii)from_crawler()
scrapy api的主要入口是 crawler 的例項物件, 通過類方法 from_crawler 將它傳遞給擴充套件(extensions)。 該物件提供對所有scrapy核心元件的訪問, 也是擴充套件訪問scrapy核心元件和掛載功能到scrapy的唯一途徑。
實現例子如下:
def from_crawler(cls, crawler):
instance = cls.from_settings(crawler.settings)
return instance
iii)其它函式
想pipelines中的process_item一樣,有些函式是此型別組建所必需的,整個框架在執行時會使用到次函式,所以必須加以實現。如scheduler中的enqueue_request、next_request等函式。
最難處理的也是第iii種,這需要全域性了解scrapy執行邏輯,函式呼叫關係等。比較簡單的方式是按照原元件的函式功能,函式返回值等根據自己編寫的擴充套件的功能重新實現。就是照葫蘆畫瓢。
scrapy內data stream在其文件的架構上已經說明,但是轉化到**上好難找啊。
探索的提高效率的py-charm操作:
ctrl+shift+f可以全域性查詢字元的出現。右上角的放大鏡貌似只能找函式。
scrapy 編寫擴充套件 (八)
在scrapy使用過程中,很多情況下需要根據實際需求定製自己的擴充套件,小到實現自己的pipelines,大到用新的scheduler替換預設的scheduler。擴充套件可以按照是否需要讀取crawler大致分為兩種,對於不需要讀取的,比如pipelines的編寫,只需要實現預設的方法porces...
怎樣編寫scrapy擴充套件
在scrapy使用過程中,很多情況下需要根據實際需求定製自己的擴充套件,小到實現自己的pipelines,大到用新的scheduler替換預設的scheduler。擴充套件可以按照是否需要讀取crawler大致分為兩種,對於不需要讀取的,比如pipelines的編寫,只需要實現預設的方法porces...
爬蟲 Scrapy(八)Scrapy快讀提取超連結
前面寫過用xpath 方式定位response物件中我們所需要的超連結位址,但如果超連結過多且位置規律性差就不太方便了,現在介紹一種快速提取和過濾超連結位址的方法 1.明確需求 檢視豆瓣圖書中首頁中所有圖書的超連結,先看首頁長這樣的 然後隨便點選一本數,進入圖書的詳情頁,是這樣的 此時我們檢視下瀏覽...