Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

爬蟲+自動化利器 selenium 之自學成才篇(一)

Dream丶Killer 2021-09-27 12:53:42 阅读数:23 评论数:0 点赞数:0 收藏数:0

selenium 簡介

Selenium 是最廣泛使用的開源 Web UI(用戶界面)自動化測試套件之一。Selenium 支持的語言包括C#,Java,Perl,PHP,Python 和 Ruby。目前,Selenium Web 驅動程序最受 Python 和 C#歡迎。 Selenium 測試脚本可以使用任何支持的編程語言進行編碼,並且可以直接在大多數現代 Web 瀏覽器中運行。在爬蟲領域 selenium 同樣是一把利器,能够解决大部分的網頁的反爬問題,但也不是萬能的,它最明顯的缺點就是速度慢。下面就進入正式的 study 階段。


selenium安裝

打開 cmd,輸入下面命令進行安裝。

pip install -i https://pypi.douban.com/simple selenium

執行後,使用 pip show selenium 查看是否安裝成功。


安裝瀏覽器驅動

針對不同的瀏覽器,需要安裝不同的驅動。下面列舉了常見的瀏覽器與對應的驅動程序下載鏈接,部分網址需要 “科學上網” 才能打開哦(dddd)。

  • Firefox 瀏覽器驅動:Firefox
  • Chrome 瀏覽器驅動:Chrome
  • IE 瀏覽器驅動:IE
  • Edge 瀏覽器驅動:Edge
  • PhantomJS 瀏覽器驅動:PhantomJS
  • Opera 瀏覽器驅動:Opera

這裏以安裝 Chrome 驅動作為演示,同時也推薦大家使用 Chrome,別的瀏覽器有些方面有些不足。

確定瀏覽器版本

在新標簽頁輸入 chrome://settings/ 進入設置界面,然後選擇 【關於 Chrome

查看自己的版本信息。這裏我的版本是94,這樣在下載對應版本的 Chrome 驅動即可。
在這裏插入圖片描述

下載驅動

打開 Chrome驅動 。單擊對應的版本。
在這裏插入圖片描述
根據自己的操作系統,選擇下載。

在這裏插入圖片描述
下載完成後,壓縮包內只有一個 exe 文件。
在這裏插入圖片描述
chromedriver.exe 保存到任意比特置,並把當前路徑保存到環境變量中(我的電腦>>右鍵屬性>>高級系統設置>>高級>>環境變量>>系統變量>>Path),添加的時候要注意不要把 path 變量給覆蓋了,如果覆蓋了千萬別關機,然後百度。添加成功後使用下面代碼進行測試。

from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()

定比特頁面元素

打開指定頁面

使用 selenium 定比特頁面元素的前提是你已經了解基本的頁面布局及各種標簽含義,當然如果之前沒有接觸過,現在我也可以帶你簡單的了解一下。
以我們熟知的 CSDN 為例,我們進入首頁,按 【F12】 進入開發者工具。紅框中顯示的就是頁面的代碼,我們要做的就是從代碼中定比特獲取我們需要的元素。
在這裏插入圖片描述
想要定比特並獲取頁面中的信息,首先要使用 webdriver 打開指定頁面,再去定比特。

from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')

執行上面語句後會發現,瀏覽器打開 CSDN 主頁後會馬上關閉,想要防止瀏覽器自動關閉,可以添加下面代碼。

# 不自動關閉瀏覽器
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
# 將option作為參數添加到Chrome中
driver = webdriver.Chrome(chrome_options=option)

這樣將上面的代碼組合再打開瀏覽器就不會自動關閉了。

from selenium import webdriver
# 不自動關閉瀏覽器
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
# 注意此處添加了chrome_options參數
driver = webdriver.Chrome(chrome_options=option)
driver.get('https://www.csdn.net/')

下面我們再來看看幾種常見的頁面元素定比特方式。

id 定比特

標簽的 id 具有唯一性,就像人的身份證,假設有個 input 標簽如下。

<input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++難在哪裏?">

我們可以通過 id 定比特到它,由於 id 的唯一性,我們可以不用管其他的標簽的內容。

driver.find_element_by_id("toolbar-search-input")

name 定比特

name 指定標簽的名稱,在頁面中可以不唯一。假設有個 meta 標簽如下

<meta name="keywords" content="CSDN博客,CSDN學院,CSDN論壇,CSDN直播">

我們可以使用 find_element_by_name 定比特到 meta 標簽。

driver.find_element_by_name("keywords")

class 定比特

class 指定標簽的類名,在頁面中可以不唯一。假設有個 div 標簽如下

<div class="toolbar-search-container">

我們可以使用 find_element_by_class_name 定比特到 div 標簽。

driver.find_element_by_class_name("toolbar-search-container")

tag 定比特

每個 tag 往往用來定義一類功能,所以通過 tag 來識別某個元素的成功率很低,每個頁面一般都用很多相同的 tag ,比如:\<div\>\<input\> 等。這裏還是用上面的 div 作為例子。

<div class="toolbar-search-container">

我們可以使用 find_element_by_class_name 定比特到 div 標簽。

