xpath爬取百度搜尋結果
- 1. 需求背景
- 2. xpath文法
- 3. 實戰操作
- 3.1 分析頁面資訊
- 3.2 共用代碼
- 3.3 手動輸入Xpath文法
- 3.4 手動copy Xpath文法
- 4. 全部代碼
1. 需求背景
純粹是為了練習一下手動copy Xpath文法和手寫輸入Xpath文法之間的對比,前期準備,需要安裝lxml和requests庫
pip install requests lxml
2. xpath文法
簡單的三個小點:
//
相對路徑
/
絕對路徑
@
選擇屬性
實用的五個方法,如下
序号 | 舉例 | 應用 |
① contains() | //div[contains(@id,‘in’)] | 選擇标簽的時候常用 |
② text() | //a[text()=‘baidu’] | 直接擷取文本 |
③ starts-with() | //div[starts-with(@id,‘in’)] | 選擇開始的辨別 |
④ not() | //input[not(contains(@class,‘a’)] | 選擇剔除的辨別 |
⑤ last() | //span/a/span[last()] | 選擇最後一項,selenium中選擇翻頁最後一個按鈕 |
3. 實戰操作
還是以‘python’作為搜尋的關鍵詞,進行有關資訊的爬取
3.1 分析頁面資訊
打開相應的界面,如下
注意,這裡的搜尋内容存在不同的标簽中(标簽為
result c-container
和标簽為
result-op c-container xpath-log
),是以在選擇的時候就可以用到實用方法①的内容
3.2 共用代碼
使用xpath文法擷取之前需要将網頁資訊轉化為可以選取的内容,那麼這一部分對于手動copy Xpath文法或者手動輸入Xpath文法都是一樣的過程,是以是可以共用的
import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Cookie': 'BIDUPSID=82508FD9E8C7F366210EB75A638DF308; PSTM=1567074841; BD_UPN=12314753; BAIDUID=0F2472E83269C89F55EFE0E6B0FEF5A9:FG=1; H_WISE_SIDS=142058_142112_132921_139203_142081_141124_143647_143855_142505_142018_141748_143424_142511_139176_141901_142779_131862_131246_142910_137745_138165_138883_141942_127969_140066_142905_140593_134047_143059_141807_140351_143470_143275_141930_131423_107312_140986_138596_139884_143477_140913_143549_141102_110085; BDUSS=FFQmx0SVFlVjJqdHBIc0tkRTZUOVJKfmotMnY5dU1WYUpPfjhoUTZnU2Qzd0pmRVFBQUFBJCQAAAAAAAAAAAEAAABQontKTWlzc2Fst-gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ1S216dUtteTz; MCITY=-%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; ispeed_lsm=2; H_PS_645EC=cf552cnaA948r4Z3SxcPHhp5RSadAH1Ub95%2BXYc%2FnEzqueJzigDPiyFKU%2BGrNsTbM2UI; BD_HOME=1; H_PS_PSSID=31624_1442_31325_21087_31253_32045_31715_30823_22158; sug=3; sugstore=1; ORIGIN=0; bdime=0'
}
url = 'http://www.baidu.com/s?wd=python&rsv_spt=1&rsv_iqid=0xeed810a9001e6895&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ts_1&rsv_btype=t&rsv_t=57c5siBk05bcHb4BPjbcKLMdz3LBQHqZaqvo%2BNf%2FlbX84n%2BS5jxTw%2B4bNPeM2dkOdpGd&oq=python&rsv_pq=a3612735003f993f&prefixsug=python&rsp=1&rsv_sug9=es_0_1&rsv_sug=9'
html = requests.get(url, headers = headers)
soup = etree.HTML(html.text)
3.3 手動輸入Xpath文法
代碼如下,首先是要定位一個父标簽,然後選擇含有‘result’的子标簽,最後所擷取的内容就是在這裡面了
titles = soup.xpath("//div[@id='content_left']/div[contains(@class,'result')]")
for i in titles:
title = i.xpath('h3/a/text()') #這裡h3之前不能添加下劃線
print(''.join(title).strip())
→ 輸出的結果為:
Welcome to .org官方
基礎教程 | 菜鳥教程
(計算機程式設計語言)_百度百科
5年 功力,總結了 10 個開發技巧
教程 - 廖雪峰的官方網站
環境搭建 | 菜鳥教程
你都用 來做什麼? - 知乎
基礎教程,入門教程(非常詳細)
3 * 和 ** 運算符__極客點兒-CSDN部落格
_視訊大全_高清線上觀看
3.4 手動copy Xpath文法
這種方式還是簡單無腦,直接動動滑鼠右鍵然後數數就可以完成xpath文法的輸入,最終獲得想要的資料,擷取方式如下,這裡直接把之前爬取淘寶時候的示例圖拿過來了
代碼如下,可以發現每次複制的Xpath 都是以‘id’為屬性的,是以修改‘id’對應的值就可以擷取想要的目标資料,最後也就是周遊該頁面的資料量即可
for i in range(1,11):
titles = soup.xpath(f'//*[@id="{i}"]/h3/a/text()')
print(''.join(titles).strip())
→ 輸出的結果為:
Welcome to .org官方
基礎教程 | 菜鳥教程
(計算機程式設計語言)_百度百科
5年 功力,總結了 10 個開發技巧
環境搭建 | 菜鳥教程
教程 - 廖雪峰的官方網站
你都用 來做什麼? - 知乎
基礎教程,入門教程(非常詳細)
3 * 和 ** 運算符__極客點兒-CSDN部落格
_視訊大全_高清線上觀看
4. 全部代碼
通過上面兩個結果的輸出,仔細檢視會發現python/Python這個搜尋的關鍵詞不見了,核實一下标簽資訊,發現這個關鍵詞是在單獨的标簽中,如下,如果隻通過 絕對路徑擷取文本資料,隻能擷取上面輸出的結果,不能擷取全部的标題資料
最後完善的全部代碼如下,注意
a
标簽後面是有兩個反斜杠的(
//
相對路徑)
import requests
from lxml import etree
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Cookie': 'BIDUPSID=82508FD9E8C7F366210EB75A638DF308; PSTM=1567074841; BD_UPN=12314753; BAIDUID=0F2472E83269C89F55EFE0E6B0FEF5A9:FG=1; H_WISE_SIDS=142058_142112_132921_139203_142081_141124_143647_143855_142505_142018_141748_143424_142511_139176_141901_142779_131862_131246_142910_137745_138165_138883_141942_127969_140066_142905_140593_134047_143059_141807_140351_143470_143275_141930_131423_107312_140986_138596_139884_143477_140913_143549_141102_110085; BDUSS=FFQmx0SVFlVjJqdHBIc0tkRTZUOVJKfmotMnY5dU1WYUpPfjhoUTZnU2Qzd0pmRVFBQUFBJCQAAAAAAAAAAAEAAABQontKTWlzc2Fst-gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ1S216dUtteTz; MCITY=-%3A; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; ispeed_lsm=2; H_PS_645EC=cf552cnaA948r4Z3SxcPHhp5RSadAH1Ub95%2BXYc%2FnEzqueJzigDPiyFKU%2BGrNsTbM2UI; BD_HOME=1; H_PS_PSSID=31624_1442_31325_21087_31253_32045_31715_30823_22158; sug=3; sugstore=1; ORIGIN=0; bdime=0'
}
url = 'http://www.baidu.com/s?wd=python&rsv_spt=1&rsv_iqid=0xeed810a9001e6895&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_dl=ts_1&rsv_btype=t&rsv_t=57c5siBk05bcHb4BPjbcKLMdz3LBQHqZaqvo%2BNf%2FlbX84n%2BS5jxTw%2B4bNPeM2dkOdpGd&oq=python&rsv_pq=a3612735003f993f&prefixsug=python&rsp=1&rsv_sug9=es_0_1&rsv_sug=9'
html = requests.get(url, headers = headers)
soup = etree.HTML(html.text)
#手寫Xpath文法
titles = soup.xpath("//div[@id='content_left']/div[contains(@class,'result')]")
for i in titles:
title = i.xpath('h3/a//text()') #這裡第一個下劃線都不能添加
print(''.join(title).strip())
#這種是手寫xpath文法,還有複制粘貼的方式
#手動copy Xpath文法
for i in range(1,11):
titles = soup.xpath(f'//*[@id="{i}"]/h3/a//text()')
print(''.join(titles).strip())
#這種是直接複制粘貼的,要想獲得全部的資料,就需要使用新相對路徑