1. 程式人生 > 程式設計 >selenium+python配置chrome瀏覽器的選項的實現

selenium+python配置chrome瀏覽器的選項的實現

1. 背景

在使用selenium瀏覽器渲染技術,爬取網站資訊時,預設情況下就是一個普通的純淨的chrome瀏覽器,而我們平時在使用瀏覽器時,經常就新增一些外掛,擴充套件,代理之類的應用。相對應的,當我們用chrome瀏覽器爬取網站時,可能需要對這個chrome做一些特殊的配置,以滿足爬蟲的行為。

常用的行為有:

  • 禁止圖片和視訊的載入:提升網頁載入速度。
  • 新增代理:用於翻牆訪問某些頁面,或者應對IP訪問頻率限制的反爬技術。
  • 使用移動頭:訪問移動端的站點,一般這種站點的反爬技術比較薄弱。
  • 新增擴充套件:像正常使用瀏覽器一樣的功能。
  • 設定編碼:應對中文站,防止亂碼。
  • 阻止JavaScript執行。
  • ………

2. 環境

  • python 3.6.1
  • 系統:win7
  • IDE:pycharm
  • 安裝過chrome瀏覽器
  • 配置好chromedriver
  • selenium 3.7.0

3. chromeOptions

chromeOptions 是一個配置 chrome 啟動是屬性的類。通過這個類,我們可以為chrome配置如下引數(這個部分可以通過selenium原始碼看到):

  • 設定 chrome 二進位制檔案位置 (binary_location)
  • 新增啟動引數 (add_argument)
  • 新增擴充套件應用 (add_extension,add_encoded_extension)
  • 新增實驗性質的設定引數 (add_experimental_option)
  • 設定偵錯程式地址 (debugger_address)

原始碼:

# .\Lib\site-packages\selenium\webdriver\chrome\options.py
class Options(object):

  def __init__(self):
    # 設定 chrome 二進位制檔案位置
    self._binary_location = ''
    # 新增啟動引數
    self._arguments = []
    # 新增擴充套件應用
    self._extension_files = []
    self._extensions = []
    # 新增實驗性質的設定引數
    self._experimental_options = {}
    # 設定偵錯程式地址
    self._debugger_address = None

使用案例:

# 設定預設編碼為 utf-8,也就是中文

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
driver = webdriver.Chrome(chrome_options = options)

4. 常用配置官方網站參考:https://sites.google.com/a/chromium.org/chromedriver/capabilities

4.1. 設定編碼格式

# 設定預設編碼為 utf-8,也就是中文

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('lang=zh_CN.UTF-8')
driver = webdriver.Chrome(chrome_options = options)

4.2. 模擬移動裝置

移動裝置user-agent表格:http://www.fynas.com/ua

因為移動版網站的反爬蟲的能力比較弱

# 通過設定user-agent,用來模擬移動裝置
# 比如模擬 android QQ瀏覽器
options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML,like Gecko) Version/4.0 Mobile Safari/533.1"')

# 模擬iPhone 6
options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML,like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"')

4.3. 禁止圖片載入

不載入圖片的情況下,可以提升爬取速度。

# 禁止圖片的載入
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs",prefs)

# 啟動瀏覽器,並設定好wait
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.set_window_size(configure.windowHeight,configure.windowWidth)  # 根據桌面解析度來定,主要是為了抓到驗證碼的截圖
wait = WebDriverWait(browser,timeout = configure.timeoutMain)

4.4. 新增代理

為selenium爬蟲新增代理,這個地方尤其需要注意的是,在選擇代理時,儘量選擇靜態IP,才能提升爬取的穩定性。因為如果選擇selenium來做爬蟲,說明網站的反爬能力比較高(要不然直接上scrapy了),對網頁之間的連貫性,cookies,使用者狀態等有較高的監測。如果使用動態匿名IP,每個IP的存活時間是很短的(1~3分鐘)。

from selenium import webdriver
# 靜態IP:102.23.1.105:2005
# 阿布雲動態IP:http://D37EPSERV96VT4W2:[email protected]:9020
PROXY = "proxy_host:proxy:port"
options = webdriver.ChromeOptions()
desired_capabilities = options.to_capabilities()
desired_capabilities['proxy'] = {
  "httpProxy": PROXY,"ftpProxy": PROXY,"sslProxy": PROXY,"noProxy": None,"proxyType": "MANUAL","class": "org.openqa.selenium.Proxy","autodetect": False
}
driver = webdriver.Chrome(desired_capabilities = desired_capabilities)

