🥳Hãy tham gia Cộng đồng ScrapelessYêu cầu dùng thử miễn phí để truy cập Bộ công cụ quét web mạnh mẽ của chúng tôi!
Quay lại Blog

Sử dụng Proxy trong Python với Selenium

James Thompson
James Thompson

Scraping and Proxy Management Expert

12-Sep-2024

Bạn đã bị xác định là bot sử dụng Selenium để thu thập dữ liệu web chưa?

Có thể hiểu được. Mặc dù Selenium là một công cụ tuyệt vời để thu thập dữ liệu từ các trang web động, nhưng nó không thể tự mình chống lại các biện pháp phòng chống bot phức tạp. Bạn có thể thêm proxy vào trình thu thập dữ liệu Selenium của mình để kiểm soát giới hạn tốc độ, tránh các hạn chế về địa lý và ngăn chặn việc cấm IP.

Selenium Proxy: Nó là gì?

Proxy đóng vai trò trung gian giữa máy khách và máy chủ. Bằng cách sử dụng nó, máy khách bỏ qua các giới hạn về địa lý và gửi các yêu cầu ẩn danh, an toàn đến các máy chủ khác.

Máy chủ proxy có thể được sử dụng bởi các trình duyệt headless giống như các máy khách HTTP. Khi truy cập các trang web, proxy Selenium giúp bảo vệ địa chỉ IP của bạn và bỏ qua các lệnh cấm.

Selenium với hỗ trợ proxy rất hữu ích cho các tác vụ tự động hóa trình duyệt như thu thập dữ liệu trang web và kiểm tra. Để tìm hiểu cách thiết lập proxy trong Selenium để thu thập dữ liệu web, hãy tiếp tục đọc!

Cách cấu hình Selenium Proxy

Dòng mã sau đây tải trình điều khiển Chrome headless và điều hướng đến httpbin, một trang web cung cấp địa chỉ IP của máy khách. Cuối cùng, tập lệnh in ra câu trả lời HTML.

language Copy
# pip install selenium webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

# thiết lập tùy chọn Chrome để chạy ở chế độ headless
options = Options()
options.add_argument("--headless=new")

# khởi tạo trình điều khiển Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()), 
    options=options
)

# điều hướng đến trang web mục tiêu
driver.get("https://httpbin.io/ip")

# in ra HTML của trang web mục tiêu
print(driver.page_source)

# giải phóng tài nguyên và đóng trình duyệt
driver.quit()

Mã sẽ in ra HTML sau đây:

language Copy
<html><head><meta name="color-scheme" content="light dark"><meta charset="utf-8"></head><body><pre>{
  "origin": "50.217.226.40:80"
}
</pre><div class="json-formatter-container"></div></body></html>

Trong Selenium, để thiết lập proxy, bạn phải:

  • Thu thập một máy chủ proxy đáng tin cậy
  • Nhập nó vào trường --proxy-server của tùy chọn Chrome
  • Truy cập trang bạn muốn truy cập.

Đầu tiên, hãy truy cập trang web Free Proxy List để thu thập địa chỉ proxy miễn phí. Thiết lập Selenium với Options để sử dụng proxy để mở Chrome. Sau đó, in ra nội dung văn bản thân của trang web đích.

language Copy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# xác định địa chỉ và cổng proxy
proxy = "20.235.159.154:80"

# thiết lập tùy chọn Chrome để chạy ở chế độ headless bằng cách sử dụng proxy
options = Options()
options.add_argument("--headless=new")
options.add_argument(f"--proxy-server={proxy}")

# khởi tạo trình điều khiển Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

# điều hướng đến trang web mục tiêu
driver.get("https://httpbin.io/ip")

# in ra nội dung thân của trang web mục tiêu
print(driver.find_element(By.TAG_NAME, "body").text)

# giải phóng tài nguyên và đóng trình duyệt
driver.quit()

Bây giờ, mọi yêu cầu được thực hiện bởi phiên bản Chrome được điều khiển sẽ được chuyển qua proxy được chỉ định.

IP máy chủ proxy và phản hồi trang web khớp. Điều này cho thấy Selenium đang sử dụng máy chủ proxy để xem các trang web.

Xác thực Proxy trong Selenium

Một số máy chủ proxy sử dụng xác thực để ngăn chặn những người dùng không có thông tin xác thực hợp lệ truy cập vào máy chủ của họ. Điều đó thường xảy ra khi sử dụng proxy cao cấp hoặc các giải pháp thương mại.

Dưới đây là cú pháp Selenium để cung cấp tên người dùng và mật khẩu trong URL proxy được xác thực:

language Copy
<PROXY_PROTOCOL>://<YOUR_USERNAME>:<YOUR_PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>

Tuy nhiên, do trình điều khiển Chrome bỏ qua tên người dùng và mật khẩu theo mặc định, việc nhập URL vào --proxy-server sẽ không hoạt động. Plugin của bên thứ ba như Selenium Wire có thể giúp trong trường hợp này.

Với sự trợ giúp của Selenium Wire, bạn có thể sửa đổi các yêu cầu của trình duyệt theo ý muốn và có quyền truy cập vào chính các yêu cầu đó. Để cài đặt nó, hãy sử dụng lệnh được hiển thị bên dưới:

language Copy
pip install blinker==1.7.0 selenium-wire

Để xử lý xác thực proxy, hãy sử dụng Selenium Wire, như được minh họa bên dưới:

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# cấu hình proxy
proxy_username = "<YOUR_USERNAME>"
proxy_password = "<YOUR_PASSWORD>"
proxy_address = "20.235.159.154"
proxy_port = "80"

# tạo URL proxy với xác thực


