天天看點

【爬蟲高階】使用xpath文法擷取任意關鍵詞的百度搜尋結果

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 分析頁面資訊

打開相應的界面,如下

【爬蟲高階】使用xpath文法擷取任意關鍵詞的百度搜尋結果

注意,這裡的搜尋内容存在不同的标簽中(标簽為​

​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文法擷取任意關鍵詞的百度搜尋結果

代碼如下,可以發現每次複制的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這個搜尋的關鍵詞不見了,核實一下标簽資訊,發現這個關鍵詞是在單獨的标簽中,如下,如果隻通過 絕對路徑擷取文本資料,隻能擷取上面輸出的結果,不能擷取全部的标題資料

【爬蟲高階】使用xpath文法擷取任意關鍵詞的百度搜尋結果

最後完善的全部代碼如下,注意​

​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())
#這種是直接複制粘貼的,要想獲得全部的資料,就需要使用新相對路徑