Python爬蟲-xpath
Python爬蟲-xpath
說明
關於Python爬蟲請求資料方面的知識點基本講完,但請求到資料之後呢?
當然是提取資料,抓出對我們有價值的內容是整個爬蟲流程的關鍵步驟之一。現下流行方法有:xapth,BeautifulSoup,正則,PyQuery。如無意外,我會一一筆記下來。今天說說我的最愛吧。
——xpath
再說明
一般情況下,我們爬到的是整個靜態網頁頁面,得到的是html原始碼,包含各種標籤。但那些標籤並非我們想要,如:
我們只需要裡邊的文字,這種時候就可以xpath了。如上所說,類似的解決方法包括正則以及BeautifulSoup,前者難度較大,後者廣受追捧。從解析速度上說,正則最快,xpath次之,BeautifulSoup再次之;從上手難度來說,BeautifulSoup最易,xpath次之,正則再次之。綜合考慮,我偏愛xpath。也有人推崇PyQurey,認為比起繁瑣的“美麗湯”語法,它短小精悍,而且如果使用者是前端工程師,掌握起來不需要耗費任何學習成本。這大概因為PyQurey的語法源於JQurey吧。
外掛推薦
基於chrome瀏覽器的外掛,它可以讓我們提前看到提取效果,使用快捷鍵ctrl+shift+x
語法講述
只說常用的:
1. /
從根節點開始
2. //
從任意位置開始
可以這樣理解兩個的區別,前者從頂端開始,且前者的左右必須是緊鄰的標籤;後者任意位置開始,且左右間的標籤允許存在間隔
3. div/p
div標籤下的p標籤
4. 提取標籤中某個屬性的值 div/img/@某個屬性
5. 確定帶有a屬性且值為b的div標籤//div[@a="b"]
6. 如果需要取出標籤中的文字//span/text()
7. 模糊查詢 //div/a[contains(@某屬性, "對應屬性的部分值")]
8. 多個相同標籤用索引方式定位,表示div下div下的第3個a標籤 ://div/div/a[3]
舉栗子
- 以騰訊社招為例
可以發現tr的class值不同,而屬性href只有數字部分不同,此時想要獲取a標籤中的字串兩種方法
a) 模糊查詢
//tbody/tr/td/a[contains(@href, "position")]
b) “|”或
//tbody/tr[@class="even"]//a | //tbody/tr[@class="odd"]//a
程式碼裡使用
from lxml import etree
# 例項化一個物件
selector = etree.HTML(response.text)
# 通過選擇器進行篩選
result = selector.xpath("規則")
說明:返回的result是列表型別,如果沒有提取到符合規則的資訊會返回空列表
實戰句子迷
頁面呈現如下,要求:獲取每個句子,以及“喜歡”量,以及“評論”數
import requests
from lxml import etree
import json
url = "http://www.juzimi.com/search/node/%E5%82%B2%E6%85%A2%E4%B8%8E%E5%81%8F%E8%A7%81%20type%3Asentence"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
"Referer": "http://www.juzimi.com/search/node/%E5%82%B2%E6%85%A2%E4%B8%8E%E5%81%8F%E8%A7%81%20type%3Asentence",
}
def get_html(params):
"""
獲取html頁面
"""
try:
response = requests.get(url, params=params, headers=headers)
response.raise_for_status()
print(response.url)
print(response.status_code)
except :
print("connection error")
return None
response.encoding = response.apparent_encoding
return response.text
def parse_html(html):
"""
處理html頁面,提取需要資料
"""
data = {}
selector = etree.HTML(html)
# 構建xpath規則
ruler = '//div[@class="view-content"]/div[contains(@class, "views-row")]'
roots = selector.xpath(ruler) #拿到根物件的列表,可以對這個列表中的成員繼續xpath
# 由於這次是在win上測試,所以檔案開啟設定編碼方式為utf-8
with open("sentence.txt", "a", encoding="utf-8") as ob:
for root in roots:
try:
data["sentence"] = root.xpath('./div/div[1]/a/text()')[0] #句子
data["loved"] = root.xpath('./div/div[3]/a/text()')[0] # 喜歡
data["comment"] = root.xpath('./div/div[5]/a/text()')[0] # 評論
except IndexError:
# 處理第一頁的雜質問題
continue
# 關閉預設的ascii編碼
ob.write(json.dumps(data, ensure_ascii=False))
ob.write("\n")
def main():
for i in range(4):
if i:
params = {"page":i}
else:
# 第一頁的url地址比較特別,所以單獨處理
params ={}
html = get_html(params)
if html:
parse_html(html)
print("結束")
if __name__ == "__main__":
main()
結果:
需要的總結:
原本沒打算總結的。原本只是做一次用xpath提取資料的示範。以為像句子迷這樣的小網站爬起來會很容易,確實是,卻也不是。
網頁靜態呈現,需要的資料都可以通過xpath直接拿到。主要遇到的問題是該網站設定了重定向,就是說直接訪問我設定的url地址時,會被重定向到另一個地址去。根據xpath沒拿到返回值這一現象,我列印了實際請求地址,結果顯示的確被重定向了。我當然第一反應關閉了 get請求中的重定向開關。這之後拿不到資料,狀態碼返回302。特地百度一下,302是暫時性重定向的意思,它的危害性比較大,主要是可能被黑客利用進行url劫持,也可能惡意刷網站排名,被建議儘量不用或少用。
正確處理方式:請求報文頭中一定要加Referer
值。老實說,之前也爬過一些大型網站,Referer值從來不帶的,這次是長知識了。
相關文章
- Python爬蟲——XPathPython爬蟲
- Python爬蟲——Xpath和lxmlPython爬蟲XML
- Python爬蟲之XPath語法Python爬蟲
- 爬蟲 – xpath 匹配爬蟲
- Python爬蟲之資料解析(XPath)Python爬蟲
- Python爬蟲:Xpath語法筆記Python爬蟲筆記
- python爬蟲:XPath語法和使用示例Python爬蟲
- Python爬蟲教程-21-xpath 簡介Python爬蟲
- 爬蟲之xpath的使用爬蟲
- 爬蟲---xpath解析(爬取美女圖片)爬蟲
- Python 爬蟲網頁內容提取工具xpath(一)Python爬蟲網頁
- Python 爬蟲網頁內容提取工具xpath(二)Python爬蟲網頁
- 爬蟲解析庫:XPath 輕鬆上手爬蟲
- 基於 go + xpath 爬蟲小案例Go爬蟲
- Python爬蟲基礎講解(七):xpath的語法Python爬蟲
- Python爬蟲教程-22-lxml-etree和xpath配合使用Python爬蟲XML
- 爬蟲實戰:探索XPath爬蟲技巧之熱榜新聞爬蟲
- 爬蟲之xpath精準定位--位置定位爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- 【python爬蟲】python爬蟲demoPython爬蟲
- Datawhale-爬蟲-Task4(學習xpath)爬蟲
- 基於asyncio、aiohttp、xpath的非同步爬蟲AIHTTP非同步爬蟲
- scrapy爬蟲程式xpath中文編碼報錯爬蟲
- python動態網站爬蟲實戰(requests+xpath+demjson+redis)Python網站爬蟲JSONRedis
- Python web自動化爬蟲-selenium/處理驗證碼/XpathPythonWeb爬蟲
- python爬蟲---網頁爬蟲,圖片爬蟲,文章爬蟲,Python爬蟲爬取新聞網站新聞Python爬蟲網頁網站
- Python爬蟲十六式 - 第四式: 使用Xpath提取網頁內容Python爬蟲網頁
- python就是爬蟲嗎-python就是爬蟲嗎Python爬蟲
- python爬蟲Python爬蟲
- python 爬蟲Python爬蟲
- Python爬蟲教程-01-爬蟲介紹Python爬蟲
- Java爬蟲與Python爬蟲的區別?Java爬蟲Python
- python爬蟲初探--第一個python爬蟲專案Python爬蟲
- Python asyncio 爬蟲Python爬蟲
- python爬蟲2Python爬蟲
- Python 爬蟲系列Python爬蟲
- Python爬蟲--2Python爬蟲
- python網路爬蟲_Python爬蟲:30個小時搞定Python網路爬蟲視訊教程Python爬蟲