4.5. 瀏覽器選項設定

selenium一般開啟的是不帶擴充套件的純淨的瀏覽器,但是有時候我們想對瀏覽器進行一些設定,比如 設定flash選項的預設值為全域性始終允許,清除cookies,清除快取 之類。

想要實現這個目的,有一種思路,下面以chrome瀏覽器為例:

在selenium爬蟲啟動時,首先開一個視窗,在位址列鍵入:chrome://settings/content 或 chrome://settings/privacy,然後由程式,像操作普通網頁一樣,進行設定,儲存。

selenium+python配置chrome瀏覽器的選項的實現

4.6.新增瀏覽器擴充套件應用

selenium一般開啟的是不帶擴充套件的純淨的瀏覽器,但是有時候我們爬取資料時需要藉助一些外掛,比如解析類xpath helper,翻譯類,獲取額外資訊(銷量)等。那我們怎麼在啟動chromedriver時,帶上一些我們需要的外掛呢?

下面以在chrome中載入Xpath Helper外掛為例:

4.6.1. 下載相應的外掛Xpath Helper下載地址:https://www.jb51.net/softs/673040.html
如下,是一個 以 crx 為字尾的檔案:

selenium+python配置chrome瀏覽器的選項的實現4.6.2.

將外掛路徑填入程式碼中

# 新增xpath helper應用

from selenium import webdriver
chrome_options = webdriver.ChromeOptions()

# 設定好應用擴充套件
extension_path = 'D:/extension/XPath-Helper_v2.0.2.crx'
chrome_options.add_extension(extension_path)

# 啟動瀏覽器,並設定好wait
browser = webdriver.Chrome(chrome_options=chrome_options)

4.6.3. 結果展示

selenium+python配置chrome瀏覽器的選項的實現

4.6.4. 注意事項

第一,為了提高爬取速度,儘可能的少載入外掛。

第二,有一種方案會載入使用者對chrome瀏覽器的所有配置資訊,但是測試並無法使用,如下:

首先進入C:\Users(使用者)\你的電腦名稱\AppData\Local\Google\Chrome\User Data\Default\Extensions,點開Extensions,裡面的資料夾就是安裝過的擴充套件,(記得先把電腦隱藏資料夾顯示出來,否則找不到) 但是名字是一堆我看不懂的無序的英文字母,我的辦法是一個一個點開找到對應的外掛版本號,版本號在chrome Extensions選項裡找然後打包你需要的外掛:開啟chrome的設定,在裡面點開擴充套件程式,選中開發者模式,你安裝的外掛的下面會出現一個ID,這個ID對應的就是你要打包的外掛,然後打包擴充套件程式,找到對應的資料夾(或者你也可以把這個資料夾複製到電腦任意地方)下面的版本號的資料夾,也就是ID名資料夾內部的那個資料夾,然後點選打包擴充套件程式,就可以了,會相應的在版本號的同一級地方出現字尾名是crx和pem的檔案,這個crx的檔案就是我們需要的(不過按照這種方式,在我的本地目錄是找不到這樣的crx檔案,需要單獨下載…)。準備工作完成,看程式碼:

