Scrapy文檔翻譯--CrawlSpider

非全文翻譯淋淀,僅翻譯部分重要功能介紹
文檔翻譯自Scrapy 1.5.1
scrapy documentation

CrawlSpider: scrapy.spider.CrawlSpider
是scrapy提供的幾個常用爬蟲類之一勤庐,常用來做通用爬蟲的開發(fā)招刹。可以通過定義一組Rules來追蹤所需要的鏈接。優(yōu)點是便利衰腌,只需要很少的代碼就可以實現(xiàn)一個全站爬蟲。缺點是不一定能滿足對特定網(wǎng)站的爬取需求觅赊。如果有需要右蕊,可以根據(jù)需求重寫它的方法、屬性來獲得更多的自定義功能吮螺。
除了從Spider繼承的屬性饶囚,此類還有一個新的屬性:

  • rules

它是一個或多個Rule對象組成的列表帕翻。每個Rule定義用于爬取網(wǎng)點的特定行為。如果多個規(guī)則都匹配到相同的鏈接萝风,則將根據(jù)它們在Rule中定義的順序使用第一個規(guī)則嘀掸。

此外,這個Spider還提供了一個可重寫的方法:

  • parse_start_url(response)
scrapy.spider.Rule
class srapy.spiders.Rules(link_extractor, callback=None, cb_kwargs=None, follow=None, process_link=None, process_request=None)

link_extractor是一個Link Extractor對象规惰,它定義從每個已爬取網(wǎng)頁中提取哪些鏈接睬塌。
callback 是一個可調(diào)用的方法或者一個字符串(將使用具有該名稱的spider對象的方法)為使用指定link_extractor對象提取的每個鏈接調(diào)用。此回調(diào)函數(shù)接受response并作為其第一個參數(shù)歇万,并且必須返回Item和/或Request對象(或其任何子類)的列表揩晴。
警告

編寫crawl spider rules時,避免使用parse作為回調(diào)函數(shù)贪磺,因為CrawlSpider使用parse方法本身來實現(xiàn)其主要邏輯硫兰。如果覆蓋了該parse方法,則crawl spider將不再起作用寒锚。

cb_kwargs是一個包含要傳遞給callback函數(shù)關(guān)鍵字的參數(shù)的dict劫映。

follow是一個布爾值,它指定是否應(yīng)該從使用此規(guī)則提取的每個響應(yīng)中繼續(xù)跟蹤鏈接壕曼。如果callback存在苏研,則follow默認為True,否則默認為False腮郊。

process_links是一個可調(diào)用的方法摹蘑,或一個字符串(將使用具有該名稱的spider對象的方法),將使用指定的每個response提取的每個鏈接列表調(diào)用該方法link_extractor轧飞。主要目的是用于過濾衅鹿。

process_request是一個可調(diào)用的方法,或一個字符串(將使用具有該名稱的spider對象的方法)过咬,該方法將在此rule提取的每個request中調(diào)用大渤,并且必須返回請求或None(用于過濾請求)

CrawlSpider示例

官方示例:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        # Extract links matching 'category.php' (but not matching 'subsection.php')
        # and follow links from them (since no callback means follow=True by default).
        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.logger.info('Hi, this is an item page! %s', response.url)
        item = scrapy.Item()
        item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
        item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
        item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
        return item

這個Spider會開始抓取example.comde的主頁,收集類別鏈接和項目鏈接掸绞,使用該parse_item方法解析后者泵三。對于每個項目的response,將使用XPath從HTML中提取一些數(shù)據(jù)并填充Item衔掸。

重點補充:LinkExtractor

LinkExtractor對象烫幕,其唯一目的是從scrapy.http.Response中提取符合規(guī)則的鏈接。

內(nèi)置link extractors參考

scrapy.linkextractors模塊中提供了與scrapy捆綁在一起的LinkExtractor類敞映。
默認的link extractor是LinkExtractor较曼,它與以下內(nèi)容相同LxmlLinkExtractor:

from scrapy.linkextractors import LinkExtractor

以前版本的scrapy中曾包含過其他link extractor(鏈接提取器)類,但已經(jīng)棄用振愿。

LxmlLinkExtractor

class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow =()捷犹,deny =()弛饭,allow_domains =(),deny_domains =()萍歉,deny_extensions = None侣颂,restrict_xpaths =(),restrict_css =()枪孩,tags =('a'横蜒,'area'),attrs = ('href'销凑,),canonicalize = False仅炊,unique = True斗幼,process_value = None,strip = True )

LxmlLinkExtractor是官方推薦的link extractor抚垄,具有很多方便過濾的選項蜕窿,是使用lxml強大的HTMLParse實現(xiàn)的。

