selenium的使用(有點意思)
- 2019 年 10 月 6 日
- 筆記
寫在前面的話:在上一篇文章中,我們是通過分析Ajax請求,來獲取我們想要的內容,那麼對於動態網頁的分析,我們還可以使用selenium來達到同樣的效果,selenium可以模擬點擊,下拉,鼠標,鍵盤等的操作,是爬蟲中的一大利器。
1.0、前期準備
首先我們需要安裝selenium庫,pip3 install selenium
其次我們還需要安裝並且配置好ChromeDriver,來對接Selenium。
安裝配置很簡單,只需要下載對應的版本後將chromedriver.exe文件複製python路徑下的Scripts路徑下即可。
2.0、配置完成後我們來簡單實例一下

- webdriver.Chrome()表示創建一個chrome對象,會在電腦上打開瀏覽器
- browser.get('https://www.baidu.com')get方法表示請求一個頁面,這裡打開的是百度
- print(browser.page_source)輸出獲取頁面的源代碼,即百度頁面的源代碼。
- browser.close()關閉瀏覽器
其他:
- browser.set_window_size(1400,800)設置瀏覽器的大小。
- browser.refresh()刷新瀏覽器
- clear()清除文本
獲取的百度源代碼圖:

3.0、我們在獲取到頁面後同樣需要獲取到節點,然後才能繼續後面的操作。繼續實例一下。
3.1首先分析頁面

如圖,我們在開發者模式中可以看待百度輸入框的class名為s_ipt,name名為wd,id名為kw。同樣的方式我們可以找到百度一下按鈕的class名為btn self-btn bg s_btn,id為su。
3.2、例如我們用類名來獲取節點並進行輸入:

browser.find_element_by_class_name('s_ipt')是利用class名獲取節點。
send_keys('selenium')輸入的值為selenium。
time.sleep(3)等3秒
btn=browser.find_element_by_id('su')獲取到百度一下按鈕。
btn.click()點擊該按鈕。
如果我們熟練了之後可以這樣寫browser.find_element_by_class_name('s_ipt').send_kes('selenium')獲取到輸入框並輸入內容。點擊按鈕同樣的方式也可。
獲取節點的方法還有幾種,我們來看一下。
- find_element_by_class_name()通過class名來獲取。
- find_element_by_id()通過id名來獲取。
- find_element_by_name()通過屬性名來獲取。
- find_element_by_xpath()通過xpath的方式獲取。
- find_element_by_tag_name()通過節點名來獲取,比如input就是find_element_by_tag_name('input')
- find_element_by_css_selector()通過css的方式獲取,不如id為kw就是find_element_by_css_selector('#kw'),
- find_element_by_link_text()通過文本值來取,比如<a>123</a>:find_element_by_link_text('123')
- find_element_by_partial_link_text()也是通過文本來取,partial的意思是部分的,所以比如<a>123</a>:find_element_by_partial_link_text('1')即可。
這樣寫,你可能會覺得很麻煩。當然也有一種通用的方法,
比如用id獲取可以這樣寫:find_element(By.ID,'kw')需要導入
from selenium.webdriver.common.by import By
第一個為獲取的方式,第二個為值。獲取的方式是原方法by_後的字母大寫就好,比如通class名獲取就可以是find_element(By.CLASS_NAME,'s_ipt')。
注意:以上方法只返回單個節點,如果符合要求的有多個節點,只返回第一個。
3.3、獲取多個節點:
直接將element改成elements就可以了,通用方法也一樣。
實例演示(打開百度輸入武漢景區,打印每一條的標題):

結果:

4.0、鼠標事件
4.1實例一下(打開百度,鼠標懸浮到更多產品):

