1. 程式人生 > 程式設計 >python 爬蟲之selenium視覺化爬蟲的實現

python 爬蟲之selenium視覺化爬蟲的實現

之所以把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)

到此這篇關於python 爬蟲之selenium視覺化爬蟲的實現的文章就介紹到這了,更多相關selenium視覺化爬蟲內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!