參數(shù)

  • allow(正則表達式(或列表)):URL必須匹配才能被提取呆馁。如果沒有給出(或為空)桐经,它將匹配所有鏈接。
  • deny(正則表達式(或列表)):URL必須匹配才能排除浙滤。它將優(yōu)于allow參數(shù)阴挣。如果沒有給出(或為空),它將不排除任何鏈接
  • allow_domains(str或list):單個值或者包含域的字符串列表纺腊,用于提取鏈接畔咧。
  • deny_domains(str或list):單個值或者包含域的字符串列表,用于忽略提取鏈接的揖膜。
  • deny_extensions*(list):包含擴展名的單個值或字符串列表誓沸,用于提取鏈接時忽略的擴展名鏈接,如果沒有給出壹粟,將默認為scrapy.linkextractors包IGNORED_EXTENSIONS中定義的列表 *
  • restrict_xpaths(str或list):是一個XPath(str或list)拜隧,定義response中應(yīng)從中提取鏈接的區(qū)域。如果給定趁仙,則僅掃描由這些XPath選擇的內(nèi)容中提取鏈接洪添。
  • restrict_css(str或list),定義response中應(yīng)從中提取鏈接的區(qū)域幸撕。如果給定薇组,則僅掃描由這些CSS選擇的內(nèi)容中提取鏈接。
  • tags(str或list):提取鏈接時的標簽或標簽列表坐儿,默認為('a','area')
  • attrs(list):查找要提取的鏈接時應(yīng)考慮的屬性或?qū)傩粤斜?僅適用于tags參數(shù)中指定的標簽)律胀。默認為('href',)
  • canonicalize(boolean)- 規(guī)范每個提取的url(使用w3lib.url.canonicalize_url)宋光。默認為False。canonicalize_url用于重復(fù)檢查; 它可以更改服務(wù)器端可見的URL炭菌,因此對于具有規(guī)范化和原始URL的請求罪佳,響應(yīng)可能不同。如果您使用LinkExtractor跟蹤鏈接黑低,則保持默認值使爬蟲更加健壯canonicalize=False赘艳。
  • unique(boolean):是否應(yīng)對提取的鏈接應(yīng)用重復(fù)過濾
  • process_value(callable):接收從標簽中提取的每個值和掃描的屬性的函數(shù),可以修改該值并返回一個新值克握,或者返回None完全忽略該鏈接蕾管。如果沒有給出,process_value默認為菩暗。lambda x: x

例如要從此代碼中提取鏈接:

<a href="javascript:goToPage('../other/page.html'); return false">Link text</a>

你可以使用以下功能process_value:

def process_value(value):
    m = re.search("javascript:goToPage\('(.*?)'", value)
    if m:
        return m.group(1)
  • strip(boolean):是否從提取的屬性中去除空格掰曾。根據(jù)HTML5標準,前導(dǎo)和尾部空格必須從被剝離href的屬性<a>停团,<area>以及許多其他的元素旷坦,src屬性<img>,<iframe> 元件等佑稠,所以LinkExtractor默認去除空格字符秒梅。設(shè)置strip=False為關(guān)閉它(例如,如果您從允許前導(dǎo)/尾隨空格的元素或?qū)傩灾刑崛RL)舌胶。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捆蜀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辆琅,更是在濱河造成了極大的恐慌漱办,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婉烟,死亡現(xiàn)場離奇詭異娩井,居然都是意外死亡,警方通過查閱死者的電腦和手機似袁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門洞辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昙衅,你說我怎么就攤上這事扬霜。” “怎么了而涉?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵著瓶,是天一觀的道長。 經(jīng)常有香客問我啼县,道長材原,這世上最難降的妖魔是什么沸久? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮余蟹,結(jié)果婚禮上卷胯,老公的妹妹穿的比我還像新娘。我一直安慰自己威酒,他們只是感情好窑睁,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葵孤,像睡著了一般担钮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尤仍,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天裳朋,我揣著相機與錄音,去河邊找鬼吓著。 笑死,一個胖子當著我的面吹牛送挑,可吹牛的內(nèi)容都是我干的绑莺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惕耕,長吁一口氣:“原來是場噩夢啊……” “哼纺裁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起司澎,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤欺缘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后挤安,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谚殊,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年蛤铜,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫩絮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡围肥,死狀恐怖剿干,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穆刻,我是刑警寧澤置尔,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站氢伟,受9級特大地震影響榜轿,放射性物質(zhì)發(fā)生泄漏幽歼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一差导、第九天 我趴在偏房一處隱蔽的房頂上張望试躏。 院中可真熱鬧,春花似錦设褐、人聲如沸颠蕴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犀被。三九已至,卻和暖如春外冀,著一層夾襖步出監(jiān)牢的瞬間寡键,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工雪隧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留西轩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓脑沿,卻偏偏與公主長得像藕畔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庄拇,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容