首先需要導入
from selenium.webdriver.common.action_chains import ActionChains
- ActionChains(browser)用來構造ActionChains對象。
- context_click(cp)將鼠標懸浮在某元素上。
- perform()提交操作,不提交是沒有效果的。
其他:
- move_to_element()右擊。
- double_click()雙擊。
- drag_and_drop()拖動。
- context_click()模擬右鍵操作,需要元素定位。
注意:這裡我用的是文本來定位,因為class名,id名在變化。
5.0、鍵盤操作
5.1、首先來說組合鍵:
- send_keys(Keys.CONTROL,『a』)Keys.CONTROL表示Ctrl鍵,所以就是ctrl+a
- send_keys(Keys.CONTROL,『c』)Keys.CONTROL表示Ctrl鍵,所以就是ctrl+c
其他都是一樣的,你懂的。
5.2、其他
- send_keys(Keys.BACK_SPACE)刪除鍵(BackSpace)
- send_keys(Keys.SPACE) 空格鍵(Space)
- send_keys(Keys.TAB) 製表鍵(Tab)
- send_keys(Keys.ESCAPE) 回退鍵(Esc)
- send_keys(Keys.ENTER) 回車鍵(Enter)
6.0、獲取屬性,文本,id,位置,標籤名,大小,位置。
- get_attribute()獲取屬性,比如獲取class,即get_attribute('class')
- size 獲取元素大小
- text 獲取元素文本
- title 獲取當前頁面的title
- current_url 獲取當前頁面的url
- location 獲取元素的相對位置
- tag_name 獲取標籤名
以百度為例:

結果圖:

7.0、切換表單
在Web應用中經常會遇到frame/iframe表單嵌套頁面的應用,Selenium打開頁面後默認在frame中找節點,也就是說,我們找不到iframe的節點。這時候需要:
switch_to.frame()先切換個iframe表單。參數可以填寫id和name屬性,如果沒有id和name,你也可以通過上面獲取節點的操作獲取節點,作為參數。
8.0、窗口切換
- current_window_handle返回當前窗口的句柄
- window_handles返回所有的窗口句柄
- switch_to.window()跳轉窗口
實例:

9.0、延時等待(隱式等待和顯式等待)
為什麼要等待?因為有時候頁面還沒有完全的加載不出,有些元素可能就獲取不到導致異常。
比如在百度頁面,點擊登錄後,再點擊立即註冊,如果不延時等待就會報錯(可以自己去試一下)
9.1隱式等待
implicitly_wait(10)表示在10秒內,只要有沒有找到的節點,在10秒內會一直尋找,超過就報異常。
9.2顯式等待
等待某個條件成立時繼續執行,否則在達到最大時長時拋出超時異常。
導入:from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 5, 0.5).until(
EC.presence_of_element_located((By.ID, "kw"))
)
- dirver表示驅動
- 5表示等待的最長時間
- 0.5是每隔0.5秒檢測一次
- until()方法用來傳入等待的條件
- presence_of_element_located表示節點出現的意思
還有其他的判斷可以參考官方文檔。
10、前進和後退

- back()後退
- forward()前進
11、處理JavaScript所生成的alert、confirm
- text 返回 alert/confirm/prompt 中的文字信息。
- accept() 接受現有警告框。
- dismiss() 解散現有警告框。
- send_keys() 發送文本至警告框。
首先需要定位到js的彈窗
browser.switch_to.alert.accept()定位到彈窗執行確定也就是接收。
browser.switch_to.alert就是定位到彈窗。
12、窗口截圖
get_screenshot_as_file("E:\1.jpg")
13、下拉框的操作
導入:from selenium.webdriver.support.select import Select
Select('定位').select_by_value(「選擇值」)直接定位到元素然後選擇就好
14、調用js代碼(比如下拉進度條,selenium並沒有提供方法)
首先利用設定
j="window.scrollTo(100,450);"
window.scrollTo()方法用於設置瀏覽器窗口滾動條的水平和垂直位置。
第一個參數就是水平位置,第二個參數就是垂直位置。
然後再利用browser.execute_script(j)方法去執行js代碼即可。
15、Cookies的操作
實例:

注意:以上browser都是我得命名,你可以修改成你的。
總結:以上很多方法我都沒有實例,關鍵是自己要敲代碼。
16、完。