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')獲取到輸入框並輸入內容。點擊按鈕同樣的方式也可。

獲取節點的方法還有幾種,我們來看一下。

  1. find_element_by_class_name()通過class名來獲取。
  2. find_element_by_id()通過id名來獲取。
  3. find_element_by_name()通過屬性名來獲取。
  4. find_element_by_xpath()通過xpath的方式獲取。
  5. find_element_by_tag_name()通過節點名來獲取,比如input就是find_element_by_tag_name('input')
  6. find_element_by_css_selector()通過css的方式獲取,不如id為kw就是find_element_by_css_selector('#kw'),
  7. find_element_by_link_text()通過文本值來取,比如<a>123</a>:find_element_by_link_text('123')
  8. 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,位置,標籤名,大小,位置。

  1. get_attribute()獲取屬性,比如獲取class,即get_attribute('class')
  2. size 獲取元素大小
  3. text 獲取元素文本
  4. title 獲取當前頁面的title
  5. current_url 獲取當前頁面的url
  6. location 獲取元素的相對位置
  7. tag_name 獲取標籤名

以百度為例:

結果圖:

7.0、切換表單

在Web應用中經常會遇到frame/iframe表單嵌套頁面的應用,Selenium打開頁面後默認在frame中找節點,也就是說,我們找不到iframe的節點。這時候需要:

switch_to.frame()先切換個iframe表單。參數可以填寫id和name屬性,如果沒有id和name,你也可以通過上面獲取節點的操作獲取節點,作為參數。

8.0、窗口切換

  1. current_window_handle返回當前窗口的句柄
  2. window_handles返回所有的窗口句柄
  3. 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"))

)

  1. dirver表示驅動
  2. 5表示等待的最長時間
  3. 0.5是每隔0.5秒檢測一次
  4. until()方法用來傳入等待的條件
  5. 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、完。