driver.find_element_by_tag_name("div")

xpath 定比特

xpath 是一種在 XML 文檔中定比特元素的語言,它擁有多種定比特方式,下面通過實例我們看一下它的幾種使用方式。

<html>
<head>...<head/>
<body>
<div id="csdn-toolbar">
<div class="toolbar-inside">
<div class="toolbar-container">
<div class="toolbar-container-left">...</div>
<div class="toolbar-container-middle">
<div class="toolbar-search onlySearch">
<div class="toolbar-search-container">
<input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++難在哪裏?">

根據上面的標簽需要定比特 最後一行 input 標簽,以下列出了四種方式,xpath 定比特的方式多樣並不唯一,使用時根據情况進行解析即可。

# 絕對路徑(層級關系)定比特
driver.find_element_by_xpath(
"/html/body/div/div/div/div[2]/div/div/input[1]")
# 利用元素屬性定比特
driver.find_element_by_xpath(
"//*[@id='toolbar-search-input']"))
# 層級+元素屬性定比特
driver.find_element_by_xpath(
"//div[@id='csdn-toolbar']/div/div/div[2]/div/div/input[1]")
# 邏輯運算符定比特
driver.find_element_by_xpath(
"//*[@id='toolbar-search-input' and @autocomplete='off']")

css 定比特

CSS 使用選擇器來為頁面元素綁定屬性,它可以較為靈活的選擇控件的任意屬性,一般定比特速度比 xpath 要快,但使用起來略有難度。
CSS 選擇器常見語法:

方法 例子 描述
.class .toolbar-search-container 選擇 class = 'toolbar-search-container' 的所有元素
#id #toolbar-search-input 選擇 id = 'toolbar-search-input' 的元素
* * 選擇所有元素
element input 選擇所有 <input\> 元素
element>element div>input 選擇父元素為 <div\> 的所有 <input\> 元素
element+element div+input 選擇同一級中在 <div\> 之後的所有 <input\> 元素
[attribute=value] type='text' 選擇 type = 'text' 的所有元素

舉個簡單的例子,同樣定比特上面實例中的 input 標簽。

driver.find_element_by_css_selector('#toolbar-search-input')
driver.find_element_by_css_selector('html>body>div>div>div>div>div>div>input')

link 定比特

link 專門用來定比特文本鏈接,假如要定比特下面這一標簽。

<div class="practice-box" data-v-04f46969="">加入!每日一練</div>

我們使用 find_element_by_link_text 並指明標簽內全部文本即可定比特。

driver.find_element_by_link_text("加入!每日一練")

partial_link 定比特

partial_link 翻譯過來就是“部分鏈接”,對於有些文本很長,這時候就可以只指定部分文本即可定比特,同樣使用剛才的例子。

<div class="practice-box" data-v-04f46969="">加入!每日一練</div>

我們使用 find_element_by_partial_link_text 並指明標簽內部分文本進行定比特。

driver.find_element_by_partial_link_text("加入")

瀏覽器控制

修改瀏覽器窗口大小

from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
# 設置瀏覽器瀏覽器的寬高為:600x800
driver.set_window_size(600, 800)

使用 maximize_window() 方法可以實現瀏覽器全屏顯示。

from selenium import webdriver
# Chrome瀏覽器
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
# 設置瀏覽器瀏覽器的寬高為:600x800
driver.maximize_window()

瀏覽器前進&後退

webdriver 提供 backforward 方法來實現頁面的後退與前進。下面我們 ①進入CSDN首頁,②打開CSDN個人主頁,③back 返回到CSDN首頁,④ forward 前進到個人主頁。

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
# 訪問CSDN首頁
driver.get('https://www.csdn.net/')
sleep(2)
#訪問CSDN個人主頁
driver.get('https://blog.csdn.net/qq_43965708')
sleep(2)
#返回(後退)到CSDN首頁
driver.back()
sleep(2)
#前進到個人主頁
driver.forward()

請添加圖片描述

細心的讀者會發現第二次 get() 打開新頁面時,會在原來的頁面打開,而不是在新標簽中打開。如果想的話也可以在新的標簽頁中打開新的鏈接,但需要更改一下代碼,執行 js 語句來打開新的標簽。

# 在原頁面打開
driver.get('https://blog.csdn.net/qq_43965708')
# 新標簽中打開
js = "window.open('https://blog.csdn.net/qq_43965708')"
driver.execute_script(js)

瀏覽器刷新

在一些特殊情况下我們可能需要刷新頁面來獲取最新的頁面數據,這時我們可以使用 refresh() 來刷新當前頁面。

# 刷新頁面
driver.refresh()

瀏覽器窗口切換

在很多時候我們都需要用到窗口切換,比如:當我們點擊注册按鈕時,它一般會打開一個新的標簽頁,但實際上代碼並沒有切換到最新頁面中,這時你如果要定比特注册頁面的標簽就會發現定比特不到,這時就需要將實際窗口切換到最新打開的那個窗口。我們先獲取當前各個窗口的句柄,這些信息的保存順序是按照時間來的,最新打開的窗口放在數組的末尾,這時我們就可以定比特到最新打開的那個窗口了。

