Back to blog

Hướng dẫn sử dụng Proxy với Python Requests và Selenium: Nâng tầm Web Scraping và Ẩn Danh

Trong kỷ nguyên số hóa, việc thu thập dữ liệu (web scraping), kiểm thử phần mềm, hoặc đơn giản là duy trì sự ẩn danh trực tuyến đã trở thành nhu cầu thiết yếu đối với nhiều nhà phát triển, doanh nghiệp và cá nhân. Tuy nhiên, các rào cản như giới hạn địa lý, chặn IP và các biện pháp chống bot ngày càng tinh vi khiến các tác vụ này trở nên khó khăn hơn bao giờ hết. Đây chính là lúc proxy phát huy vai trò quan trọng của mình.

Bài viết này của Netproxy.io sẽ hướng dẫn bạn cách tích hợp và sử dụng proxy một cách hiệu quả với hai thư viện Python phổ biến nhất cho các tác vụ web: RequestsSelenium. Chúng ta sẽ khám phá lý do tại sao proxy là công cụ không thể thiếu, cách thiết lập môi trường và triển khai các ví dụ thực tế.

Tại sao cần sử dụng Proxy với Python?

Sự kết hợp giữa sức mạnh của Python trong xử lý web và khả năng định tuyến lưu lượng của proxy mở ra nhiều cánh cửa:

  • Bảo mật và Ẩn danh: Khi gửi yêu cầu qua proxy, địa chỉ IP thực của bạn sẽ được che giấu. Điều này cực kỳ quan trọng để bảo vệ danh tính cá nhân, tránh bị theo dõi hoặc bị tấn công trực tiếp.
  • Vượt qua giới hạn địa lý: Nhiều dịch vụ và nội dung trực tuyến bị giới hạn truy cập theo khu vực địa lý. Sử dụng proxy từ các quốc gia khác nhau cho phép bạn "giả mạo" vị trí địa lý, truy cập nội dung bị chặn hoặc kiểm tra hoạt động của trang web từ nhiều khu vực khác nhau.
  • Thu thập dữ liệu web (Web Scraping) hiệu quả hơn: Khi thực hiện web scraping quy mô lớn, việc gửi quá nhiều yêu cầu từ một IP duy nhất có thể khiến IP đó bị chặn hoặc bị gắn cờ là bot. Proxy giúp phân tán các yêu cầu qua nhiều địa chỉ IP khác nhau, giảm thiểu rủi ro bị chặn, tăng tốc độ thu thập và đảm bảo tính liên tục của dự án.
  • Kiểm thử và Phát triển: Các nhà phát triển có thể sử dụng proxy để kiểm thử cách ứng dụng hoặc trang web của họ hoạt động khi truy cập từ các vị trí địa lý khác nhau, hoặc khi chịu tải từ nhiều nguồn IP.
  • Quản lý nhiều tài khoản: Đối với các tác vụ yêu cầu đăng nhập nhiều tài khoản trên cùng một dịch vụ (ví dụ: quản lý mạng xã hội, tiếp thị), việc sử dụng proxy riêng cho mỗi tài khoản giúp tránh bị khóa tài khoản do phát hiện hành vi bất thường.

Chuẩn bị: Proxy và Môi trường Python

Để bắt đầu, bạn cần chuẩn bị hai yếu tố chính:

Lấy Proxy từ Netproxy.io

Netproxy.io cung cấp các giải pháp proxy chất lượng cao, đáng tin cậy và đa dạng, phù hợp với mọi nhu cầu từ cá nhân đến doanh nghiệp lớn. Chúng tôi cung cấp:

  • Proxy dân cư (Residential Proxies): Sử dụng IP thực từ các nhà cung cấp dịch vụ Internet (ISP), mang lại tính ẩn danh cao và khó bị phát hiện là proxy. Lý tưởng cho web scraping, quản lý tài khoản, và truy cập nội dung nhạy cảm.
  • Proxy trung tâm dữ liệu (Datacenter Proxies): Cung cấp tốc độ vượt trội và chi phí thấp hơn, phù hợp cho các tác vụ yêu cầu băng thông cao và không quá nhạy cảm với việc bị phát hiện.
  • Proxy xoay vòng (Rotating Proxies): Tự động thay đổi IP sau mỗi yêu cầu hoặc theo một khoảng thời gian nhất định, cực kỳ hiệu quả trong việc né tránh các hệ thống phát hiện và chống chặn.

Sau khi đăng ký tài khoản và mua dịch vụ tại Netproxy.io, bạn sẽ nhận được thông tin chi tiết về proxy của mình, thường bao gồm:

  • Địa chỉ Host/IP: Ví dụ: `proxy.netproxy.io` hoặc `192.168.1.1`
  • Cổng (Port): Ví dụ: `8080` hoặc `3128`
  • Tên người dùng (Username): Nếu proxy yêu cầu xác thực.
  • Mật khẩu (Password): Nếu proxy yêu cầu xác thực.

Cài đặt thư viện Python

Đảm bảo bạn đã cài đặt Python (phiên bản 3.6 trở lên). Sau đó, bạn cần cài đặt các thư viện cần thiết bằng `pip`:

```bash pip install requests pip install selenium pip install webdriver-manager ```

  • `requests`: Thư viện HTTP mạnh mẽ và dễ sử dụng để gửi các yêu cầu web.
  • `selenium`: Thư viện dùng để tự động hóa trình duyệt web, mô phỏng hành vi của người dùng.
  • `webdriver-manager`: Giúp tự động tải xuống và quản lý các trình điều khiển (webdrivers) cho Selenium (ví dụ: ChromeDriver, GeckoDriver) mà không cần phải tự cấu hình thủ công.

Ngoài ra, bạn cần cài đặt trình duyệt web (Chrome hoặc Firefox) và đảm bảo rằng `webdriver-manager` có thể tìm thấy trình điều khiển tương ứng.

Sử dụng Proxy với Python Requests

Thư viện `requests` của Python nổi tiếng với sự đơn giản và hiệu quả. Việc sử dụng proxy với `requests` cũng rất trực quan.

Proxy HTTP/HTTPS cơ bản

Để sử dụng proxy, bạn chỉ cần truyền một dictionary chứa thông tin proxy vào tham số `proxies` của yêu cầu.

```python import requests

# Thông tin proxy từ Netproxy.io # Thay thế bằng thông tin proxy thực tế của bạn proxy_host = "proxy.netproxy.io" proxy_port = "8080" proxy_username = "your_username" # Chỉ cần nếu proxy yêu cầu xác thực proxy_password = "your_password" # Chỉ cần nếu proxy yêu cầu xác thực

# Cấu hình proxy cho HTTP và HTTPS # Đối với proxy không xác thực: # proxies = { # "http": f"http://{proxy_host}:{proxy_port}", # "https": f"http://{proxy_host}:{proxy_port}", # Lưu ý: sử dụng http:// cho cả hai nếu proxy là HTTP # }

# Đối với proxy có xác thực (đây là trường hợp phổ biến hơn với Netproxy.io) proxies = { "http": f"http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}", "https": f"http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}", }

# URL để kiểm tra IP công cộng của bạn test_url = "http://httpbin.org/ip" # Hoặc bất kỳ dịch vụ kiểm tra IP nào khác

try: print(f"Đang gửi yêu cầu qua proxy: {proxy_host}:{proxy_port}...") response = requests.get(test_url, proxies=proxies, timeout=10) response.raise_for_status() # Kiểm tra lỗi HTTP

data = response.json() origin_ip = data.get("origin") print(f"Địa chỉ IP công cộng của bạn khi sử dụng proxy: {origin_ip}")

except requests.exceptions.RequestException as e: print(f"Đã xảy ra lỗi khi gửi yêu cầu qua proxy: {e}") except ValueError: print("Không thể phân tích phản hồi JSON. Có thể proxy không hoạt động hoặc trang web có vấn đề.") ```

Giải thích:

  • `proxies` dictionary:

Key `http` dùng cho các yêu cầu HTTP. Key `https` dùng cho các yêu cầu HTTPS. * Giá trị là chuỗi URL của proxy, có thể bao gồm thông tin xác thực (`username:password@`).

  • `timeout=10`: Đặt thời gian chờ tối đa là 10 giây cho mỗi yêu cầu. Điều này rất quan trọng khi sử dụng proxy, vì một số proxy có thể chậm hoặc không phản hồi.
  • `response.raise_for_status()`: Một cách tiện lợi để kiểm tra xem yêu cầu HTTP có thành công hay không. Nếu mã trạng thái là 4xx hoặc 5xx, nó sẽ ném ra một `HTTPError`.
  • `httpbin.org/ip`: Một dịch vụ tiện ích giúp bạn kiểm tra địa chỉ IP mà yêu cầu của bạn được gửi đi.

Xử lý Proxy có Xác thực (Authentication)

Như bạn thấy trong ví dụ trên, việc xử lý proxy có xác thực (`username` và `password`) được tích hợp trực tiếp vào URL của proxy. Đây là cách phổ biến và tiện lợi nhất với thư viện `requests`. Netproxy.io khuyến nghị sử dụng proxy có xác thực để tăng cường bảo mật và quyền truy cập độc quyền.

Proxy xoay vòng (Rotating Proxies)

Để tránh bị chặn khi thực hiện nhiều yêu cầu, bạn nên sử dụng nhiều proxy và xoay vòng chúng. Dưới đây là một ví dụ đơn giản:

```python import requests import random import time

# Danh sách các proxy của bạn từ Netproxy.io # Thêm nhiều proxy vào danh sách này proxy_list = [ {"host": "proxy1.netproxy.io", "port": "8080", "user": "user1", "pass": "pass1"}, {"host": "proxy2.netproxy.io", "port": "8080", "user": "user2", "pass": "pass2"}, {"host": "proxy3.netproxy.io", "port": "8080", "user": "user3", "pass": "pass3"}, ]

test_url = "http://httpbin.org/ip" num_requests = 5

for i in range(num_requests): # Chọn ngẫu nhiên một proxy từ danh sách current_proxy_info = random.choice(proxy_list) proxy_url = f"http://{current_proxy_info['user']}:{current_proxy_info['pass']}@{current_proxy_info['host']}:{current_proxy_info['port']}"

proxies = { "http": proxy_url, "https": proxy_url, }

try: print(f"--- Yêu cầu {i+1} ---") print(f"Đang sử dụng proxy: {current_proxy_info['host']}:{current_proxy_info['port']}") response = requests.get(test_url, proxies=proxies, timeout=10) response.raise_for_status()

data = response.json() print(f"IP công cộng: {data.get('origin')}")

except requests.exceptions.RequestException as e: print(f"Lỗi với proxy {current_proxy_info['host']}:{current_proxy_info['port']}: {e}") # Bạn có thể thêm logic để loại bỏ proxy bị lỗi khỏi danh sách hoặc thử lại

time.sleep(random.uniform(1, 3)) # Tạm dừng ngẫu nhiên để tránh bị phát hiện

print("\nHoàn tất các yêu cầu.") ```

Mẹo: Để quản lý danh sách proxy hiệu quả hơn, bạn có thể lưu chúng vào một tệp JSON hoặc CSV và tải vào chương trình.

Sử dụng Proxy với Selenium

Selenium là công cụ mạnh mẽ để tự động hóa trình duyệt, mô phỏng hành vi người dùng thật. Việc tích hợp proxy với Selenium hơi phức tạp hơn so với `requests` vì nó liên quan đến việc cấu hình trình duyệt thực tế.

Cấu hình Proxy cho Chrome với Selenium

Để thiết lập proxy cho trình duyệt Chrome thông qua Selenium, chúng ta sẽ sử dụng đối tượng `ChromeOptions`.

```python from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.options import Options import time

# Thông tin proxy từ Netproxy.io # Thay thế bằng thông tin proxy thực tế của bạn proxy_host = "proxy.netproxy.io" proxy_port = "8080" proxy_username = "your_username" # Chỉ cần nếu proxy yêu cầu xác thực proxy_password = "your_password" # Chỉ cần nếu proxy yêu cầu xác thực

# KHÔNG HỖ TRỢ XÁC THỰC TRỰC TIẾP QUA --proxy-server trong Chrome Options # Đối với proxy có xác thực, xem phần giải thích dưới đây proxy_address = f"{proxy_host}:{proxy_port}"

# Cấu hình Chrome Options chrome_options = Options() chrome_options.add_argument(f'--proxy-server={proxy_address}') # chrome_options.add_argument('--headless') # Chạy ở chế độ ẩn (không hiển thị giao diện)

# Khởi tạo WebDriver print("Đang khởi tạo trình duyệt Chrome với proxy...") try: service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options)

# Truy cập một trang web để kiểm tra IP driver.get("http://httpbin.org/ip") time.sleep(3) # Đợi trang tải xong

# Lấy nội dung trang và in ra ip_element = driver.find_element("css selector", "pre").text print(f"Phản hồi từ httpbin.org/ip:\n{ip_element}")

# Truy cập một trang web khác để kiểm tra hoạt động driver.get("https://www.whatismyip.com/") time.sleep(5) # Đợi trang tải xong

# Bạn có thể tìm các phần tử trên trang để xác nhận IP # Ví dụ: current_ip_element = driver.find_element("css selector", "#ipv4").text # print(f"IP trên whatismyip.com: {current_ip_element}")

print("\nKiểm tra đã hoàn tất. Đang đóng trình duyệt.")

except Exception as e: print(f"Đã xảy ra lỗi: {e}") finally: if 'driver' in locals() and driver: driver.quit() ```

Lưu ý quan trọng về xác thực proxy với Chrome/Selenium:

Selenium và Chrome không hỗ trợ truyền `username:password` trực tiếp vào đối số `--proxy-server`. Để xử lý proxy có xác thực, bạn có một số lựa chọn:

  1. Sử dụng Proxy Extension: Tạo một tiện ích mở rộng (extension) nhỏ của Chrome dạng `.crx` hoặc thư mục, trong đó có `manifest.json` và `background.js` để tự động xử lý thông tin đăng nhập proxy. Sau đó, bạn thêm tiện ích này vào `ChromeOptions` bằng `chrome_options.add_extension('path/to/your/extension.crx')`. Phương pháp này đòi hỏi một chút kiến thức về phát triển tiện ích Chrome.
  2. Sử dụng thư viện `selenium-wire`: Đây là một thư viện Python mạnh mẽ mở rộng Selenium, cho phép bạn kiểm soát các yêu cầu mạng, bao gồm cả việc dễ dàng thiết lập proxy có xác thực. Đây là giải pháp được khuyến nghị và dễ triển khai nhất cho các nhà phát triển Python.

```bash pip install selenium-wire ``` Ví dụ cơ bản với `selenium-wire`: ```python from seleniumwire import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.options import Options import time

proxy_options = { 'proxy': { 'http': f'http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}', 'https': f'http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}', 'no_proxy': 'localhost,127.0.0.1' # Bỏ qua proxy cho các địa chỉ này } }

chrome_options = Options() # chrome_options.add_argument('--headless')

service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, seleniumwire_options=proxy_options, options=chrome_options)

driver.get("http://httpbin.org/ip") time.sleep(3) print(driver.find_element("css selector", "pre").text) driver.quit() ``` `selenium-wire` đơn giản hóa đáng kể việc này, cho phép bạn xác định proxy trực tiếp trong `seleniumwire_options`.

Cấu hình Proxy cho Firefox với Selenium

Firefox cung cấp một cách trực tiếp hơn để cấu hình proxy có xác thực thông qua `FirefoxOptions` và `set_preference`.

```python from selenium import webdriver from selenium.webdriver.firefox.service import Service from webdriver_manager.firefox import GeckoDriverManager from selenium.webdriver.firefox.options import Options import time

# Thông tin proxy từ Netproxy.io proxy_host = "proxy.netproxy.io" proxy_port = 8080 # Cổng thường là số nguyên cho Firefox options proxy_username = "your_username" proxy_password = "your_password"

# Cấu hình Firefox Options firefox_options = Options() # firefox_options.add_argument('--headless') # Chạy ở chế độ ẩn

# 1: Proxy thủ công 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.https", proxy_host) firefox_options.set_preference("network.proxy.https_port", proxy_port) firefox_options.set_preference("network.proxy.ssl", proxy_host) # Đảm bảo HTTPS cũng qua proxy firefox_options.set_preference("network.proxy.ssl_port", proxy_port)

# Xử lý xác thực proxy cho Firefox (nếu cần) # Firefox thường sẽ bật hộp thoại xác thực khi bạn truy cập trang đầu tiên qua proxy # Để tự động hóa, bạn cần cài đặt các preference cho username/password # LƯU Ý: Đây có thể không hoạt động hoàn hảo trong mọi môi trường và phiên bản Firefox # Thông thường, Selenium không có cách trực tiếp để "điền" hộp thoại xác thực proxy. # Nếu proxy yêu cầu xác thực, bạn sẽ thấy một hộp thoại. # Cách tốt nhất là sử dụng proxy không cần xác thực hoặc dùng Selenium Wire. # Tuy nhiên, nếu proxy là SOCKS5 với xác thực, Firefox có thể xử lý tốt hơn. # firefox_options.set_preference("network.proxy.socks_username", proxy_username) # firefox_options.set_preference("network.proxy.socks_password", proxy_password)

# Để tắt popup hỏi xác thực hoặc bypass firefox_options.set_preference("network.proxy.allow_hijacking_localhost", True) # Có thể hữu ích

print("Đang khởi tạo trình duyệt Firefox với proxy...") try: service = Service(GeckoDriverManager().install()) driver = webdriver.Firefox(service=service, options=firefox_options)

driver.get("http://httpbin.org/ip") time.sleep(5) print(driver.find_element("css selector", "pre").text)

print("\nKiểm tra đã hoàn tất. Đang đóng trình duyệt.")

except Exception as e: print(f"Đã xảy ra lỗi: {e}") finally: if 'driver' in locals() and driver: driver.quit() ```

Lưu ý về xác thực proxy với Firefox/Selenium:

Mặc dù Firefox cho phép bạn đặt các tùy chọn proxy chi tiết hơn, việc tự động hóa hộp thoại xác thực proxy (nếu xuất hiện) với Selenium vẫn là một thách thức. Giống như Chrome, giải pháp đáng tin cậy nhất cho proxy có xác thực là sử dụng `selenium-wire` hoặc đảm bảo proxy của bạn không yêu cầu xác thực trực tiếp từ trình duyệt mà xử lý ở cấp độ máy chủ (ví dụ: xác thực bằng IP Whitelist).

Các Mẹo và Thực hành Tốt khi dùng Proxy

Để tối ưu hóa hiệu quả và tránh bị chặn khi sử dụng proxy:

  • Chọn loại proxy phù hợp: Proxy dân cư (residential) phù hợp cho các tác vụ nhạy cảm và cần độ ẩn danh cao. Proxy trung tâm dữ liệu (datacenter) phù hợp cho các tác vụ tốc độ cao và số lượng lớn, ít nhạy cảm với việc bị phát hiện.
  • Sử dụng proxy xoay vòng: Đây là chiến lược tốt nhất để tránh bị chặn IP. Tự động thay đổi proxy sau mỗi vài yêu cầu hoặc theo một khoảng thời gian nhất định. Netproxy.io cung cấp các giải pháp proxy xoay vòng giúp bạn dễ dàng thực hiện điều này.
  • Quản lý danh sách proxy hiệu quả: Theo dõi trạng thái của proxy (còn sống/chết, tốc độ). Loại bỏ các proxy không hoạt động để cải thiện hiệu suất.
  • Thiết lập `User-Agent` hợp lý: Luôn thay đổi `User-Agent` trong tiêu đề yêu cầu để mô phỏng các trình duyệt và thiết bị khác nhau. Không sử dụng `User-Agent` mặc định của Python `requests` hoặc Selenium vì nó dễ bị phát hiện.
  • Thêm độ trễ ngẫu nhiên (`time.sleep`): Giữa các yêu cầu để mô phỏng hành vi của con người, tránh bị phát hiện là bot.
  • Xử lý lỗi mạnh mẽ: Luôn triển khai các khối `try-except` để bắt và xử lý các lỗi như proxy không phản hồi, kết nối bị từ chối hoặc trang web trả về lỗi.
  • Tuân thủ các quy tắc: Luôn tôn trọng tệp `robots.txt` của trang web và các điều khoản dịch vụ (TOS) của họ. Sử dụng proxy một cách có trách nhiệm và hợp pháp.

Tại sao chọn Netproxy.io?

Khi bạn cần một giải pháp proxy đáng tin cậy cho các dự án Python của mình, Netproxy.io là đối tác lý tưởng:

  • Proxy chất lượng cao: Chúng tôi cung cấp các địa chỉ IP sạch, tốc độ cao và ổn định từ nhiều nguồn khác nhau.
  • Đa dạng gói dịch vụ: Từ proxy dân cư đến datacenter, xoay vòng, chúng tôi có các giải pháp phù hợp với mọi ngân sách và nhu cầu.
  • Dễ dàng tích hợp: Proxy của chúng tôi tương thích hoàn hảo với Python Requests, Selenium và nhiều công cụ khác.
  • Hỗ trợ kỹ thuật chuyên nghiệp: Đội ngũ của chúng tôi luôn sẵn sàng hỗ trợ bạn trong quá trình thiết lập và sử dụng.
  • Bảo mật và ẩn danh tuyệt đối: Đảm bảo dữ liệu và danh tính của bạn luôn được bảo vệ an toàn.

Kết luận

Việc sử dụng proxy với Python Requests và Selenium là một kỹ năng thiết yếu đối với bất kỳ ai làm việc với dữ liệu web, kiểm thử ứng dụng hoặc cần duy trì ẩn danh trực tuyến. Bằng cách áp dụng các hướng dẫn và mẹo trong bài viết này, bạn có thể tối ưu hóa các tác vụ của mình, vượt qua các rào cản kỹ thuật và đạt được hiệu quả cao hơn.

Đừng để việc bị chặn IP hay giới hạn địa lý cản trở công việc của bạn. Hãy truy cập Netproxy.io ngay hôm nay để tìm kiếm giải pháp proxy phù hợp nhất và bắt đầu hành trình khai thác sức mạnh tiềm ẩn của proxy cùng Python!

---