文章目錄
- 前文回顧
- 快速入門
- 元素定位
- 頁面操作
- 等待方式
- 擴展程式加載
-
很多人學習python,不知道從何學起,
很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手,
很多已經做案例的人,卻不知道如何去學習更加高深的知識,
那么針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!
QQ群:961562169
之所以把selenium爬蟲稱之為可視化爬蟲
主要是相較于前面所提到的幾種網頁決議的爬蟲方式
selenium爬蟲主要是模擬人的點擊操作
selenium驅動瀏覽器并進行操作的程序是可以觀察到的
就類似于你在看著別人在幫你操縱你的電腦,類似于別人遠程使用你的電腦
當然了,selenium也有無界面模式
快速入門
selenium基本介紹:
selenium 是一套完整的web應用程式測驗系統,
包含了測驗的錄制(selenium IDE),撰寫及運行(Selenium Remote Control)
和測驗的并行處理(Selenium Grid),
Selenium的核心Selenium Core基于JsUnit,
完全由JavaScript撰寫,因此可以用于任何支持JavaScript的瀏覽器上,
selenium可以模擬真實瀏覽器,自動化測驗工具,支持多種瀏覽器,
爬蟲中主要用來解決JavaScript渲染問題,
用python寫爬蟲的時候,主要用的是selenium的Webdriver,
#安裝selenium庫
pip install selenium
#安裝對應瀏覽器驅動
# 我們可以通過下面的方式先看看Selenium.Webdriver支持哪些瀏覽器
from selenium import webdriver
print(help(webdriver))
適用瀏覽器:
PACKAGE CONTENTS
android (package) blackberry (package) chrome (package)
common (package) edge (package) firefox (package)
ie (package) opera (package) phantomjs (package)
remote (package) safari (package) support (package) webkitgtk (package)
#這里要說一下比較重要的PhantomJS,
#PhantomJS是一個而基于WebKit的服務端JavaScript API,
#支持Web而不需要瀏覽器支持,
#其快速、原生支持各種Web標準:Dom處理,CSS選擇器,JSON等等,
#PhantomJS可以用用于頁面自動化、網路監測、網頁截屏,以及無界面測驗
谷歌瀏覽器驅動下載地址
注意對應版本號,chrome地址欄輸入chrome://version/ 查看自己的Chrome版本
我使用的是anaconda 下載好后丟入anaconda3\Scripts檔案夾下就可以了
如果是其他ide如:pycharm、VScode但加載的還是anaconda的集成python,依然可以這么操作
簡單測驗
from selenium import webdriver
# #宣告瀏覽器物件
browser1 = webdriver.Chrome()
browser2 = webdriver.Firefox()
# #訪問頁面
browser1.get("http://www.baidu.com")
print(browser1.page_source)
#關閉當前視窗
browser1.close()
元素定位
要想對頁面進行操作,首先要做的是選中頁面元素,
比較常見的八種元素定位方式,如下表
| 定位一個元素 | 定位多個元素 | 定位方式描述 |
|---|---|---|
| find_element_by_id | find_elements_by_id | 通過元素 id進行定位 |
| find_element_by_name | find_elements_by_name | 通過元素 名稱進行定位 |
| find_element_by_xpath | find_elements_by_xpath | 通過xpath路徑進行定位 |
| find_element_by_link_text | find_elements_by_link_text | 通過完整超鏈接文本進行定位 |
| 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_element_by_css_selector | find_elements_by_css_selector | 通過css選擇器進行定位 |
更詳細定位方式可以參考:《史上最全!Selenium元素定位的30種方式》
頁面操作
1.表單填充
# 找到用戶名輸入用戶名
user = drive.find_element_by_name("LoginForm[username]")
user.send_keys(username)
# 找到密碼輸入密碼
pwd=drive.find_element_by_id("LoginForm_password")
pwd.send_keys(password)
# 點擊登錄按鈕實作登錄
drive.find_element_by_class_name("login_btn").click()
2.視窗句柄
簡單講,句柄就是瀏覽器上方每一個視窗欄的唯一標識
?
#獲取當前視窗所有句柄
handles = drive.window_handles
#通過句柄 切換到第2個標簽頁
drive.switch_to.window(handles[2])
"""操作完成"""
#關閉當前視窗
driver.close()
#通過句柄 切換到第1個標簽頁
drive.switch_to.window(handles[0])
time.sleep(random.uniform(2,3))
3.url加載和獲取
#url加載
drive.get(url)
# 獲取當前頁面url并斷言
currentPageUrl = driver.current_url
4.cookie處理
- get_cookies:獲取cookie資訊
- add_cookie:添加cookie資訊
drive.get("http://www.baidu.com")
cookie = {'name':'foo','value':'bar'}
drive.add_cookie(cookie)
drive.get_cookies()
等待方式
現在很多網站采用 Ajax技術
無法確定網頁元素什么時候能被完全加載
所以網頁元素的選取比較困難
此時就需要設定等待(等待網頁加載完成)
selenium有兩種等待方式:
- 顯式等待
- 隱式等待
1.顯式等待
顯式等待是一種條件觸發式等待
直到設定的某一條件達成時才會繼續執行
可以設定超時時間,如果超過超時時間元素依然沒被加載,就會拋出例外
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
drive = webdriver.Chrome()
url = 'http://www.baidu.com/'
drive.get(url)
try:
WebDriverWait(self.driver,10).until(EC.presence_of_element_located(By.ID,"LoginForm[username]")) #顯示等待
except:
print('%s頁面未找到元素'% loc)
以上代碼加載 'http://www.baidu.com/'頁面
并定位id為"LoginForm[username]"的元素
設定超時時間10秒,webDriverWait默認會500ms檢測一下元素是否存在
selenium提供了一些內置的用于顯示等待的方法,
位于expected_conditions類中,詳細見下表
| 內置方法 | 功能 |
|---|---|
| title_is | 判斷當前頁面的title是否等于預期內容 |
| title_contains | 判斷當前頁面的title是否包含預期字串 |
| presence_of_element_located | 判斷某個元素是否被加到了dom樹里, 并不代表該元素一定可見 |
| presence_of_all_element_located | 判斷是否至少有1個元素存在于dom樹里 |
| visibility_of_element_located | 判斷某個元素是否可見 |
| visibility_of | 判斷某個元素是否可見 |
| invisibility_of_element_located | 判斷某個元素是否不存在于dom樹里或不可見 |
| text_to_be_present_in_element | 判斷元素中的text是否包含了預期的字串 |
| text_to_be_present_in_element_value | 判斷元素中的value屬性是否包含了預期字符 |
| frame_to_be_available_and_switch_to_it | 判斷該frame是否可以切換進去,如果可以, 回傳True并切換進去,否則回傳False |
| element_to_be_clickable | 判斷某個元素是否可見并且是enable的 |
| staleness_of | 等待某個元素從dom樹中移除 |
| element_to_be_selected | 判斷某個元素是否被選中了,一般用于下拉串列 |
| element_located_to_be_selected | 判斷某個元素是否被選中了,一般用于下拉串列 |
| element_selection_state_to_be | 判斷某個元素的選中狀態是否符合預期 |
| element_located_selection_state_to_be | 判斷某個元素的選中狀態是否符合預期 |
| alert_is_present | 判斷頁面上是否存在alert框 |
2.隱式等待
隱式等待是在嘗試定位某個元素時,如果沒能立刻發現,就等待固定時長
類似于socket超時,默認設定是0秒,即相當于最長等待時長
在瀏覽器界面直觀感受是:
等待直到網頁加載完成(地址欄這個地方不是× 變成如下)時繼續執行,
網頁加載超過設定等待時長才報錯
?
使用方法
from selenium import webdriver
drive = webdriver.Chrome()
url = 'http://www.baidu.com/'
#設定最大等待時長 10秒
drive.implicitly_wait(10)
drive.get(url)
user = drive.find_element_by_name("LoginForm[username]")
3.執行緒休眠
time.sleep(time)是比較常用的執行緒休眠方式
為了避免風險,我個人比較喜歡隨機休眠
time.sleep(random.uniform(4,5))
擴展程式加載
# 設定好應用擴展
chrome_options.add_extension(extension_path)
#添加下載路徑
#download.default_directory:設定下載路徑 profile.default_content_settings.popups:設定為 0 禁止彈出視窗
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory':tmp_path}
chrome_options.add_experimental_option('prefs', prefs)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/112867.html
標籤:其他
上一篇:Python代碼優化技巧和竅門