```python
proxy_url = f"http://{proxy_username}:{proxy_password}@{proxy_address}:{proxy_port}"

# đặt tùy chọn selenium-wire để sử dụng proxy
seleniumwire_options = {
    "proxy": {
        "http": proxy_url,
        "https": proxy_url
    },
}

# đặt tùy chọn Chrome để chạy ở chế độ ẩn danh
options = Options()
options.add_argument("--headless=new")

# khởi tạo trình điều khiển Chrome với dịch vụ, tùy chọn selenium-wire và tùy chọn Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# điều hướng đến trang web đích
driver.get("https://httpbin.io/ip")

# in nội dung của trang web đích
print(driver.find_element(By.TAG_NAME, "body").text)

# giải phóng tài nguyên và đóng trình duyệt
driver.quit()

Bạn có mệt mỏi vì liên tục bị chặn web scraping?

Scrapeless: giải pháp scraping trực tuyến tốt nhất, tất cả trong một!

Giữ ẩn danh và tránh bị cấm theo IP với luân chuyển proxy thông minh, hiệu suất cao của chúng tôi:

Hãy thử miễn phí!

Các giao thức proxy Selenium tốt nhất

Các lựa chọn thay thế phổ biến nhất để chọn giao thức cho proxy Selenium là HTTP, HTTPS và SOCKS5.

Proxy HTTPS bổ sung thêm một mức độ bảo mật bằng cách mã hóa dữ liệu mà chúng truyền qua internet, trái ngược với proxy HTTP. Do đó, proxy HTTP được ưa chuộng và an toàn hơn.

SoCKS5, hay SOCKS, là một giao thức hữu ích khác cho proxy Selenium. Đây là giao thức linh hoạt hơn vì nó có thể xử lý nhiều loại lưu lượng trực tuyến hơn, chẳng hạn như email và giao thức truyền tệp.

Xét cho cùng, việc thu thập và trích xuất dữ liệu web được hưởng lợi rất nhiều từ proxy HTTP và HTTPS, trong khi các tác vụ lưu lượng không phải HTTP phù hợp với SOCKS.

Sử dụng Proxy xoay vòng trong Python cho Selenium

Nếu tập lệnh của bạn gửi nhiều truy vấn trong một khoảng thời gian ngắn, máy chủ có thể đánh dấu là đáng ngờ và cấm IP của bạn. Bạn sẽ ít thành công hơn khi thu thập dữ liệu khi cố gắng sử dụng các địa chỉ IP cụ thể vì các trang web có thể xác định và chặn các yêu cầu từ các địa chỉ đó.

Tuy nhiên, vấn đề này có thể được giải quyết bằng cách sử dụng chiến lược proxy luân phiên. Sau một khoảng thời gian hoặc yêu cầu nhất định, IP cuối của bạn sẽ liên tục thay đổi do thay đổi proxy. Điều này giúp bạn không bị máy chủ cấm bằng cách khiến bạn xuất hiện như một người dùng riêng biệt mỗi lần.

Hãy cùng xem cách sử dụng selenium-wire để tạo trình xoay vòng proxy trong Selenium.

Trước tiên, cần thiết lập một nhóm proxy. Chúng ta sẽ sử dụng một số proxy miễn phí trong ví dụ này.

Như sau, hãy đặt chúng vào một mảng:

language Copy
PROXIES = [
    "http://19.151.94.248:88",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

Tiếp theo, sử dụng random.choice() để trích xuất một proxy ngẫu nhiên, sau đó bạn có thể sử dụng để bắt đầu một phiên bản mới của trình điều khiển. Mã hoàn thiện của bạn sẽ trông như thế này:

python Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

import random

# danh sách các proxy để luân phiên
PROXIES = [
    "http://20.235.159.154:80",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

# chọn ngẫu nhiên một proxy
proxy = random.choice(PROXIES)

# đặt tùy chọn selenium-wire để sử dụng proxy
seleniumwire_options = {
    "proxy": {
        "http": proxy,
        "https": proxy
    },
}

# đặt tùy chọn Chrome để chạy ở chế độ ẩn danh
options = Options()
options.add_argument("--headless=new")

# khởi tạo trình điều khiển Chrome với dịch vụ, tùy chọn selenium-wire và tùy chọn Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# điều hướng đến trang web đích
driver.get("https://httpbin.io/ip")

# in nội dung của trang web đích
print(driver.find_element(By.TAG_NAME, "body").text)

# giải phóng tài nguyên và đóng trình duyệt
driver.quit()

Trên thực tế, sử dụng proxy miễn phí thường sẽ dẫn đến tình trạng chặn. Mặc dù chúng tôi đã sử dụng chúng để minh họa các nguyên tắc cơ bản, nhưng bạn không bao giờ nên phụ thuộc vào chúng cho một dự án thực tế.

Lỗi 403 của Selenium Grid: Proxy bị cấm

Thực thi song song các tập lệnh đa nền tảng và điều khiển trình duyệt từ xa có thể thực hiện được bằng Selenium Grid. Tuy nhiên, nếu bạn sử dụng nó, bạn có thể gặp phải một trong những sự cố thường gặp nhất trong quá trình thu thập dữ liệu web: Lỗi 403: Forbidden for Proxy. Có hai lý do khiến điều đó xảy ra:

  • Cổng 4444 đã được một quy trình khác sử dụng.
  • Yêu cầu RemoteWebDriver của bạn không nhận được URL đúng.
    Hãy đảm bảo rằng bạn đang kết nối trình điều khiển từ xa với URL trung tâm chính xác, như được chỉ ra bên dưới, nếu điều đó không giải quyết được sự cố:
python Copy
import selenium.webdriver as webdriver
# ...
webdriver.Remote('http://localhost:4444/wd/hub', {})

Kết luận

Máy chủ proxy có thể giúp vượt qua các hệ thống phát hiện chống bot, nhưng chúng cần rất nhiều công sức duy trì thủ công và không phải lúc nào cũng đáng tin cậy. Sử dụng API web scraping, như Scrapeless, để vượt qua mọi biện pháp chống bot một cách đáng tin cậy và tiết kiệm thời gian cho việc tìm kiếm và thiết lập proxy. Nhận dùng thử miễn phí Scrapeless!

Tại Scrapeless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định hiện hành và chính sách bảo mật của trang web. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm pháp lý đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động thu thập dữ liệu nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem lại các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục