Scrapy學(xué)習(xí)篇(六)之選擇器

當(dāng)我們?nèi)〉昧司W(wǎng)頁(yè)的response之后嘿辟,最關(guān)鍵的就是如何從繁雜的網(wǎng)頁(yè)中把我們需要的數(shù)據(jù)提取出來(lái),python從網(wǎng)頁(yè)中提取數(shù)據(jù)的包很多池摧,常用的有下面的幾個(gè):

  • BeautifulSoup
    它基于HTML代碼的結(jié)構(gòu)來(lái)構(gòu)造一個(gè)Python對(duì)象淤击, 對(duì)不良標(biāo)記的處理也非常合理裁眯,但是速度上有所欠缺。
  • lxml
    是一個(gè)基于 ElementTree (不是Python標(biāo)準(zhǔn)庫(kù)的一部分)的python化的XML解析庫(kù)(也可以解析HTML)。

你可以在scrapy中使用任意你熟悉的網(wǎng)頁(yè)數(shù)據(jù)提取工具榜贴,但是,scrapy本身也為我們提供了一套提取數(shù)據(jù)的機(jī)制沾鳄,我們稱(chēng)之為選擇器(seletors)箕戳,他們通過(guò)特定的 XPath 或者 CSS 表達(dá)式來(lái)“選擇” HTML文件中的某個(gè)部分。XPath 是一門(mén)用來(lái)在XML文件中選擇節(jié)點(diǎn)的語(yǔ)言代咸,也可以用在HTML上蹈丸。 CSS 是一門(mén)將HTML文檔樣式化的語(yǔ)言。選擇器由它定義呐芥,并與特定的HTML元素的樣式相關(guān)連逻杖。
Scrapy選擇器構(gòu)建于 lxml 庫(kù)之上,這意味著它們?cè)谒俣群徒馕鰷?zhǔn)確性上非常相似思瘟。下面我們來(lái)了解scrapy選擇器荸百。

使用選擇器

scrapy中調(diào)用選擇器的方法非常的簡(jiǎn)單,下面我們從實(shí)例中進(jìn)行學(xué)習(xí)滨攻。
我們還是以博客園首頁(yè)的信息作為例子够话,演示使用選擇器抓取數(shù)據(jù),下圖是首頁(yè)的html信息光绕,我們下面就是抓取標(biāo)題女嘲,鏈接,閱讀數(shù)诞帐,評(píng)論數(shù)欣尼。

import scrapy
from scrapy.selector import Selector

class Cnblog_Spider(scrapy.Spider):

    name = "cnblog"
    allowed_domains = ["cnblogs.com"]
    start_urls = [
     'https://www.cnblogs.com/',
    ]

    def parse(self, response):
        selector = Selector(response=response)
        title = selector.xpath('//a[@class="titlelnk"]/text()').extract()
        link = selector.xpath('//a[@class="titlelnk"]/@href').extract()
        read = selector.xpath('//span[@class="article_comment"]/a/text()').extract()
        comment = selector.xpath('//span[@class="article_view"]/a/text()').extract()
        print('這是title:',title)
        print('這是鏈接:', link)
        print('這是閱讀數(shù)', read)
        print('這是評(píng)論數(shù)', comment)

選擇器的使用可以分為下面的三步:

  1. 導(dǎo)入選擇器from scrapy.selector import Selector
  2. 創(chuàng)建選擇器實(shí)例selector = Selector(response=response)
  3. 使用選擇器selector.xpath()或者selector.css()

