在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...
python怎樣編寫 PYTHON怎樣編寫自動化
1級2018 09 18 回答 就直接寫指令碼,給你舉給例子 編寫工具 1.設計目標 首先說一下我要工具的功能 遍歷某個目錄下包括其下子目錄中所有指定的字尾檔案,然後為這些檔案的頭部插入指定的字串。2.使用場景 設計這樣的工具起因是我最近在將之前 csdn 中的部落格搬運到自己的 hexo 部落格空...