Selenium和PhantomJS 終極最全使用總結

weixin_33816300發表於2018-08-14

PhantomJS 和 Chromedriver操作方式以及功能一致
主要區別 PhantomJS 無介面模式 節省記憶體
Chromedriver 完全模仿瀏覽器 消耗記憶體

1. 載入頁面
1231866-218853fff5ffc839.png
image.png

PhantomJS 擷取的是網頁的完整頁面,包括下拉進度條的內容
Chromedriver只擷取彈框瀏覽器的視覺化內容頁面

  1. 檢視請求資訊
driver.page_source # 檢視網頁原始碼
driver.get_cookies() # # 獲取當前瀏覽器的全部cookies
driver.current_url # 獲取當前頁面的url
  1. 退出
driver.close() #退出當前頁面, 但瀏覽器還在
driver.quit()  #退出瀏覽器
  1. 定位和操作

    模仿瀏覽器開啟百度並搜尋關鍵詞python
    1231866-293fc7c18354df5d.png
    百度
主要利用定位 填充關鍵詞 點選搜尋按鈕

001 先找到文字輸入框元素,輸入內容
002 找到搜尋按鈕 進行搜尋

定位元素:
1231866-defc0aa957f17417.png
定位元素.png
獲取文字:element.text
獲取屬性值:element.get_attribute("href")

給輸入框賦值: element.send_keys()
操作點選事件: element.click()

find_element和find_elements的區別
帶s的返回的是列表
不帶s的是返回列表中的第一個元素

selenium處理cookie

driver.get_cookies()獲取的是完整的cookie資訊!不光有name、value,還有domain等其他資訊!
1231866-78efe5a52107926d.png
image.png
使用cookie
新增Cookie
driver.add_cookie({'name':'xxxx','value':'xxxxxxxxxxx'})
重新整理頁面
 driver.refresh()

頁面等待 :https://www.jianshu.com/p/835bd3e96f5b
01 強制等待
time.sleep(10) 強制要求在時間內出現,否則報錯,不能很好的控制時間,浪費資源

02 隱示等待
隱性等待對整個driver的週期都起作用,所以只要設定一次即可
隱形等待是設定了一個最長等待時間,如果在規定時間內網頁載入完成,則執行下一步,否則一直等到時間截止,然後執行下一步。
driver.implicitly_wait(30) # 隱性等待,最長等30秒

03 顯示等待

WebDriverWait(driver, 超時時長, 呼叫頻率, 忽略異常).until(可執行方法, 超時時返回的資訊)

這裡需要特別注意的是until或until_not中的可執行方法method引數,很多人傳入了WebElement物件,如下:

WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))  # 錯誤

這是錯誤的用法,這裡的引數一定要是可以呼叫的,即這個物件一定有 call() 方法,否則會丟擲異常:
TypeError: 'xxx' object is not callable

1231866-cfe8e36e8ce7eea4.png
image.png

selenium執行js程式碼
js = 'window.scrollTo(0,document.body.scrollHeight)' # js語句
driver.execute_script(js) # 執行js的方法
1231866-33a8825a91f4008d.png
image.png
通過執行js來新開一個標籤頁
js = 'window.open("https://www.sogou.com");'
driver.execute_script(js)
time.sleep(1)

switch方法切換的操作
01視窗切換

# 1. 獲取當前所有的視窗
current_windows = driver.window_handles
# 2. 根據視窗索引進行切換
driver.switch_to.window(current_windows[1])
切換iframe

iframe是html中常用的一種技術,即一個頁面中巢狀了另一個網頁,selenium預設是訪問不了frame中的內容的,對應的解決思路是

driver.switch_to.frame()

思路:先定位並切換至iframe內,再進行你安排前元素操作 最後可通過切換至視窗,從iframe中切換出iframe 進入到頁面

login_frame = driver.find_element_by_id('login_frame') # 定位frame元素
driver.switch_to.frame(login_frame) # 轉向到該frame中
1231866-c8f8b694bf4cf93e.png
image.png
alert彈框處理

當你觸發了某個事件之後,頁面出現了彈窗提示,處理這個提示或者獲取提示資訊方法:driver.switch_to.alert() # 跟frame一樣的處理方式!

頁面前進和後退

driver.forward()     # 前進
driver.back()        # 後退

selenium 三大重要功能

無介面模式
1231866-30eb0d309174272d.png
無介面模式.png
更換UA
1231866-48f3e95a3fa29d50.png
更換UA.png
使用代理IP
1231866-38e745f93e07f5f6.png
代理IP.png

三個可以同時使用

selenium的優缺點
• selenium能夠執行頁面上的js,對於js渲染的資料和模擬登陸處理起來非常容易
• selenium由於在獲取頁面的過程中會傳送很多請求,所以效率非常低,所以在很多時候需要酌情使用

相關文章