Selenium用法筆記(解決動態渲染頁面)
Selenium庫,主要用來做自動化測試,爬蟲中用來解決JavaScript渲染的問題
需要安裝selenium庫,以及瀏覽器的驅動(Chrome瀏覽器安裝ChromeDriver)
一、基本使用
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome()#宣告瀏覽器物件 try: browser.get('https://www.baidu.com')#開啟頁面 input = browser.find_element_by_id('kw')#根據ID找到對應的標籤,這裡是輸入框 input.send_keys('Python') #輸入文字 input.send_keys(Keys.ENTER) #模擬回車 wait = WebDriverWait(browser, 10) #建立一個等待10秒的物件 wait.until(EC.presence_of_element_located((By.ID, 'content_left'))) #等待直到某個標籤加載出來 print(browser.current_url) print(browser.get_cookies()) print(browser.page_source) finally: browser.close()
二、宣告瀏覽器物件(需要安裝相應瀏覽器的驅動)
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
三、查詢元素
單個元素
例子:獲取淘寶輸入框
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.taobao.com') input_1 = browser.find_element_by_id('q') input_2 = browser.find_element_by_css_selector('#q') input_3 = browser.find_element_by_class_name('search-combobox-input') print(input_1) print(input_2) print(input_3)
還有很多方法供使用
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
多個元素,使用方法一樣
find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
四、元素互動操作
最常用的就是對輸入框,按鈕進行操作
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
#這裡也可以對輸入框傳入回車鍵
time.sleep(1)
input.clear()
input.send_keys('iPad')
button = browser.find_element_by_class_name('btn-search')
button.click()
互動動作,動作鏈
-模擬拖拽動作
from selenium import webdriver
from selenium.webdriver import ActionChains
#模擬拖拽
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult') #切換到內部的iframe框架
source = browser.find_element_by_css_selector('#draggable') #選擇源
target = browser.find_element_by_css_selector('#droppable') #選擇目標
print(source,target)
actions = ActionChains(browser) #建立動作鏈物件
actions.drag_and_drop(source, target) #設計動作
###重點
actions.perform()#開始你的表演
五、執行JavaScript
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
六、獲取元素資訊(屬性,文字,位置,大小等)
獲取屬性
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
獲取文字
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)
獲取ID,位置,標籤名,大小
print(input.id)
print(input.location)
print(input.size)
print(input.tag_name)
----------------------------------------------------------------------------------
0.6052552682324703-2
{'x': 759, 'y': 7}
{'height': 32, 'width': 66}
button
七、對Frame框架的處理
有時候一個網頁會鑲嵌一個iframe框架,獲取裡面的東西需要進入這個框架
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult') #進入一個框架,輸入框架的ID
source = browser.find_element_by_css_selector('#draggable')
print(source)
try:
logo = browser.find_element_by_class_name('logo')#在子框架中獲取不到父框架的標籤
except NoSuchElementException:
print('NO LOGO')
browser.switch_to.parent_frame() #進入父框架
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)
八、等待,等待某些需要的東西載入完成(基本就是根據網速看他全部載入完成)
隱式等待
當使用了隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間後則丟擲找不到元素的異常, 換句話說,當查詢元素或元素並沒有立即出現的時候,隱式等待將等待一段時間再查詢 DOM,預設的時間是0
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10) #設定隱式等待時間
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
顯式等待
#顯式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)
- title_is 標題是某內容
- title_contains 標題包含某內容
- presence_of_element_located 元素加載出,傳入定位元組,如(By.ID, ‘p’)
- visibility_of_element_located 元素可見,傳入定位元組
- visibility_of 可見,傳入元素物件
- presence_of_all_elements_located 所有元素加載出
- text_to_be_present_in_element 某個元素文字包含某文字
- text_to_be_present_in_element_value 某個元素值包含某文字
- frame_to_be_available_and_switch_to_it frame載入並切換
- invisibility_of_element_located 元素不可見
- element_to_be_clickable 元素可點選
- staleness_of 判斷一個元素是否仍在DOM,可判斷頁面是否已經重新整理
- element_to_be_selected 元素可選擇,傳元素物件
- element_located_to_be_selected 元素可選擇,傳入定位元組
- element_selection_state_to_be 傳入元素物件以及狀態,相等返回True,否則返回False
- element_located_selection_state_to_be 傳入定位元組以及狀態,相等返回True,否則返回False
- alert_is_present 是否出現Alert
前進後退
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
Cookies
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
選項卡操作
很神奇
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()') #通過執行JavaScript來開啟一個選項卡,通用方式
print(browser.window_handles) #列印所有的視窗資訊
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.taobao.com')
異常處理
會出現各種各樣的異常,找不到元素,載入不出來,無法點選等
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
except TimeoutException:
print('Time Out')
try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print('No Element')
finally:
browser.close()
相關推薦
Selenium用法筆記(解決動態渲染頁面)
Selenium庫,主要用來做自動化測試,爬蟲中用來解決JavaScript渲染的問題 需要安裝selenium庫,以及瀏覽器的驅動(Chrome瀏覽器安裝ChromeDriver) 一、基本使用
【Python3 爬蟲學習筆記】動態渲染頁面爬取 4 —— 使用Selenium爬取淘寶商品
並不是所有頁面都可以通過分析Ajax來完成抓取。比如,淘寶,它的整個頁面資料確實也是通過Ajax獲取的,但是這些Ajax介面引數比較複雜,可能會包含加密祕鑰等,所以如果想自己構造Ajax引數,還是比較困難的。對於這種頁面,最方便快捷的抓取方法就是通過Seleni
【Python3 爬蟲學習筆記】動態渲染頁面爬取 3 —— Selenium的使用 3
切換Frame 網頁中有一種節點叫作iframe,也就是子Frame,相當於頁面的子頁面,它的結構和外部頁面的結構完全一致。Selenium開啟頁面後,它預設是在父級Frame裡面操作,而此時如果頁面中海油子Frame,它是不能獲取到子Frame裡面的額節點的。
【Python3 爬蟲學習筆記】動態渲染頁面爬取 2
動作鏈 在互動操作中,一些互動動作都是針對某個節點執行的。比如,對於輸入框,我們就呼叫它的輸入文字和清空文字方法;對於按鈕,就呼叫它的點選方法。其實,還有另外一些操作,它們沒有特定的執行物件,比如滑鼠拖曳、鍵盤按鍵等,這些動作用另一種方式來執行,那就是動作鏈。
python動態渲染頁面的爬取--使用Selenium
2018年4月26日 10:05 一、安裝相關包和軟體 1、安裝Selenium包 Pip3 install Selenium 2、安裝chromedriver 訪問chromedriver映象站,下載對應版本的chromedriver,例如我
scrapy+selenium+chromedriver解析動態渲染頁面
wait tab rim 增加 encoding war 互動 ogg @class 背景:動態頁面是頁面是通過js代碼渲染出來的,無法直接使用scrapy爬蟲,這是就需要先把js代碼轉為靜態的html,再用scrapy爬蟲就可以解決 解決辦法:增加SeleniumMid
selenium+python自動化84-chrome手機wap模式(登入淘寶頁面)
selenium+python自動化84-chrome手機wap模式(登入淘寶頁面) 前言 遇到的問題 Chrome手機模式 TouchAction 參考程式碼 附: 轉載自: https://w
Python web 動態渲染頁面的抓取
通過直接分析ajax資訊,我們仍然可以利用request或者urllib來獲取資訊,但是,JavaScript動態渲染頁面的方式不僅只有ajax一種,也不是傳統的html頁面資訊,運用模擬瀏覽器的執行方式來獲取資訊,只要瀏覽器能接收到,我們就能獲取出來.在 Python 中提供了許多模擬瀏覽器執行的
微信小程式 修改資料,並動態渲染頁面;修改陣列;
一、修改資料,並在頁面動態渲染 this.setData({ txt: '12112' }) 二、修改陣列 var rotateClassItem = 'rotateClass['+ index + ']'; t
【程式碼】第7章 動態渲染頁面爬取
7.1 selenium from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import
metisMenu.js動態側邊導航的實現(ajax動態渲染部分導航)
使用metisMenu.js實現後臺管理系統的導航,通過點選導航,切換不同的頁面內容。有些時候。我們需要動態新增頁面的內容,即通過ajax請求後臺來渲染部分導航的內容。 第一部分是靜態導航的實現,即通過點選導航切換右側頁面的實現。第二部分是動態渲染導航的實現。(demo例子
Web自動化測試Selenium 學習筆記(一)
1、Web自動化測試簡介自動化基礎:自動化用例編寫、Selenium優勢及原理、自動化環境搭建Selenium基礎:常見8大元素定位(表格)、常見元素處理、下拉框元素處理、不同視窗切換、元素進階、元素等待需求到框架 需求分析-用例設計-基礎指令碼-登入/購物指令碼重構-
selenium學習筆記(3)——常用的方法
from selenium import webdriver import time path = 'D:\\Chrome下載\\chromedriver_win32/chromedriver.exe' driver = webdriver.Chrome(path)
Class 17 - 2 動態渲染頁面爬取 — Splash
一、Splash 的使用 Splash 是一個JavaScript 渲染服務,帶有 HTTP API的輕量級瀏覽器,同時對接了 Python 中的 Twisted 和 QT 庫。利用它,同樣可以實現動態渲染頁面的抓取。 例項引入 通過 Splash 提供的 Web 頁面來測試其渲染過
多選本地相簿中的圖片並展示(仿QQ空間動態傳送頁面)上傳至伺服器
最近公司專案需要從本地上傳圖片到伺服器,直接去找才發現安卓居然還有這麼坑的時候,呼叫原生的只能選擇一張圖片,而且還沒有任何的細節優化,觸控圖片就直接返回了。這肯定不行啊!於是就在網上找啊找。。。找啊找。。。有很多都寫得花裡胡哨的看不懂,而且介面的UI也是low的不行。。終於
scrapy 爬取 javscript 動態渲染頁面
load 簡單 下午 net xpath 列表 find 一個 data 前言 初因是給寶寶制作拼音卡點讀包時,要下載賣家提供給的MP3,大概有2百多個。作為一個會碼代碼的非專業人士,怎麽可能取一個一個下載?所以就決定用python 的 scrapy 框架寫個爬蟲,去下載這
Android菜鳥學習筆記(WebView載入html頁面,頁面提交資料問題)
在開發過程中,有一個問卷調查功能,問卷是url用webView載入html頁面出來,在html頁面提交時發現session沒和webview的同步導致提交失敗,這個問題困擾了我很久,後來在前輩的共同研究下,終於找到辦法:獲取html頁面提交的url,然後對url做一次coo
Selenium學習筆記(六)——Selenium Grid
什麼是Selenium Grid Selenium Grid是Selenium專門用於在不同瀏覽器、作業系統和機器上並行執行的元件。 Selenium Grid使用hub-nodes的結構,你可以在hub上啟動測試,不過測試則會在不同的機器node上執行。
RabbitMQ基礎學習筆記(C#代碼示例)
esp 輸出 出隊 csharp 實例代碼 為什麽 mode 規則 無需 一、定義: MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通信方法。應用程序通過讀寫入隊和出隊的消息來通信
Json.net實現方便的Json轉C#(dynamic動態類型)對象
bar 方便 api lba c# oid tool 可能 情況 以前需要將一段json字符串轉換為C#對象時,一般都是定義一個與之對應的實體類來接收。這樣做有一個很大的缺點,就是當字符串特別長,屬性特別多,又有嵌套時,手敲這個實體類就非常痛苦。 比如之前做的一個接收百度七