【爬蟲高階】使用xpath語法獲取任意關鍵詞的百度搜索結果


手動反爬蟲:原博地址

 知識梳理不易,請尊重勞動成果,文章僅發佈在CSDN網站上,在其他網站看到該博文均屬於未經作者授權的惡意爬取信息

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

→ 輸出的結果爲:(總結一下:這兩種方式直接copy還是有點無腦,快捷,但是基本的語法還是要多寫一寫,不然時間久了就手生)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章