在使用Selenium進行網頁自動化測試或爬蟲開發時,有時需要透過代理IP來隱藏真實IP位址或造訪特定地區的網站。本文將詳細介紹如何使用Python3和Selenium庫,在Chrome瀏覽器中高效配置代理IP。
Python3_Selenium_ Chrome

一、準備工作

1.1 安裝必要的函式庫

首先,確保你已經安裝了Selenium庫和ChromeDriver。此外,還需要一個可以取得代理IP的服務(如免費的公共代理或付費的代理服務)。

pip install selenium

1.2 下載ChromeDriver

從ChromeDriver下載頁面下載與你的Chrome瀏覽器版本相符的ChromeDriver,並將其解壓縮到系統路徑中。

二、配置Chrome代理IP

2.1 建立Chrome Options

在Selenium中,你可以透過ChromeOptions類別來設定Chrome瀏覽器的啟動選項。以下是如何建立一個ChromeOptions物件並設定代理IP的範例程式碼:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 建立ChromeOptions對象
chrome_options = Options()

# 設定代理IP(假設代理IP為123.123.123.123,連接埠為8080)
chrome_options.add_argument('--proxy-server=http://123.123.123.123:8080')

# 如果需要繞過代理程式存取某些位址,可以新增以下參數(例如,不代理localhost)
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_argument('--disable-blink-features=AutomationControlled')

2.2 啟動Chrome瀏覽器

# 建立Chrome WebDriver實例
driver = webdriver.Chrome(options=chrome_options)

# 造訪一個網站以測試代理是否生效
driver.get('http://httpbin.org/ip')

# 列印目前存取的IP位址(應該顯示代理IP)
print(driver.page_source)

# 關閉瀏覽器
driver.quit()

2.3 動態代理配置(可選)

如果你需要動態地更換代理IP(例如,從代理程式池中取得新的代理IP),你可以透過Selenium的Chrome DevTools Protocol(CDP)來實現。以下是一個範例程式碼,展示如何動態地設定代理IP:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.proxy import Proxy, ProxyType
import json

# 建立ChromeOptions對象
chrome_options = Options()

# 停用Chrome的自動化控制提示
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_argument('--disable-blink-features=AutomationControlled')

# 啟動Chrome WebDriver實例(注意:這裡不使用add_argument設定代理)
service = Service(executable_path='/path/to/chromedriver') # 替換為你的chromedriver路徑
driver = webdriver.Chrome(service=service, options=chrome_options)

# 建立一個新的代理物件(這裡以SOCKS5代理為例)
proxy = Proxy({
 'proxyType': ProxyType.MANUAL,
 'httpProxy': '127.0.0.1:1080', # SOCKS5代理位址和連接埠
 'sslProxy': '127.0.0.1:1080', # SOCKS5代理位址和連接埠(對於HTTPS)
 'ftpProxy': '127.0.0.1:1080', # 可選:FTP代理位址和端口
 'socksProxy': '127.0.0.1:1080', # SOCKS代理位址和連接埠(通常與httpProxy和sslProxy相同)
 'socksVersion': 5, # SOCKS代理版本(通常為5)
 'noProxy': ['localhost', '127.0.0.1'] # 不通過代理程式的位址列表
})

# 將代理物件加入到Chrome選項中(注意:這裡使用的是CDP動態配置)
# 需要先啟動瀏覽器,然後透過execute_cdp_cmd方法傳送代理程式設定指令
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
 "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
})

# 設定代理配置
proxy_config = {
 'mode': 'fixed_servers',
 'server': {
 'scheme': 'socks5', # 代理協議(可以是http、https、socks4、socks5等)
 'host': '127.0.0.1', # 代理伺服器位址(這裡使用的是本機代理軟體的位址)
 'port': 1080 # 代理伺服器端口
 }
}

# 將代理配置轉換為JSON字串
proxy_config_json = json.dumps(proxy_config)

# 透過CDP發送代理設定指令
driver.execute_cdp_cmd('Network.enable', {})
driver.execute_cdp_cmd('Network.setProxyOverride', {'proxy': proxy_config_json})

# 造訪一個網站以測試代理是否生效
driver.get('http://httpbin.org/ip')

# 列印目前存取的IP位址(應該顯示代理IP)
print(driver.page_source)

# 關閉瀏覽器
driver.quit()

注意​:在上面的程式碼中,我們使用了CDP的Network.setProxyOverride命令來動態地更改設定代理IP。這種方法允許你在瀏覽器啟動後代理配置,而無需重新啟動瀏覽器。此外,我們也使用了Network.setUserAgentOverride指令來設定使用者代理字串(這是可選的,但有助於模擬真實使用者的網路行為)。

三、注意事項

  1. 代理IP的有效性​:確保你使用的代理IP是有效的,並且沒有被目標網站封鎖。
  2. 代理IP的更換​:如果你需要經常更換代理IP,可以考慮使用代理池或購買付費的代理服務。
  3. 錯誤處理​:在實際應用中,你應該加入錯誤處理邏輯來處理代理IP失效、網路波動等異常情況。
  4. 安全性​:使用代理IP時,請注意保護你的敏感資訊(如密碼、API金鑰等),避免透過代理傳輸敏感資料。

透過本文的介紹和範例程式碼,你應該能夠學會如何在Python3中使用Selenium庫為Chrome瀏覽器設定代理IP。希望這些資訊對你有幫助!