python 爬蟲之selenium視覺化爬蟲的實現
之所以把selenium爬蟲稱之為視覺化爬蟲
主要是相較於前面所提到的幾種網頁解析的爬蟲方式
selenium爬蟲主要是模擬人的點選操作
selenium驅動瀏覽器並進行操作的過程是可以觀察到的
就類似於你在看著別人在幫你操縱你的電腦,類似於別人遠端使用你的電腦
當然了,selenium也有無介面模式
快速入門
selenium基本介紹:
selenium 是一套完整的web應用程式測試系統,
包含了測試的錄製(selenium IDE),編寫及執行(Selenium Remote Control)
和測試的並行處理(Selenium Grid)。
Selenium的核心Selenium Core基於JsUnit,
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)
到此這篇關於python 爬蟲之selenium視覺化爬蟲的實現的文章就介紹到這了,更多相關selenium視覺化爬蟲內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!