當(dāng)然你可以使用xpath或者css中的任意一種或者組合使用,怎么方便怎么來(lái),至于xpath和css語(yǔ)法停蕉,你可以去額外學(xué)習(xí)愕鼓,仔細(xì)觀察钙态,你會(huì)發(fā)現(xiàn)每個(gè)選擇器最后都有一個(gè)extract(),你可以嘗試去掉這個(gè)看一下拒啰,區(qū)別在于驯绎,當(dāng)你沒(méi)有使用extract()的時(shí)候,提取出來(lái)的內(nèi)容依然具有選擇器屬性谋旦,簡(jiǎn)而言之剩失,你可以繼續(xù)使用里面的內(nèi)容進(jìn)行提取下級(jí)內(nèi)容,而當(dāng)你使用了extract()之后册着,提取出來(lái)的內(nèi)容就會(huì)變成字符串格式了拴孤。我們進(jìn)行多級(jí)提取的時(shí)候,這會(huì)很有用甲捏。值得注意的是演熟,選擇器提取出來(lái)的內(nèi)容是放在列表里面的,即使沒(méi)有內(nèi)容司顿,那也是一個(gè)空列表芒粹,下面我們運(yùn)行這個(gè)爬蟲(chóng),你會(huì)發(fā)現(xiàn)內(nèi)容已經(jīng)被提取出來(lái)了大溜。

事實(shí)上化漆,我們可以完全不用那么麻煩,因?yàn)閟crapy為我們提供了選擇器的簡(jiǎn)易用法钦奋,當(dāng)我們需要選擇器的時(shí)候座云,只要一步就可以了,如下:

import scrapy

class Cnblog_Spider(scrapy.Spider):
    name = "cnblog"
    allowed_domains = ["cnblogs.com"]
    start_urls = [
        'https://www.cnblogs.com/',
    ]

    def parse(self, response):
        title = response.xpath('//a[@class="titlelnk"]/text()').extract()
        link = response.xpath('//a[@class="titlelnk"]/@href').extract()
        read = response.xpath('//span[@class="article_comment"]/a/text()').extract()
        comment = response.xpath('//span[@class="article_view"]/a/text()').extract()
        print('這是title:', title)
        print('這是鏈接:', link)
        print('這是閱讀數(shù)', read)
        print('這是評(píng)論數(shù)', comment)

可以看到付材,我們直接使用response.xpath()就可以了朦拖,并沒(méi)有導(dǎo)入什么,實(shí)例化什么厌衔,可以說(shuō)非常方便了璧帝,當(dāng)然直接response.css()一樣可以。

拓展

scrapy為我們提供的選擇器還有一些其他的特點(diǎn)富寿,這里我們簡(jiǎn)單的列舉

  • extract()
    >>> response.xpath('//title/text()')
    [<Selector (text) xpath=//title/text()>]
    >>> response.css('title::text')
    [<Selector (text) xpath=//title/text()>]
    
    前面已經(jīng)提到了睬隶,.xpath() 及 .css() 方法返回一個(gè)類(lèi) SelectorList 的實(shí)例, 它是一個(gè)新選擇器的列表,就是說(shuō)作喘,你依然可以使用里面的元素進(jìn)行向下提取理疙,因?yàn)樗€是一個(gè)選擇器晕城,為了提取真實(shí)的原文數(shù)據(jù)泞坦,我們需要調(diào)用 .extract()
  • extract_first()
    如果想要提取到第一個(gè)匹配到的元素, 可以調(diào)用response.xpath('//span[@class="article_view"]/a/text()').extract_first() 這樣我們就拿到了第一個(gè)匹配的數(shù)據(jù),當(dāng)然砖顷,我們之前提到了選擇器返回的數(shù)據(jù)是一個(gè)列表贰锁,那么你當(dāng)然可以使用response.xpath('//span[@class="article_view"]/a/text()').extract()[0]拿到第一個(gè)匹配的數(shù)據(jù)赃梧,這和response.xpath('//span[@class="article_view"]/a/text()')[0].extract()效果是一樣的,值得注意的是豌熄,如果是空列表授嘀,這兩種方法的區(qū)別就出現(xiàn)了,extract_first()會(huì)返回None锣险,而后面的那種方法蹄皱,就會(huì)因列表為空而報(bào)錯(cuò)。
    除此之外芯肤,我們還可以為extract_first()設(shè)置默認(rèn)值巷折,當(dāng)空列表時(shí),就會(huì)返回一個(gè)我們?cè)O(shè)置的值崖咨,比如:extract_first(default='not-found')锻拘。

