python 爬蟲之selenium視覺化爬蟲介紹
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
以下文章來源於騰訊雲 作者:詭途
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
之所以把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可以用用於頁面自動化、網路監測、網頁截圖,以及無介面測試
簡單測試
from selenium import webdriver # #宣告瀏覽器物件 browser1 = webdriver.Chrome() browser2 = webdriver.Firefox() # #訪問頁面 browser1.get("http://www.baidu.com") print(browser1.page_source) #關閉當前視窗 browser1.close()
元素定位
要想對頁面進行操作,首先要做的是選中頁面元素,
比較常見的八種元素定位方式,如下表
頁面操作
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類中,詳細見下表
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)