Selenium WebDriver là một trong những công cụ phổ biến nhất để tự động hóa trình duyệt và thu thập dữ liệu. Khi làm việc với khối lượng yêu cầu lớn hoặc khi cần vượt qua các hạn chế địa lý, việc cài đặt proxy đúng cách là rất quan trọng. Trong hướng dẫn này, chúng ta sẽ xem xét tất cả các cách tích hợp proxy vào Selenium cho các trình duyệt và ngôn ngữ lập trình khác nhau, cũng như giải quyết các vấn đề thường gặp mà các nhà phát triển gặp phải.
Tại sao cần proxy trong Selenium
Khi tự động hóa việc thu thập dữ liệu web hoặc thử nghiệm qua Selenium, có một số nhiệm vụ không thể giải quyết mà không có proxy:
- Vượt qua giới hạn tỷ lệ — nhiều trang web giới hạn số lượng yêu cầu từ một địa chỉ IP. Nếu không có proxy, kịch bản của bạn sẽ nhanh chóng bị chặn sau 50-100 yêu cầu.
- Hạn chế địa lý — nếu cần thu thập nội dung chỉ có sẵn từ một quốc gia cụ thể, proxy với IP ở vị trí địa lý cần thiết sẽ giải quyết vấn đề này.
- Phân phối tải — khi thu thập dữ liệu hàng loạt, việc xoay vòng địa chỉ IP qua proxy cho phép phân phối các yêu cầu và tránh bị phát hiện là bot.
- Kiểm tra địa phương hóa — để kiểm tra cách trang web hiển thị cho người dùng từ các quốc gia khác nhau, cần có proxy từ các khu vực tương ứng.
- Vượt qua hệ thống chống bot — các biện pháp bảo vệ hiện đại (Cloudflare, DataDome) phân tích danh tiếng IP. Proxy chất lượng cao giúp bạn trông giống như một người dùng thông thường.
Nếu không cài đặt proxy đúng cách, kịch bản Selenium của bạn sẽ hoạt động không ổn định: nhận captcha, bị cấm tạm thời hoặc hoàn toàn bị chặn truy cập. Điều này đặc biệt nghiêm trọng khi thu thập dữ liệu từ các nền tảng thương mại điện tử, mạng xã hội hoặc các trang web có bảo vệ chống bot mạnh mẽ.
Các loại proxy nào nên sử dụng
Việc chọn loại proxy phụ thuộc vào nhiệm vụ. Đối với tự động hóa Selenium, có ba loại proxy chính, mỗi loại có những ưu điểm riêng:
| Loại proxy | Tốc độ | Ẩn danh | Kịch bản tốt nhất |
|---|---|---|---|
| Proxy trung tâm dữ liệu | Rất cao (100+ Mbit/s) | Trung bình | Thu thập dữ liệu công khai, kiểm tra hiệu suất, kiểm tra hàng loạt |
| Proxy cư trú | Trung bình (10-50 Mbit/s) | Rất cao | Vượt qua hệ thống chống bot, thu thập dữ liệu mạng xã hội, thương mại điện tử, các trang web có bảo vệ mạnh mẽ |
| Proxy di động | Trung bình (5-30 Mbit/s) | Tối đa | Làm việc với các phiên bản di động của trang web, mạng xã hội, ứng dụng kiểm tra IP di động |
Khuyến nghị về việc chọn:
- Đối với việc thu thập dữ liệu từ các trang tin tức, API mở, danh bạ đơn giản — proxy trung tâm dữ liệu sẽ phù hợp. Chúng rẻ hơn và nhanh hơn.
- Đối với việc làm việc với Amazon, eBay, Google, mạng xã hội — chỉ nên sử dụng proxy cư trú. Những nền tảng này thường xuyên chặn IP từ trung tâm dữ liệu.
- Đối với việc giả lập người dùng di động hoặc làm việc với Instagram, TikTok — proxy di động là không thể thiếu.
- Đối với việc kiểm tra địa lý — hãy chọn proxy có khả năng chọn quốc gia và thành phố cụ thể.
Cài đặt proxy cho Chrome trong Selenium
Chrome WebDriver là lựa chọn phổ biến nhất cho tự động hóa Selenium. Cài đặt proxy được thực hiện thông qua đối tượng ChromeOptions. Hãy xem xét một vài cách.
Cách 1: Proxy HTTP/HTTPS không cần xác thực (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Cài đặt proxy
PROXY = "123.45.67.89:8080" # Thay thế bằng máy chủ proxy của bạn
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')
# Các tùy chọn bổ sung để ổn định
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# Khởi động driver
driver = webdriver.Chrome(options=chrome_options)
# Kiểm tra IP
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Cách 2: Proxy SOCKS5 (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
PROXY = "123.45.67.89:1080"
chrome_options = Options()
# Đối với SOCKS5, chỉ định giao thức rõ ràng
chrome_options.add_argument(f'--proxy-server=socks5://{PROXY}')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Quan trọng: Chrome hỗ trợ proxy HTTP, HTTPS và SOCKS5. Đối với SOCKS4, cần có các cài đặt bổ sung hoặc sử dụng tiện ích mở rộng.
Cài đặt proxy cho Chrome trong Java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.Proxy;
public class ChromeProxyExample {
public static void main(String[] args) {
// Cài đặt proxy
Proxy proxy = new Proxy();
proxy.setHttpProxy("123.45.67.89:8080");
proxy.setSslProxy("123.45.67.89:8080");
ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);
options.addArguments("--no-sandbox");
WebDriver driver = new ChromeDriver(options);
driver.get("https://httpbin.org/ip");
System.out.println(driver.getPageSource());
driver.quit();
}
}
Cài đặt proxy cho Firefox trong Selenium
Firefox WebDriver sử dụng cách tiếp cận khác để cài đặt proxy thông qua hồ sơ trình duyệt. Điều này mang lại nhiều tính linh hoạt hơn, nhưng yêu cầu hiểu biết về các tham số cấu hình.
Proxy HTTP/HTTPS cho Firefox (Python)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
firefox_options = Options()
# Cài đặt proxy qua preferences
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)
# Tắt proxy cho các địa chỉ cục bộ
firefox_options.set_preference("network.proxy.no_proxies_on", "localhost,127.0.0.1")
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Proxy SOCKS5 cho Firefox (Python)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 1080
firefox_options = Options()
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.socks", PROXY_HOST)
firefox_options.set_preference("network.proxy.socks_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.socks_version", 5)
# Đối với SOCKS5 với DNS qua proxy
firefox_options.set_preference("network.proxy.socks_remote_dns", True)
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Lợi thế của Firefox: tham số network.proxy.socks_remote_dns cho phép thực hiện các truy vấn DNS qua proxy, điều này nâng cao tính ẩn danh và giúp vượt qua các chặn ở cấp độ DNS.
Làm việc với proxy yêu cầu xác thực
Hầu hết các dịch vụ proxy chất lượng cao sử dụng xác thực bằng tên đăng nhập và mật khẩu. Selenium không hỗ trợ việc truyền thông tin xác thực trực tiếp trong URL proxy cho Chrome, vì vậy cần có các giải pháp thay thế.
Cách 1: Tiện ích mở rộng Chrome cho xác thực (được khuyến nghị)
Tạo một tiện ích mở rộng tạm thời cho Chrome, tự động điền tên đăng nhập và mật khẩu khi kết nối với proxy:
import os
import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"
# Tạo manifest cho tiện ích mở rộng
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
}
}
"""
# Script cho xác thực
background_js = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%s",
port: parseInt(%s)
},
bypassList: ["localhost"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%s",
password: "%s"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: [""]},
['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)
# Tạo tiện ích mở rộng
plugin_path = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_path, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
# Khởi động Chrome với tiện ích mở rộng
chrome_options = Options()
chrome_options.add_extension(plugin_path)
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
os.remove(plugin_path) # Xóa tệp tạm thời
Cách 2: Firefox với xác thực (đơn giản hơn)
Firefox cho phép truyền thông tin xác thực qua cài đặt hồ sơ:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"
firefox_options = Options()
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)
# Xác thực (không phải lúc nào cũng hoạt động, phụ thuộc vào phiên bản Firefox)
firefox_options.set_preference("network.proxy.username", PROXY_USER)
firefox_options.set_preference("network.proxy.password", PROXY_PASS)
# Tắt yêu cầu xác thực
firefox_options.set_preference("network.automatic-ntlm-auth.trusted-uris", PROXY_HOST)
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Ghi chú: Nếu nhà cung cấp proxy của bạn hỗ trợ whitelist IP, dễ dàng hơn để thêm IP của máy chủ của bạn vào danh sách trắng và sử dụng proxy mà không cần xác thực.
Xoay vòng proxy trong Selenium
Khi thu thập dữ liệu với khối lượng lớn, việc thay đổi proxy là rất quan trọng để tránh bị chặn. Có hai cách tiếp cận: xoay vòng ở cấp độ mã và sử dụng proxy xoay vòng.
Xoay vòng ở cấp độ mã (tạo driver mới)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random
# Danh sách proxy
PROXY_LIST = [
"123.45.67.89:8080",
"98.76.54.32:8080",
"11.22.33.44:8080",
]
def create_driver_with_proxy(proxy):
"""Tạo driver với proxy đã chỉ định"""
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{proxy}')
chrome_options.add_argument('--no-sandbox')
return webdriver.Chrome(options=chrome_options)
# Thu thập dữ liệu với xoay vòng
urls_to_parse = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
]
for url in urls_to_parse:
# Chọn một proxy ngẫu nhiên
current_proxy = random.choice(PROXY_LIST)
# Tạo một driver mới với proxy
driver = create_driver_with_proxy(current_proxy)
try:
driver.get(url)
# Logic thu thập dữ liệu của bạn
print(f"Đã thu thập {url} qua {current_proxy}")
print(driver.title)
except Exception as e:
print(f"Lỗi với {current_proxy}: {e}")
finally:
driver.quit() # Quan trọng là phải đóng driver
Sử dụng proxy xoay vòng (đơn giản hơn)
Nhiều nhà cung cấp proxy cung cấp endpoint xoay vòng — một URL, tự động thay đổi IP mỗi khi có yêu cầu hoặc qua các khoảng thời gian nhất định. Điều này làm cho mã trở nên đơn giản hơn:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Endpoint proxy xoay vòng (IP tự động thay đổi)
ROTATING_PROXY = "rotating.proxycove.com:8080"
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{ROTATING_PROXY}')
driver = webdriver.Chrome(options=chrome_options)
# Mỗi yêu cầu sẽ có IP mới
urls = ['https://httpbin.org/ip'] * 5
for url in urls:
driver.get(url)
print(driver.find_element("tag name", "body").text)
# Mỗi lần xuất sẽ hiển thị IP khác nhau
driver.quit()
Khuyến nghị: Đối với các dự án lớn, hãy sử dụng proxy xoay vòng — điều này tiết kiệm tài nguyên (không cần tạo lại driver) và đơn giản hóa mã. Proxy cư trú thường hỗ trợ xoay vòng ngay từ đầu.
Các lỗi thường gặp và cách giải quyết
Lỗi: "ERR_PROXY_CONNECTION_FAILED"
Nguyên nhân: Selenium không thể kết nối với máy chủ proxy.
Giải pháp:
- Kiểm tra tính chính xác của IP và cổng proxy
- Đảm bảo rằng proxy đang hoạt động (kiểm tra qua curl:
curl -x http://123.45.67.89:8080 https://httpbin.org/ip) - Kiểm tra tường lửa — có thể các kết nối ra ngoài đến proxy đã bị chặn
- Nếu sử dụng xác thực, hãy kiểm tra tính chính xác của tên đăng nhập/mật khẩu
Lỗi: "ERR_TUNNEL_CONNECTION_FAILED"
Nguyên nhân: Vấn đề với kết nối HTTPS qua proxy.
Giải pháp:
- Đảm bảo rằng proxy hỗ trợ HTTPS (phương thức CONNECT)
- Đối với các trang HTTPS, hãy sử dụng proxy HTTPS hoặc SOCKS5
- Thêm tùy chọn bỏ qua lỗi SSL:
chrome_options.add_argument('--ignore-certificate-errors')
Lỗi: Proxy hoạt động, nhưng trang web phát hiện bot
Nguyên nhân: Trang web sử dụng các phương pháp phát hiện tiên tiến (fingerprinting, phân tích hành vi).
Giải pháp:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')
# Tắt cờ webdriver (dấu hiệu chính của tự động hóa)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=chrome_options)
# Xóa navigator.webdriver
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
'''
})
driver.get('https://bot.sannysoft.com/') # Trang web để kiểm tra phát hiện
Ngoài ra, nên sử dụng thư viện undetected-chromedriver, tự động áp dụng nhiều kỹ thuật chống phát hiện.
Vấn đề: Tải trang chậm qua proxy
Nguyên nhân: Proxy bị quá tải hoặc ở vị trí địa lý xa.
Giải pháp:
- Chọn proxy gần với máy chủ mục tiêu (ví dụ, để thu thập dữ liệu từ các trang web của Mỹ, hãy sử dụng proxy của Mỹ)
- Sử dụng proxy trung tâm dữ liệu cho các nhiệm vụ mà tốc độ quan trọng hơn tính ẩn danh
- Cài đặt thời gian chờ trong Selenium để tránh treo:
from selenium.webdriver.support.ui import WebDriverWait
driver.set_page_load_timeout(30) # Tối đa 30 giây để tải
driver.implicitly_wait(10) # Thời gian chờ ngầm cho các phần tử
Best practices khi làm việc với proxy
1. Sử dụng các nhóm proxy
Đừng phụ thuộc vào một máy chủ proxy duy nhất. Tạo một nhóm từ 10-50 proxy và xoay vòng chúng. Nếu một proxy bị chặn, việc thu thập dữ liệu sẽ tiếp tục từ một proxy khác.
2. Thêm độ trễ ngẫu nhiên
Ngay cả với proxy, các yêu cầu quá nhanh cũng trông đáng ngờ. Thêm độ trễ ngẫu nhiên từ 2-5 giây giữa các yêu cầu:
import time
import random
for url in urls:
driver.get(url)
# Thu thập dữ liệu...
time.sleep(random.uniform(2, 5)) # Độ trễ ngẫu nhiên từ 2-5 giây
3. Giám sát chất lượng proxy
Kiểm tra proxy trước khi sử dụng. Loại bỏ khỏi nhóm những proxy không phản hồi hoặc trả về lỗi:
import requests
def check_proxy(proxy):
"""Kiểm tra tính khả dụng của proxy"""
try:
response = requests.get(
'https://httpbin.org/ip',
proxies={'http': f'http://{proxy}', 'https': f'http://{proxy}'},
timeout=10
)
return response.status_code == 200
except:
return False
# Lọc các proxy hoạt động
working_proxies = [p for p in PROXY_LIST if check_proxy(p)]
print(f"Các proxy hoạt động: {len(working_proxies)}/{len(PROXY_LIST)}")
4. Sử dụng chế độ headless một cách thận trọng
Các trình duyệt headless dễ bị phát hiện hơn. Đối với các trang web phức tạp, hãy khởi động trình duyệt ở chế độ bình thường hoặc sử dụng --window-size thay vì --headless.
5. Ghi lại tất cả các yêu cầu
Lưu thông tin về proxy đã sử dụng cho mỗi yêu cầu. Điều này sẽ giúp phát hiện các proxy có vấn đề và gỡ lỗi các lỗi.
6. Tuân thủ robots.txt và giới hạn tỷ lệ
Ngay cả với proxy, hãy tôn trọng các quy tắc của trang web. Việc thu thập dữ liệu một cách quá mức có thể dẫn đến việc chặn toàn bộ các subnet proxy, gây hại cho những người dùng khác.
Kết luận
Cài đặt proxy đúng cách trong Selenium WebDriver là nền tảng cho việc thu thập dữ liệu và tự động hóa ổn định. Chúng ta đã xem xét tất cả các phương pháp chính để tích hợp proxy cho Chrome và Firefox, làm việc với xác thực, xoay vòng địa chỉ IP và giải quyết các vấn đề thường gặp. Điều quan trọng là chọn loại proxy phù hợp cho nhiệm vụ của bạn: đối với việc thu thập dữ liệu đơn giản, proxy trung tâm dữ liệu là đủ, trong khi đối với việc làm việc với các nền tảng bảo mật, cần có proxy cư trú hoặc di động.
Hãy nhớ về các best practices: sử dụng các nhóm proxy, thêm độ trễ ngẫu nhiên, giám sát chất lượng kết nối và áp dụng các kỹ thuật chống phát hiện. Điều này sẽ tăng cường độ ổn định của các kịch bản của bạn và giảm thiểu rủi ro bị chặn lên đến hàng chục lần.
Nếu bạn dự định tự động hóa việc thu thập dữ liệu với yêu cầu cao về tính ẩn danh và vượt qua các hệ thống chống bot, chúng tôi khuyên bạn nên thử proxy cư trú — chúng cung cấp độ ổn định tối đa khi làm việc với bất kỳ trang web nào, bao gồm mạng xã hội, nền tảng thương mại điện tử và các dịch vụ có bảo vệ tiên tiến. Đối với các nhiệm vụ mà tốc độ xử lý khối lượng lớn dữ liệu là quan trọng, proxy trung tâm dữ liệu sẽ là lựa chọn tối ưu về tỷ lệ giá cả và hiệu suất.