爬蟲(chóng)必備技能 xpath 用法和實(shí)戰(zhàn)

環(huán)境配置

python3
requests
scrapy

在安裝 scrapy 之前需要先安裝Twisted(點(diǎn)擊下載) 下載符合自己版本的Twisted撩笆,然后將其放入 python 安裝目錄中霸奕,先使用命令安裝 pip install Twisted禁灼。安裝完之后,scrapy 就很容易安裝了囤锉,安裝命令如下:pip install scrapy偷溺。

image

本文要點(diǎn)

1.xpath 基本語(yǔ)法和用法示例

2.使用 xpath 爬取《盜墓筆記》實(shí)例

xpath 基本語(yǔ)法

xpath哄孤,全稱(chēng) XML Path Language,即 XML 路徑語(yǔ)言胸私,它是一門(mén)在 XML 文檔中查找信息的語(yǔ)言厌处。

xpath的選擇功能十分強(qiáng)大,它提供了非常簡(jiǎn)潔明了的路徑選擇表達(dá)式岁疼,幾乎所有我們想要定位的節(jié)點(diǎn)都可以用xpath來(lái)選擇阔涉。首先我們來(lái)看下xpath的基本語(yǔ)法。

image
image

在這里列出了 xpath 的常用匹配規(guī)則五续,例如 / 代表選取直接子節(jié)點(diǎn)洒敏,// 代表選擇所有子孫節(jié)點(diǎn)龄恋,. 代表選取當(dāng)前節(jié)點(diǎn)疙驾, .. 代表選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn),@ 則是加了屬性的限定郭毕,選取匹配屬性的特定節(jié)點(diǎn)它碎。

xpath 用法舉例

接下來(lái)我們以豆瓣電影為例子,來(lái)熟悉一下 xpath 基本用法:

打開(kāi)網(wǎng)頁(yè) https://movie.douban.com/top250

image

豆瓣電影 top250爬蟲(chóng)

首先需要找到我們所匹配的內(nèi)容在 html 中的位置显押。

從圖片中可以看到排名第一的電影標(biāo)題是在標(biāo)簽為 div,class 屬性為 hd 中的 a 標(biāo)簽中所有的span*標(biāo)簽里面扳肛!

然后我們需要一級(jí)一級(jí)往上面找,因?yàn)檫@個(gè)層級(jí)太深了乘碑,有時(shí)候會(huì)匹配不到我們所需要的內(nèi)容挖息。

我們最開(kāi)始匹配的標(biāo)簽要滿足它的所有特征加起來(lái)是唯一的。

很容易看到屬性為 article 正是我們所需要的標(biāo)簽兽肤!因?yàn)檎也坏降诙€(gè) div 標(biāo)簽且 class 屬性為 article 的標(biāo)簽套腹!

獲取電影標(biāo)題語(yǔ)法如下,因?yàn)槭俏谋緝?nèi)容资铡,所以要用 text()

html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a//span[1]/text()")

同理电禀,我們獲取電影詳情鏈接的語(yǔ)法,因?yàn)槭菍傩裕砸?strong>@屬性值:

html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a/@href")

我們可以將其加入到爬蟲(chóng)代碼中笤休,效果如下:

使用 xpath 爬取盜墓筆記

目標(biāo)地址:

盜墓筆記全篇 http://seputu.com/

總體思路:

1.分析網(wǎng)頁(yè)結(jié)構(gòu)尖飞,取出我們需要的標(biāo)題,以及下一步需要用到的鏈接

2.根據(jù)章節(jié)的鏈接地址店雅,再爬取出章節(jié)小說(shuō)

首先分析我們需要爬取的內(nèi)容政基,在網(wǎng)頁(yè)中的位置。

image

經(jīng)過(guò)上面的講解闹啦,相信大家很容易就可以寫(xiě)出xpath的語(yǔ)法腋么。因?yàn)槲覀兪且廊∷行≌f(shuō)內(nèi)容,所以我們要循環(huán)所有li標(biāo)簽里面的內(nèi)容亥揖!

html.xpath(".//div[@class='box']/ul//li")

遍歷這個(gè)列表珊擂,取出我們所需要的章節(jié)圣勒,詳細(xì)鏈接


li_list = selector.xpath(".//div[@class='box']/ul//li")

for text in li_list:
    title = text.xpath("./a/text()").extract_first('')
    href = text.xpath('./a/@href').extract_first('')

接下來(lái),從詳情鏈接中取出小說(shuō)內(nèi)容摧扇,即完成了這個(gè)小爬蟲(chóng)圣贸!

image
p_list = selector.xpath(".//div[@class='content-body']//p")
for data in p_list:
    content += data.xpath("./text()").extract_first('')

最重要的分析部分完成了,接下來(lái)主要就是將所有的內(nèi)容放入代碼中扛稽,然后保存到本地就完成了吁峻。

image

最終爬蟲(chóng)代碼如下:

# coding: utf-8
from scrapy import Selector
import requests


class KeyEnum(object):
    TITLE = "title"
    CONTENT = "content"
    HREF = "href"


class NovelSpider(KeyEnum):

    def __init__(self):
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                          "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
        }

    def spider(self):
        url = 'http://seputu.com/'
        response = requests.get(url, headers=self.headers)
        selector = Selector(text=response.content)
        data_list = []
        li_list = selector.xpath(".//div[@class='box']/ul//li")  # 章節(jié)列表
        for text in li_list:
            title = text.xpath("./a/text()").extract_first('')  # 標(biāo)題
            href = text.xpath('./a/@href').extract_first('')  # 鏈接
            content = self._content_spider(href)  # 詳情頁(yè)面爬蟲(chóng)
            data_list.append(
                {
                    KeyEnum.HREF: href,
                    KeyEnum.TITLE: title,
                    KeyEnum.CONTENT: content,
                }
            )

        return data_list

    def _content_spider(self, url):
        content = ''

        for _ in range(5):  # 因?yàn)闆](méi)用代理,如果失敗在张,再重試5次
            if url:  # 加個(gè)url是否為空的判斷
                response = requests.get(url, headers=self.headers)
                if response.status_code != 200:
                    continue
                selector = Selector(text=response.content)

                p_list = selector.xpath(".//div[@class='content-body']//p")
                for data in p_list:
                    content += data.xpath("./text()").extract_first('')

            return content

    def main(self):
        data_list = self.spider()
        for i in data_list:
            with open('盜墓筆記.txt', 'a', encoding='utf-8')as f:
                f.write(i['content'])


if __name__ == '__main__':
    spider = NovelSpider()
    spider.main()

總結(jié)

本文主要介紹了 python 中解析庫(kù) xpath 的使用方法和示例用含,用法其實(shí)很簡(jiǎn)單,關(guān)鍵在于多多練習(xí)帮匾!下篇文章打算分享另一個(gè)解析庫(kù) css 的用法啄骇,以及和 xpath 之間的區(qū)別,歡迎關(guān)注瘟斜!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缸夹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子螺句,更是在濱河造成了極大的恐慌虽惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇尚,死亡現(xiàn)場(chǎng)離奇詭異芽唇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)取劫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)匆笤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人勇凭,你說(shuō)我怎么就攤上這事疚膊。” “怎么了虾标?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵寓盗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我璧函,道長(zhǎng)傀蚌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任蘸吓,我火速辦了婚禮善炫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘库继。我一直安慰自己箩艺,他們只是感情好窜醉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著艺谆,像睡著了一般榨惰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上静汤,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天琅催,我揣著相機(jī)與錄音,去河邊找鬼虫给。 笑死藤抡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抹估。 我是一名探鬼主播缠黍,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼棋蚌!你這毒婦竟也來(lái)了嫁佳?” 一聲冷哼從身側(cè)響起挨队,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谷暮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后盛垦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體湿弦,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年腾夯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颊埃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝶俱,死狀恐怖班利,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情榨呆,我是刑警寧澤罗标,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站积蜻,受9級(jí)特大地震影響闯割,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竿拆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一宙拉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丙笋,春花似錦谢澈、人聲如沸煌贴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崔步。三九已至,卻和暖如春缎谷,著一層夾襖步出監(jiān)牢的瞬間井濒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工列林, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瑞你,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓希痴,卻偏偏與公主長(zhǎng)得像者甲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砌创,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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