python3 xpath_Python3使用Xpath解析网易云音乐歌手页面
Xpath最初被設計用來搜尋XML文檔,但它同樣適用于HTML文檔的搜索。通過簡潔明了的路徑選擇表達式,它提供了強大的選擇功能;同時得益于其內置的豐富的函數,它可以匹配和處理字符串、數值、時間等數據格式,幾乎所有節點我們都可以通過Xpath來定位。
在Python中,lxml庫為我們提供了完整的Xpath選擇器,今天我們就用它來學習Xpath的使用,我們的目標是用最少的時間來掌握使用頻率最高的核心技能,而這些核心技能基本上可以滿足我們網頁抓取的需求。
畢竟我們不是單獨在使用Xpath,在Python中,很多數據處理和匹配的工作我們可以用更加“Python”、更加通用的方法來解決,沒必要為了5%的使用而花費數倍的時間。
我們都知道,在很多領域里,從0到80分只需要花費很少的時間,從80分到95分則可能會花費上一階段的數倍時間,至于從95分往上,每一分的提高都可能需要巨大的時間成本。我們需要權衡最初的學習訴求、收獲和時間成本的匹配度等,以判斷我們要到達哪一個水平,并規劃出對應的學習方案。
我學習爬蟲的目的并不是成為一個精通網絡爬蟲的大師,而是將它作為一個工具,用來幫助我更好地進行數據挖掘分析的工作。因此,在學習過程中會盡可能地功力,力求以最少的時間掌握最核心的技能。Xpath簡直是針對這種學習思路設計的,因為它太容易上手了,核心功能只需要十分鐘就可以熟練掌握,而那多達上百的函數對我們來說可能一輩子都用不到幾回。
一、Xpath常用規則
下表是最常用的Xpath規則,絕大多數的Xpath表達式都由它們構成。
| 表達式 | 描述 | | :-: | :-: | | nodename | 選取此節點的所有子節點 | | / | 從當前節點直接選取子節點 | | // | 從當前節點選取所有子孫節點 | | . | 選取當前節點 | | .. | 選取當前節點的父節點 | | @ | 選取屬性 |
二、抓取趙雷熱門作品頁面
單純的羅列簡直是耍流氓,實戰才是硬道理。正如標題所言,今天我們就使用Xpath來解析網易云音樂的歌手頁面。我個人很喜歡趙雷,那我們就先嘗試解析一下趙雷的熱門作品。
網易云音樂抓取難度較低,沒有亂七八糟的驗證,抓取的時候我們只需要帶上header就可以成功獲取我們需要的內容了。
首先,我們打開網易云音樂的首頁,搜索并進入趙雷的頁面。右鍵檢查并切換到Network選項卡,刷新一下,就看到了一大串網絡請求,我們要做的就是從中定位到歌曲列表所在的請求。
我們優先看document類的文件,第一個打開后通過preview可以看到這里是通用內容,包含了一些網易云音樂的信息,那么接下來我們看下邊這個紅框里的請求,首先請求名稱里包含了artist以及一個對應的id,看起來有點像。
接下來我們單擊進去看看:
我們成功看到了趙雷的熱門作品列表,說明我們找對了位置。我們同樣可以通過在response里搜索來確定這一請求是否是我們尋找的那一個。比如我們搜索“成都”、“南方姑娘”等,來看下我們的歌曲列表是不是在這個response中。
確定了請求之后,我們就需要抓取并解析了。首先我們切換到Headers選項,在General下找到Request URL作為請求連接;然后在Request Headers下找到‘User-Agent’,并將其復制下來用作模擬瀏覽器發起請求。
接下來我們嘗試抓取頁面:
import requests
url = 'https://music.163.com/artist?id=6731'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
html = requests.get(url, headers=headers)
print(html.status_code)
結果如下:200
這說明我們的請求成功了,接下來我們看下html的內容是否符合要求:
print(html.text)
這里打印的結果太長就不貼出來了,我們可以把打印的內容和剛才那個請求返回的結果做一個比對,看是不是一樣的內容。通過觀察,我們發現這就是我們需要的內容。
三、解析熱門作品列表
1. 構建對象
那么接下來就要解析了,解析之前,我們需要先使用lxml構建我們需要的對象:
from lxml import etree
result = etree.HTML(html.text)
print(type(result))
print(result)
輸出為:
2. 子節點、子孫節點、屬性過濾、文本選取
然后我們觀察網頁,定位到歌單位置:
我們發現歌曲列表藏在一個
- 標簽中,這個標簽擁有class="f-hide"屬性;
- 標簽中嵌套了一個
- 標簽;
- 標簽中又嵌套了一個標簽,這個標簽有個href屬性,其值為每首歌的相對鏈接,而歌曲名稱就在標簽對應的文本中。
好了,接下來我們構建Xpath路徑選擇表達式:
song_list = result.xpath('//ul[@class="f-hide"]/li/a/text()')
print(song_list)
看下輸出:['成都', '南方姑娘', '理想', '畫', '我們的時光', '少年錦時', '阿刁', '鼓樓', '三十歲的女人', '無法長大', '八十年代的歌', '十九歲', '彩虹下面', '瑪麗', '讓我偷偷看你', '吉姆餐廳', '朵', '靜下來', '家鄉', '已是兩條路上的人', '未給姐姐遞出的信', '北京的冬天', '孤獨', '小屋', '再也不會去麗江', '再見北京', '媽媽', '夢中的哈德森', '人家', '背影', '窯上路', '浮游', '不開的唇', '開往北京的火車', '趙小雷', '往事只能回味', '愛人你在哪里', '未給姐姐遞出的信 ', 'Over', '民謠', '憑什么說愛你', '逆流而上', '夏天', '米店', '飛來飛去', '朵兒 (Live版)', '何必', '塔吉汗', '月亮粑粑 (Live)']
好,我們成功解析出了歌曲列表。那么接下來我們回頭看一下這個表達式:
首先,我們使用.xpath()方法來調用Xpath表達式;//ul[@class="f-hide"]代表我們選取所有擁有class="f-hide"屬性的
標簽;/li代表在上邊返回的標簽的子節點中選取所有的 - 標簽,/a同理,進一步選取子節點中的
總結
以上是生活随笔為你收集整理的python3 xpath_Python3使用Xpath解析网易云音乐歌手页面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: processing python模式_
- 下一篇: python决策树算法代码_Python