手動反爬蟲:原博地址
知識梳理不易,請尊重勞動成果,文章僅發佈在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還是有點無腦,快捷,但是基本的語法還是要多寫一寫,不然時間久了就手生)