# 第一種方式
# chrome瀏覽器的擴充套件程式都在:C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Profile 2\Extensions\下
chrome_options.add_argument("user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/User Data")
# 載入所有Chrome配置, 用Chrome位址列輸入chrome://version/,檢視自己的“個人資料路徑”,然後在瀏覽器啟動時,呼叫這個配置檔案,程式碼如下:
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('--user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data') #設定成使用者自己的資料目錄
driver = webdriver.Chrome(chrome_options=option)
# 出現錯誤結果
第一,所有瀏覽器視窗,包括自己開啟的都會被控制住。
第二,其他動作不起作用,而且會crash。
Traceback (most recent call last):
 File "E:/PyCharmCode/taobaoProductSelenium/taobaoSelenium.py",line 40,in <module>
  # 啟動瀏覽器,並設定好wait
 File "E:\Miniconda\lib\site-packages\selenium\webdriver\chrome\webdriver.py",line 69,in __init__
  desired_capabilities=desired_capabilities)
 File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py",line 151,in __init__
  self.start_session(desired_capabilities,browser_profile)
 File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py",line 240,in start_session
  response = self.execute(Command.NEW_SESSION,parameters)
 File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\webdriver.py",line 308,in execute
  self.error_handler.check_response(response)
 File "E:\Miniconda\lib\site-packages\selenium\webdriver\remote\errorhandler.py",line 194,in check_response
  raise exception_class(message,screen,stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed
 (Driver info: chromedriver=2.32.498550 (9dec58e66c31bcc53a9ce3c7226f0c1c5810906a),platform=Windows NT 6.1.7601 SP1 x86_64)

4.7. 登入時關閉彈出的密碼儲存提示框

最近在使用chrome登入網站的時候總有密碼儲存提示框,並不是所有的都會有密碼儲存提示框,其實只需要設定啟動chrome的相關引數就可以避免這種問題。

from time import sleep 
from selenium import webdriver 
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions() 
prefs = {} 
# 設定這兩個引數就可以避免密碼提示框的彈出
prefs[“credentials_enable_service”] = False 
prefs[“profile.password_manager_enabled”] = False 
options.add_experimental_option(“prefs”,prefs) 
browser = webdriver.Chrome(chrome_options=options) 
browser.get('https://www.baidu.com/')

5. 其他引數

參考文章:https://www.jb51.net/article/182967.htm

5.1 chrome位址列命令在Chrome的瀏覽器位址列中輸入以下命令,就會返回相應的結果。這些命令包括檢視記憶體狀態,瀏覽器狀態,網路狀態,DNS伺服器狀態,外掛快取等等。但是需要注意的是這些命令會不停的變動,所以不一定都是好用的。
  about:version - 顯示當前版本
  about:memory - 顯示本機瀏覽器記憶體使用狀況
  about:plugins - 顯示已安裝外掛
  about:histograms - 顯示歷史記錄
  about:dns - 顯示DNS狀態
  about:cache - 顯示快取頁面
  about:gpu -是否有硬體加速
  about:flags -開啟一些外掛 //使用後彈出這麼些東西:“請小心,這些實驗可能有風險”,不知會不會搞亂俺的配置啊!
  chrome://extensions/ - 檢視已經安裝的擴充套件

5.2. chrome實用引數

其他的一些關於Chrome的實用引數及簡要的中文說明,使用方法同上4.5.4,當然也可以在shell中使用。
  –user-data-dir=”[PATH]” 指定使用者資料夾User Data路徑,可以把書籤這樣的使用者資料儲存在系統分割槽以外的分割槽。
  –disk-cache-dir=”[PATH]“ 指定快取Cache路徑
  –disk-cache-size= 指定Cache大小,單位Byte
  –first run 重置到初始狀態,第一次執行
  –incognito 隱身模式啟動
  –disable-javascript 禁用Javascript
  --omnibox-popup-count=“num” 將位址列彈出的提示選單數量改為num個。我都改為15個了。
  --user-agent=“xxxxxxxx” 修改HTTP請求頭部的Agent字串,可以通過about:version頁面檢視修改效果
  --disable-plugins 禁止載入所有外掛,可以增加速度。可以通過about:plugins頁面檢視效果
  --disable-javascript 禁用JavaScript,如果覺得速度慢在加上這個
  --disable-java 禁用java
  --start-maximized 啟動就最大化
  --no-sandbox 取消沙盒模式
  --single-process 單程序執行
  --process-per-tab 每個標籤使用單獨程序
  --process-per-site 每個站點使用單獨程序
  --in-process-plugins 外掛不啟用單獨程序
  --disable-popup-blocking 禁用彈出攔截
  --disable-plugins 禁用外掛
  --disable-images 禁用影象
  --incognito 啟動進入隱身模式
  --enable-udd-profiles 啟用賬戶切換選單
  --proxy-pac-url 使用pac代理 [via 1/2]
  --lang=zh-CN 設定語言為簡體中文
  --disk-cache-dir 自定義快取目錄
  --disk-cache-size 自定義快取最大值(單位byte)
  --media-cache-size 自定義多媒體快取最大值(單位byte)
  --bookmark-menu 在工具 欄增加一個書籤按鈕
  --enable-sync 啟用書籤同步
  –single-process 單程序執行Google Chrome
  –start-maximized 啟動Google Chrome就最大化
  –disable-java 禁止Java
  –no-sandbox 非沙盒模式執行

到此這篇關於selenium+python配置chrome瀏覽器的選項的實現的文章就介紹到這了,更多相關selenium python配置chrome內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!