selenium介紹
selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript代碼的問題 selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點擊、下拉等,來拿到網頁渲染之后的結果,可支持多種瀏覽器
環境安裝
下載安裝selenium
1
|
pip install selenium - i https: / / mirrors.aliyun.com / pypi / simple / |
谷歌瀏覽器驅動程序下載地址:
http://chromedriver.storage.googleapis.com/index.html
使用示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
from selenium import webdriver from time import sleep # 實例化一款瀏覽器 bor = webdriver.Chrome(executable_path = 'chromedriver.exe' ) # 對指定的url發起請求 bor.get( 'https://www.jd.com/' ) sleep( 1 ) # 進行標簽定位 search_input = bor.find_element_by_id( 'key' ) # 向搜索框中錄入關鍵詞 search_input.send_keys( "mac pro" ) # 點擊搜索按鈕 btn = bor.find_element_by_xpath( '//*[@id="search"]/div/div[2]/button' ) btn.click() sleep( 2 ) # 執行js,讓滾輪向下滾動 bor.execute_script( 'window.scrollTo(0, document.body.scrollHeight)' ) sleep( 2 ) page_text = bor.page_source print (page_text) bor.quit() |
瀏覽器創建
Selenium支持非常多的瀏覽器,如Chrome、Firefox、Edge等,還有Android、BlackBerry等手機端的瀏覽器。另外,也支持無界面瀏覽器PhantomJS。
1
2
3
4
5
6
7
|
from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox() browser = webdriver.Edge() browser = webdriver.PhantomJS() browser = webdriver.Safari() |
元素定位
webdriver 提供了一系列的元素定位方法,常用的有以下幾種:
定位一個元素 | 定位多個元素 | 含義 |
---|---|---|
find_element_by_id | find_elements_by_id | 通過元素id定位 |
find_element_by_name | find_elements_by_name | 通過元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通過xpath表達式定位 |
find_element_by_link_text | find_elements_by_link_tex | 通過完整超鏈接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通過部分鏈接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通過標簽定位 |
find_element_by_class_name | find_elements_by_class_name | 通過類名進行定位 |
find_elements_by_css_selector | find_elements_by_css_selector | 通過css選擇器進行定位 |
注意:
1、find_element_by_xxx找的是第一個符合條件的標簽,find_elements_by_xxx找的是所有符合條件的標簽。
2、根據ID、CSS選擇器和XPath獲取,它們返回的結果完全一致。
3、另外,Selenium還提供了通用方法find_element()
,它需要傳入兩個參數:查找方式By
和值。實際上,它就是find_element_by_id()
這種方法的通用函數版本,比如find_element_by_id(id)
就等價于find_element(By.ID, id)
,二者得到的結果完全一致。
實例演示
假如有一個web頁面,通過前端工具查看到一個元素的屬性是這樣的。
1
2
3
4
5
6
7
|
< html > < head > < body link = "#0000cc" > < a href = "/" rel = "external nofollow" onmousedown = "return c({'fm':'tab','tab':'logo'})" > < form name = "f" action = "/s" > < span ></ span > < input name = "wd" value = "" maxlength = "255" autocomplete = "off" > |
通過id定位:
1
|
dr.find_element_by_id( "kw" ) |
通過name定位:
1
|
dr.find_element_by_name( "wd" ) |
通過class name定位:
1
|
dr.find_element_by_class_name( "s_ipt" ) |
通過tag name定位:
1
|
dr.find_element_by_tag_name( "input" ) |
通過xpath定位,xpath定位有N種寫法,這里列幾個常用寫法:
1
2
3
4
5
6
7
|
dr.find_element_by_xpath( "//*[@]" ) dr.find_element_by_xpath( "//*[@name='wd']" ) dr.find_element_by_xpath( "//input[@]" ) dr.find_element_by_xpath( "/html/body/form/span/input" ) dr.find_element_by_xpath( "//span[@]/input" ) dr.find_element_by_xpath( "//form[@]/span/input" ) dr.find_element_by_xpath( "//input[@ and @name='wd']" ) |
通過css定位,css定位有N種寫法,這里列幾個常用寫法:
1
2
3
4
5
6
|
dr.find_element_by_css_selector( "#kw" ) dr.find_element_by_css_selector( "[name=wd]" ) dr.find_element_by_css_selector( ".s_ipt" ) dr.find_element_by_css_selector( "html > body > form > span > input" ) dr.find_element_by_css_selector( "span.soutu-btn> input#kw" ) dr.find_element_by_css_selector( "form#form > span > input" ) |
假如頁面上有如下一組文本鏈接
1
2
|
<a href = "http://news.baidu.com" rel = "external nofollow" name = "tj_trnews" >新聞< / a> <a href = "http://www.hao123.com" rel = "external nofollow" name = "tj_trhao123" >hao123< / a> |
通過link text定位:
1
2
|
dr.find_element_by_link_text( "新聞" ) dr.find_element_by_link_text( "hao123" ) |
通過partial link text定位:
1
2
3
|
dr.find_element_by_partial_link_text( "新" ) dr.find_element_by_partial_link_text( "hao" ) dr.find_element_by_partial_link_text( "123" ) |
控制瀏覽器
常用的控制瀏覽器操作的一些方法
方法 | 說明 |
---|---|
set_window_size() | 設置瀏覽器的大小 |
back() | 控制瀏覽器后退 |
forward() | 控制瀏覽器前進 |
refresh() | 刷新當前頁面 |
clear() | 清除文本 |
send_keys (value) | 模擬按鍵輸入 |
click() | 單擊元素 |
submit() | 用于提交表單 |
get_attribute(name) | 獲取元素屬性值 |
is_displayed() | 設置該元素是否用戶可見 |
size | 返回元素的尺寸 |
text | 獲取元素的文本 |
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
from selenium import webdriver from time import sleep #1.創建Chrome瀏覽器對象,這會在電腦上在打開一個瀏覽器窗口 browser = webdriver.Chrome(executable_path = "chromedriver.exe" ) #2.通過瀏覽器向服務器發送URL請求 browser.get( "https://www.baidu.com/" ) sleep( 3 ) #3.刷新瀏覽器 browser.refresh() #4.設置瀏覽器的大小 browser.set_window_size( 1400 , 800 ) #5.設置鏈接內容 element = browser.find_element_by_link_text( "新聞" ) element.click() |
調用JavaScript代碼
雖然WebDriver提供了操作瀏覽器的前進和后退方法,但對于瀏覽器滾動條并沒有提供相應的操作方法。在這種情況下,就可以借助JavaScript來控制瀏覽器的滾動條。WebDriver提供了execute_script()方法來執行JavaScript代碼。
用于調整瀏覽器滾動條位置的JavaScript代碼如下:
1
2
|
<!-- window.scrollTo(左邊距,上邊距); --> window.scrollTo(0,450); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from selenium import webdriver from time import sleep # 1.訪問百度 drive = webdriver.Chrome(executable_path= 'chromedriver.exe' ) drive.get( 'https://www.baidu.com' ) # 2.搜索 drive.find_element_by_id( 'kw' ).send_keys( 'python' ) drive.find_element_by_id( 'su' ).click() # 3.休眠2s,獲取服務器的響應內容 sleep(2) # 4.通過javascript設置瀏覽器窗口的滾動條位置 drive.execute_script( 'window.scrollTo(0, 500)' ) # drive.execute_script('window.scrollTo(0, document.body.scrollHeight)') #滑到最底部 sleep(2) drive.close() |
獲取頁面源碼數據
通過page_source
屬性可以獲取網頁的源代碼,接著就可以使用解析庫(如正則表達式、Beautiful Soup、pyquery等)來提取信息了。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
from selenium import webdriver from time import sleep # 1.訪問百度 drive = webdriver.Chrome(executable_path = 'chromedriver.exe' ) drive.get( 'https://www.baidu.com' ) # 2.搜索 drive.find_element_by_id( 'kw' ).send_keys( 'python' ) drive.find_element_by_id( 'su' ).click() # 3.休眠2s,獲取服務器的響應內容 sleep( 2 ) # 4.獲取頁面源碼數據 text = drive.page_source print (text) drive.close() |
cookie操作
有時候我們需要驗證瀏覽器中cookie是否正確,因為基于真實cookie的測試是無法通過白盒和集成測試進行的。WebDriver提供了操作Cookie的相關方法,可以讀取、添加和刪除cookie信息。
WebDriver操作cookie的方法:
方法 | 說明 |
---|---|
get_cookies() | 獲得所有cookie信息 |
get_cookie(name) | 返回字典的key為“name”的cookie信息 |
add_cookie(cookie_dict) | 添加cookie。“cookie_dict”指字典對象,必須有name 和value 值 |
delete_cookie(name,optionsString) | 刪除cookie信息。“name”是要刪除的cookie的名稱,“optionsString”是該cookie的選項,目前支持的選項包括“路徑”,“域” |
delete_all_cookies() | 刪除所有cookie信息 |
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from selenium import webdriver drive = webdriver.Chrome(executable_path = 'chromedriver.exe' ) drive.get( 'https://www.cnblogs.com/' ) # 1.打印cookie信息 print (drive.get_cookies()) # 2.添加cookie信息 dic = { 'name' : 'name' , 'value' : 'python' } drive.add_cookie(dic) print (drive.get_cookies()) # 3.遍歷打印cookie信息 for cookie in drive.get_cookies(): print (f "{cookie['name']}---f{cookie['value']}\n" ) drive.close() |
谷歌無頭瀏覽器
PhntomJs已停止維護更新,這里使用谷歌的無頭瀏覽器,是一款無界面的谷歌瀏覽器。很多時候我們爬取數據,并不想打開一個瀏覽器窗口進行操作,我們只需要獲取數據或者拿到cookie然后進行操作。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 1.創建一個參數對象,用來控制chrome以無界面模式打開 chrome_options = Options() chrome_options.add_argument( '--headless' ) chrome_options.add_argument( '--disable-gpu' ) # 2.創建瀏覽器對象 drive = webdriver.Chrome(executable_path = 'chromedriver.exe' , chrome_options = chrome_options) # 3.發起請求獲取數據 drive.get( 'https://www.cnblogs.com/' ) page_text = drive.page_source print (page_text) drive.close() |
selenium規避被檢測識別
現在不少大網站有對selenium采取了監測機制。比如正常情況下我們用瀏覽器訪問淘寶等網站的 window.navigator.webdriver的值為 undefined。而使用selenium訪問則該值為true。那么如何解決這個問題呢?
只需要設置Chromedriver的啟動參數即可解決問題。在啟動Chromedriver之前,為Chrome開啟實驗性功能參數excludeSwitches
,它的值為['enable-automation']
,完整代碼如下:
示例
1
2
3
4
5
6
7
8
9
10
11
12
|
from selenium import webdriver from selenium.webdriver import ChromeOptions # 1.實例化一個ChromeOptions對象 option = ChromeOptions() option.add_experimental_option( 'excludeSwitches' , [ 'enable-automation' ]) # 2.將ChromeOptions實例化的對象option作為參數傳給Crhome對象 driver = webdriver.Chrome(executable_path = 'chromedriver.exe' , options = option) # 3.發起請求 driver.get( 'https://www.taobao.com/' ) |
到此這篇關于Python中Selenium庫使用教程詳解的文章就介紹到這了,更多相關Python Selenium庫使用內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/yanjieli/archive/2020/07/23/13364615.html