scrapy 2.3 重復(fù)使用和擴(kuò)展項(xiàng)目加載器

2021-06-09 10:08 更新

隨著項(xiàng)目規(guī)模的擴(kuò)大和蜘蛛數(shù)量的增加,維護(hù)成為一個(gè)基本問(wèn)題,特別是當(dāng)您必須為每個(gè)蜘蛛處理許多不同的解析規(guī)則時(shí),有許多異常,但也希望重用公共處理器。

項(xiàng)目加載器旨在減輕解析規(guī)則的維護(hù)負(fù)擔(dān),而不會(huì)失去靈活性,同時(shí)為擴(kuò)展和重寫規(guī)則提供了方便的機(jī)制。因此,項(xiàng)目加載器支持傳統(tǒng)的Python類繼承來(lái)處理特定spider(或spider組)的差異。

例如,假設(shè)某個(gè)特定站點(diǎn)用三個(gè)破折號(hào)(例如 ?---Plasma TV---? )你不想最后在最終的產(chǎn)品名稱中刪除這些破折號(hào)。

下面介紹如何通過(guò)重用和擴(kuò)展默認(rèn)的產(chǎn)品項(xiàng)加載器來(lái)刪除這些破折號(hào)。 (?ProductLoader? ):

from itemloaders.processors import MapCompose
from myproject.ItemLoaders import ProductLoader

def strip_dashes(x):
    return x.strip('-')

class SiteSpecificLoader(ProductLoader):
    name_in = MapCompose(strip_dashes, ProductLoader.name_in)

擴(kuò)展項(xiàng)加載器非常有用的另一種情況是當(dāng)您有多個(gè)源格式時(shí),例如XML和HTML。在XML版本中,您可能希望刪除 ?CDATA? 發(fā)生。下面是一個(gè)如何操作的示例:

from itemloaders.processors import MapCompose
from myproject.ItemLoaders import ProductLoader
from myproject.utils.xml import remove_cdata

class XmlProductLoader(ProductLoader):
    name_in = MapCompose(remove_cdata, ProductLoader.name_in)

這就是您通常如何擴(kuò)展輸入處理器的方法。

對(duì)于輸出處理器,在字段元數(shù)據(jù)中聲明它們更為常見,因?yàn)樗鼈兺ǔV灰蕾囉谧侄?,而不依賴于每個(gè)特定的站點(diǎn)解析規(guī)則(與輸入處理器一樣)。參見: 聲明輸入和輸出處理器 .

有許多其他可能的方法來(lái)擴(kuò)展、繼承和重寫項(xiàng)加載器,不同的項(xiàng)加載器層次結(jié)構(gòu)可能更適合不同的項(xiàng)目。??Scrapy??只提供了這種機(jī)制;它不會(huì)強(qiáng)制任何特定的裝載機(jī)集合組織——這取決于您和項(xiàng)目的需要。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)