# 獲取打開的多個窗口句柄
windows = driver.window_handles
# 切換到當前最新打開的窗口
driver.switch_to.window(windows[-1])

常見操作

webdriver中的常見操作有:

方法 描述
send_keys() 模擬輸入指定內容
clear() 清除文本內容
is_displayed() 判斷該元素是否可見
get_attribute() 獲取標簽屬性值
size 返回元素的尺寸
text 返回元素文本

接下來還是用 CSDN 首頁為例,需要用到的就是搜素框和搜索按鈕。通過下面的例子就可以氣息的了解各個操作的用法了。
在這裏插入圖片描述

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.csdn.net/')
sleep(2)
# 定比特搜索輸入框
text_label = driver.find_element_by_xpath('//*[@id="toolbar-search-input"]')
# 在搜索框中輸入 Dream丶Killer
text_label.send_keys('Dream丶Killer')
sleep(2)
# 清除搜索框中的內容
text_label.clear()
# 輸出搜索框元素是否可見
print(text_label.is_displayed())
# 輸出placeholder的值
print(text_label.get_attribute('placeholder'))
# 定比特搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 輸出按鈕的大小
print(button.size)
# 輸出按鈕上的文本
print(button.text)
'''輸出內容 True python面試100問 {'height': 32, 'width': 28} 搜索 '''

請添加圖片描述


鼠標控制

在webdriver 中,鼠標操作都封裝在ActionChains類中,常見方法如下:

方法 描述
click() 單擊左鍵
context_click() 單擊右鍵
double_click() 雙擊
drag_and_drop() 拖動
move_to_element() 鼠標懸停
perform() 執行所有ActionChains中存儲的動作

單擊左鍵

模擬完成單擊鼠標左鍵的操作,一般點擊進入子頁面等會用到,左鍵不需要用到ActionChains。

# 定比特搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 執行單擊操作
button.click()

單擊右鍵

鼠標右擊的操作與左擊有很大不同,需要使用ActionChains。

from selenium.webdriver.common.action_chains import ActionChains
# 定比特搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 右鍵搜索按鈕
ActionChains(driver).context_click(button).perform()

雙擊

模擬鼠標雙擊操作。

# 定比特搜索按鈕
button = driver.find_element_by_xpath('//*[@id="toolbar-search-button"]/span')
# 執行雙擊動作
ActionChains(driver).double_click(button).perform()

拖動

模擬鼠標拖動操作,該操作有兩個必要參數,

  • source:鼠標拖動的元素
  • target:鼠標拖至並釋放的目標元素
# 定比特要拖動的元素
source = driver.find_element_by_xpath('xxx')
# 定比特目標元素
target = driver.find_element_by_xpath('xxx')
# 執行拖動動作
ActionChains(driver).drag_and_drop(source, target).perform()

鼠標懸停

模擬懸停的作用一般是為了顯示隱藏的下拉框,比如 CSDN 主頁的收藏欄,我們看一下效果。
在這裏插入圖片描述

# 定比特收藏欄
collect = driver.find_element_by_xpath('//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[3]/a')
# 懸停至收藏標簽處
ActionChains(driver).move_to_element(collect).perform()

鍵盤控制

webdriverKeys 類幾乎提供了鍵盤上的所有按鍵方法,我們可以使用 send_keys + Keys 實現輸出鍵盤上的組合按鍵如 “Ctrl + C”、“Ctrl + V” 等。

from selenium.webdriver.common.keys import Keys
# 定比特輸入框並輸入文本
driver.find_element_by_id('xxx').send_keys('Dream丶killer')
# 模擬回車鍵進行跳轉(輸入內容後) 
driver.find_element_by_id('xxx').send_keys(Keys.ENTER)
# 使用 Backspace 來删除一個字符
driver.find_element_by_id('xxx').send_keys(Keys.BACK_SPACE)
# Ctrl + A 全選輸入框中內容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'a')
# Ctrl + C 複制輸入框中內容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'c')
# Ctrl + V 粘貼輸入框中內容
driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'v')

其他常見鍵盤操作:

操作 描述
Keys.F1 F1鍵
Keys.SPACE 空格
Keys.TAB Tab鍵
Keys.ESCAPE ESC鍵
Keys.ALT Alt鍵
Keys.SHIFT Shift鍵
Keys.ARROW_DOWN 向下箭頭
Keys.ARROW_LEFT 向左箭頭
Keys.ARROW_RIGHT 向右箭頭
Keys.ARROW_UP 向上箭頭

未完待續~


️往期精彩,不容錯過️

總結篇
️兩萬字,50個pandas高頻操作【圖文並茂,值得收藏】️
️吐血總結《Mysql從入門到入魔》,圖文並茂(建議收藏)️


工具篇
️Python實用小工具之制作酷炫二維碼(有界面、附源碼)️
️Python實用工具之制作證件照(有界面、附源碼)️
️女朋友桌面文件雜亂無章?氣得我用Python給她做了一個文件整理工具️

更多有趣的文章及幹貨,盡在

版权声明
本文为[Dream丶Killer]所创,转载请带上原文链接,感谢

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领