結(jié)合正則表達(dá)式

你會(huì)發(fā)現(xiàn),之前我們匹配的閱讀數(shù)击蹲,評(píng)論數(shù)都會(huì)有漢字在里面署拟,如果我們只想提取里面的數(shù)字呢,這個(gè)時(shí)候就可以使用正則表達(dá)式和選擇器配合來(lái)實(shí)現(xiàn)歌豺,比如下面:

import scrapy

class Cnblog_Spider(scrapy.Spider):
    name = "cnblog"
    allowed_domains = ["cnblogs.com"]
    start_urls = [
        'https://www.cnblogs.com/',
    ]

    def parse(self, response):
        read = response.xpath(
                '//span[@class="article_comment"]/a/text()').re('\d+')
        comment = response.xpath(
                '//span[@class="article_view"]/a/text()').re('\d+')
        print('這是閱讀數(shù)', read)
        print('這是評(píng)論數(shù)', comment)

運(yùn)行一下推穷,可以看到,效果就出來(lái)了世曾。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缨恒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子轮听,更是在濱河造成了極大的恐慌骗露,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件血巍,死亡現(xiàn)場(chǎng)離奇詭異萧锉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)述寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)柿隙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鲫凶,你說(shuō)我怎么就攤上這事禀崖。” “怎么了螟炫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵波附,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)掸屡,這世上最難降的妖魔是什么封寞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮仅财,結(jié)果婚禮上狈究,老公的妹妹穿的比我還像新娘。我一直安慰自己盏求,他們只是感情好抖锥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著碎罚,像睡著了一般宁改。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魂莫,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天还蹲,我揣著相機(jī)與錄音,去河邊找鬼耙考。 笑死谜喊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倦始。 我是一名探鬼主播斗遏,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鞋邑!你這毒婦竟也來(lái)了诵次?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枚碗,失蹤者是張志新(化名)和其女友劉穎逾一,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肮雨,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遵堵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怨规。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陌宿。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖波丰,靈堂內(nèi)的尸體忽然破棺而出壳坪,到底是詐尸還是另有隱情,我是刑警寧澤掰烟,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布爽蝴,位于F島的核電站扩灯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霜瘪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一惧磺、第九天 我趴在偏房一處隱蔽的房頂上張望颖对。 院中可真熱鬧,春花似錦磨隘、人聲如沸缤底。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)个唧。三九已至,卻和暖如春设预,著一層夾襖步出監(jiān)牢的瞬間徙歼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工鳖枕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魄梯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓宾符,卻偏偏與公主長(zhǎng)得像酿秸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魏烫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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

  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲(chóng)模...
    陳思煜閱讀 12,668評(píng)論 4 46
  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬蟲(chóng)入門(mén)教程一 安裝和基本使用Scr...
    inke閱讀 15,385評(píng)論 6 12
  • scrapy是python最有名的爬蟲(chóng)框架之一辣苏,可以很方便的進(jìn)行web抓取,并且提供了很強(qiáng)的定制型哄褒,這里記錄簡(jiǎn)單學(xué)...
    bomo閱讀 2,097評(píng)論 1 11
  • 姓名:童濤 學(xué)號(hào):16020150020 嵌牛導(dǎo)讀:共享經(jīng)濟(jì)的熱潮讓諸多產(chǎn)業(yè)都開(kāi)始蹭“共享”的熱點(diǎn)稀蟋,比如共享籃球、...
    童小濤閱讀 267評(píng)論 0 0
  • 戰(zhàn)爭(zhēng)的硝煙呐赡,在糊治,慢慢的散去 可八十多年前一幕,依舊罚舱,歷歷在目 那是一個(gè)國(guó)度的危難 那關(guān)系到一個(gè)民族的井辜,生死存亡 你...
    麒帆閱讀 292評(píng)論 0 13