1. 程式人生 > 實用技巧 >python 爬蟲之selenium視覺化爬蟲介紹

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)