006爬蟲之xpath獲取豬八戒網商家資訊
阿新 • • 發佈:2022-12-10
今天來學習一個之後會一直用到的解析方式: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萬多行,我們只用快速定位到自己想要的內容,然後摘出來,再進一步進行解析,裡面有一點需要注意的是第一個和第二個取的時候存在差異,需要向我上面那樣進行處理,最終結果如下: