1. 程式人生 > 其它 >006爬蟲之xpath獲取豬八戒網商家資訊

006爬蟲之xpath獲取豬八戒網商家資訊

今天來學習一個之後會一直用到的解析方式:xpath,這個是重點,必須會。
首先我們需要安裝lxml模組:

pip install lxml

用法:

1、將要解析的html內容構造出etree物件;
2、使用etree物件的xpath()方法配合xpath表示式來完成對資料的提取。

我們先來看看xpath的語法,首先給出一組網頁的結構:

<book>
    <id>1</id>
    <name>野花遍地香</name>
    <price>1.23</price>
    <nick>臭豆腐</nick>
    <author>
        <nick id="10086">周大強</nick>
        <nick id="10010">周芷若</nick>
        <nick class="jay">周杰倫</nick>
        <nick class="jolin">蔡依林</nick>
        <div>
            <nick>惹了</nick>
        </div>
    </author>
    <partner>
        <nick id="ppc">胖胖陳</nick>
        <nick id="ppbc">胖胖不陳</nick>
    </partner>
</book>

可以看到網頁的原始碼都是按照這種層級式的方式編寫的,接下來看xpath的語法:

/book   /表示根節點
/book/name   在xpath裡中間的/表示下一級節點
/book/name/text()  text()表示拿文字,預設是一個列表,在後面加[0]表示提取列表中的第一個
/book//nick  //表示所有的子孫後代
/book/*/nick/text()  *是萬用字元,表示下一節點都可以
/book/author/nick[@class='jay']/text()  []表示屬性篩選,@屬性值=值
/book/partner/nick/@id  最後一個/表示拿到nick裡面的id的內容,@屬性,可以直接拿到屬性的值

接下來我們簡單看一個處理網頁的程式碼:

# xpath處理HTML
from lxml import etree

html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Title</title>
</head>
<body>
    <ul>
        <li><a href="http://www.baidu.com">百度</a></li>
        <li><a href="http://www.google.com">谷歌</a></li>
        <li><a href="http://www.sogou.com">搜狗</a></li>
    </ul>
    <ol>
        <li><a href="feiji">飛機</a></li>
        <li><a href="dapao">大炮</a></li>
        <li><a href="huoche">火車</a></li>
    </ol>
    <div class="job">李嘉誠</div>
    <div class="common">胡辣湯</div>
</body>
</html>
"""

et = etree.HTML(html)
li_list = et.xpath("//li")
for li in li_list:
    href = li.xpath("./a/@href")[0] # ./表示當前節點
    text = li.xpath("./a/text()")[0]
    print(text, href)
    # 後續的爬蟲工作可以繼續。。。

執行結果如下:

以上就是xpath的基本語法,可以多多練習,後面基本都是用這個去提取資料。接下來我們看一個實際的例子,那就是爬取豬八戒網的相關資訊。
爬取的網址為:https://beijing.zbj.com/search/f/?type=new&kw=saas&r=2
爬取的內容為:商家標的價格、服務內容、銷量、公司名稱

抓取的思路其實和用正則表示式是一樣的,第一步先獲取頁面原始碼,第二步通過解析頁面原始碼獲取想要的資訊,下面是具體的程式碼:

"""
1. 拿到頁面原始碼
2. 從頁面原始碼中提取你需要的資料,價格,名稱,公司名稱
"""
import requests
from lxml import etree

url = "https://beijing.zbj.com/search/f/?type=new&kw=saas&r=2"
resp = requests.get(url)
resp.encoding = "utf-8"
# print(resp.text)

# 提取資料
et = etree.HTML(resp.text)
divs = et.xpath("//div[@class='search-result-list-service search-result-list-service-width']/div")

for div in divs:
    # 此時的div就是一條資料,對應一個商品資訊
    # price = div.xpath("./div/div[2]/div[1]/span/text()") # 這裡存在一個問題就是第一個和第二個取的時候存在差異,可以用下面的語句解決
    # 商品價格
    price = div.xpath("./div//div[@class='bot-content']/div[1]/span/text()")[0]
    # 服務名稱
    serve_name = "_".join(div.xpath("./div//div[@class='bot-content']/div[2]/a/text()"))
    # 售出數量
    sale_num = div.xpath("./div/div[@class='bot-content']/div[4]/div[2]/div/span[2]/text()")[0]
    # 公司名稱
    company = div.xpath("./div/a/div[2]/div/div/text()")[0]
    print(company, serve_name, price, sale_num)

這個網頁的原始碼有2萬多行,我們只用快速定位到自己想要的內容,然後摘出來,再進一步進行解析,裡面有一點需要注意的是第一個和第二個取的時候存在差異,需要向我上面那樣進行處理,最終結果如下: