Quay lại danh sách
Cấu hình proxy SOCKS5 cho Scraping với cURL và Python requests

Cấu hình proxy SOCKS5 cho Scraping với cURL và Python requests

4 tháng 9, 2026

Tại sao SOCKS5 là lựa chọn mạnh mẽ cho scraping chuyên sâu

Khi nhắc đến proxy, nhiều người chỉ nghĩ đến HTTP/HTTPS. Nhưng với các tác vụ scraping cần kiểm soát sâu hơn lớp transport, proxy SOCKS5 lại vượt trội vì hoạt động ở tầng 4 (TCP/UDP), không can thiệp header HTTP, đồng thời hỗ trợ xác thực username/password và chuyển tiếp DNS an toàn. Điều đó có nghĩa là bạn tránh được các lỗi "proxy detected" do header bị chỉnh sửa, đồng thời giảm rủi ro rò rỉ DNS khi scraping các miền nhạy cảm.

Trong bài này, chúng ta sẽ đi sâu vào cách cấu hình SOCKS5 với hai công cụ quen thuộc: cURL cho test nhanh và requests cho tích hợp Python. Bạn sẽ hiểu vì sao cần dùng socks5h thay vì socks5, cách xử lý xác thực, và cách tích hợp vào pipeline thực tế.

Chuẩn bị thông tin proxy từ RoProxy

Trước khi code, bạn cần endpoint SOCKS5 do RoProxy cung cấp. Thông tin điển hình:

  • Host: socks.roproxy.vn
  • Port: 1080
  • Username và password: lấy trong dashboard
  • Có thể chọn quốc gia qua user theo format user-country-US

Bạn nên lưu các giá trị này vào biến môi trường để không hard-code trong source code, tránh lộ thông tin khi push lên Git.

export RO_PROXY_HOST=socks.roproxy.vn
export RO_PROXY_PORT=1080
export RO_PROXY_USER=your_username
export RO_PROXY_PASS=your_password

Khác biệt giữa socks5socks5h

Hai scheme này nghe giống nhau nhưng khác nhau ở chỗ DNS được resolve ở đâu:

  • socks5: DNS được resolve phía client, sau đó mới gửi địa chỉ IP lên proxy. Điều này có thể làm lộ miền bạn truy cập nếu hệ thống bị giám sát.
  • socks5h: DNS được resolve phía proxy. Đây là lựa chọn đúng đắn cho scraping vì toàn bộ tên miền chỉ tồn tại trong tunnel.

Mẹo nhỏ: luôn dùng socks5h trừ khi proxy của bạn không hỗ trợ resolve DNS (rất hiếm).

Dùng cURL để kiểm tra nhanh SOCKS5

cURL hỗ trợ SOCKS5 nguyên bản, không cần plugin thêm. Đây là cách nhanh nhất để xác minh proxy hoạt động.

curl -v --socks5-hostname ${RO_PROXY_HOST}:${RO_PROXY_PORT} \
     --proxy-user ${RO_PROXY_USER}:${RO_PROXY_PASS} \
     https://ifconfig.me

Lệnh trên sẽ in ra IP public mà proxy nhìn thấy. Nếu IP này khác IP máy bạn và khớp với quốc gia bạn chọn, mọi thứ đều ổn.

Để kiểm tra thêm DNS leak:

curl --socks5-hostname ${RO_PROXY_HOST}:${RO_PROXY_PORT} \
     --proxy-user ${RO_PROXY_USER}:${RO_PROXY_PASS} \
     https://dnsleaktest.com

Với socks5h, DNS query sẽ đi qua proxy nên trang kiểm tra sẽ chỉ thấy DNS server của RoProxy, không phải DNS của nhà mạng bạn.

Bắt lỗi thường gặp với cURL

  • Unknown proxy options: kiểm tra phiên bản cURL (curl --version) phải >= 7.21.7 với hỗ trợ SOCKS5.
  • Authentication required: sai user/pass hoặc chưa bật xác thực trong dashboard.
  • Timeout ngắn: thêm --connect-timeout 15 --max-time 45 để tránh false negative.

Tích hợp SOCKS5 vào Python requests

Thư viện requests không hỗ trợ SOCKS trực tiếp, bạn cần cài thêm requests[socks] hoặc PySocks.

pip install "requests[socks]"

Sau đó, cấu hình đơn giản:

import os
import requests

proxies = {
    "http": f"socks5h://{os.environ['RO_PROXY_USER']}:{os.environ['RO_PROXY_PASS']}@{os.environ['RO_PROXY_HOST']}:{os.environ['RO_PROXY_PORT']}",
    "https": f"socks5h://{os.environ['RO_PROXY_USER']}:{os.environ['RO_PROXY_PASS']}@{os.environ['RO_PROXY_HOST']}:{os.environ['RO_PROXY_PORT']}",
}

resp = requests.get("https://ifconfig.me", proxies=proxies, timeout=30)
print(resp.text)

Vì sao nên dùng session tái sử dụng

Mỗi lần gọi requests.get tạo kết nối mới. Với scraping quy mô lớn, điều này tốn thời gian. Hãy dùng Session để tận dụng keep-alive và giảm overhead bắt tay TCP/TLS.

session = requests.Session()
session.proxies.update(proxies)

for url in url_list:
    try:
        r = session.get(url, timeout=20)
        process(r)
    except requests.exceptions.RequestException as e:
        log_error(e)

Sticky session cho các flow nhiều bước

Một số website yêu cầu cùng một IP xuyên suốt một phiên đăng nhập. RoProxy hỗ trợ sticky session qua session ID:

sticky_user = f"{os.environ['RO_PROXY_USER']}-sessionid-abc123"
sticky_pass = os.environ['RO_PROXY_PASS']

sticky_proxies = {
    "http": f"socks5h://{sticky_user}:{sticky_pass}@{os.environ['RO_PROXY_HOST']}:{os.environ['RO_PROXY_PORT']}",
    "https": f"socks5h://{sticky_user}:{sticky_pass}@{os.environ['RO_PROXY_HOST']}:{os.environ['RO_PROXY_PORT']}",
}

Miễn là bạn giữ session ID cố định, RoProxy sẽ ghim bạn với cùng một IP trong thời gian TTL (thường 10 phút).

Xử lý vấn đề DNS và certificate

DNS leak

Đã nói ở trên: dùng socks5h thay vì socks5 để DNS đi qua proxy.

TLS fingerprinting

SOCKS5 không can thiệp TLS, nên requests mặc định sẽ dùng thư viện TLS của hệ thống (OpenSSL). Nếu website phát hiện bot qua JA3/JA4 fingerprint, bạn có thể chuyển sang curl_cffi với impersonate="chrome" để giả lập TLS fingerprint trình duyệt.

from curl_cffi import requests as cf_requests

resp = cf_requests.get("https://example.com", proxies=proxies, impersonate="chrome120")

Thư viện này dùng libcurl nên hỗ trợ SOCKS5 ngay từ đầu.

Tích hợp vào pipeline thực tế

Một pipeline scraping production nên có:

  1. Retry thông minh: gặp 429 hoặc 5xx, đợi exponential backoff rồi thử lại.
  2. Health check proxy định kỳ: trước mỗi batch, ping một endpoint nhẹ để chắc proxy còn sống.
  3. Rotation hợp lý: scraping danh sách sản phẩm có thể xoay mỗi request, scraping account thì giữ sticky.
  4. Logging có cấu trúc: ghi IP đã dùng, thời gian phản hồi, status code để phân tích sau.

Ví dụ health check

def check_proxy():
    try:
        r = requests.get("https://ifconfig.me", proxies=proxies, timeout=10)
        return r.status_code == 200
    except Exception:
        return False

Ví dụ retry với backoff

import time
import random

def fetch(url, retries=3):
    for i in range(retries):
        try:
            r = session.get(url, timeout=20)
            if r.status_code == 200:
                return r
            if r.status_code in (429, 503):
                time.sleep(2 ** i + random.random())
        except requests.exceptions.RequestException:
            time.sleep(2 ** i)
    return None

So sánh nhanh SOCKS5 với HTTP proxy trong scraping

Tiêu chí SOCKS5 HTTP/HTTPS proxy
Tầng hoạt động Tầng 4 (TCP) Tầng 7 (HTTP)
DNS leak Tránh được với socks5h Có thể xảy ra
Hiệu năng Cao, không parse header Thấp hơn do overhead
TLS fingerprint Không can thiệp Có thể bị chỉnh sửa
Hỗ trợ UDP Có (SOCKS5) Không

Với scraping HTTP thông thường, cả hai đều dùng được, nhưng SOCKS5 cho bạn sự "trong suốt" hơn và ít bị phát hiện hơn vì proxy không thêm header Via hay X-Forwarded-For.

Lời kết

SOCKS5 là công cụ đáng để đầu tư nếu bạn scraping quy mô lớn, đặc biệt với các hệ thống chống bot tinh vi. Bắt đầu bằng cURL để kiểm tra, sau đó tích hợp vào requests hoặc curl_cffi trong pipeline Python. Đừng quên: dùng socks5h, lưu secret vào biến môi trường, và giám sát health check định kỳ để hệ thống luôn ổn định.