Trong crawler Python3, sử dụng proxy là một phương pháp phổ biến để ngăn IP bị chặn hoặc tăng tốc độ thu thập dữ liệu, chủ yếu dùng để mô phỏng truy cập từ nhiều địa chỉ IP. Proxy có thể được chia thành hai loại: proxy miễn phí và proxy trả phí, trong đó proxy miễn phí không ổn định, còn proxy trả phí tương đối ổn định và đáng tin cậy hơn.

Dưới đây là các tình huống sử dụng và ứng dụng của proxy cho crawler Python3:

Ngăn IP bị chặn: Một số website đặt giới hạn tần suất truy cập theo IP. Nếu số lần truy cập vượt quá giới hạn, IP đó sẽ bị cấm truy cập website. Sử dụng proxy có thể tránh được tình huống này.

Tăng tốc độ thu thập: sử dụng proxy có thể đồng thời thiết lập nhiều kết nối, từ đó đạt mục đích thu thập dữ liệu mục tiêu nhanh chóng.

Vượt qua giới hạn khu vực: Một số website cung cấp dịch vụ khác nhau ở từng khu vực. Nếu bạn cần truy cập các website chỉ mở cho một số khu vực nhất định, sử dụng proxy có thể vượt qua hạn chế này để bạn lấy được dữ liệu cần thiết.

Tóm lại, proxy IP đóng vai trò rất quan trọng trong crawler Python3. Vì việc sử dụng proxy cũng có thể kéo theo một số vấn đề bảo mật, nên khi sử dụng proxy cần chú ý chọn nhà cung cấp dịch vụ proxy phù hợp và tuân thủ nghiêm ngặt các quy định về an ninh mạng.

Công việc chuẩn bị

Trước tiên, chúng ta cần lấy một proxy khả dụng. Proxy là tổ hợp của địa chỉ IP và cổng, tức là ip:cổng Định dạng như vậy. Nếu proxy yêu cầu xác thực truy cập, thì còn cần thêm hai thông tin là tên người dùng và mật khẩu.

Ở đây máy của tôi đã cài một phần mềm proxy, phần mềm này sẽ tạo dịch vụ proxy HTTP trên cổng 7890 của máy cục bộ, tức proxy là 127.0.0.1:7890. Ngoài ra, phần mềm này cũng sẽ tạo dịch vụ proxy SOCKS trên cổng 7891, tức proxy là 127.0.0.1:7891, vì vậy chỉ cần cấu hình proxy này là có thể chuyển IP của máy hiện tại sang IP của máy chủ mà phần mềm proxy đang kết nối.

Trong các ví dụ ở phần sau của chương này, tôi sử dụng proxy nêu trên để minh họa cách thiết lập, bạn cũng có thể tự thay bằng proxy khả dụng của mình.

Sau khi thiết lập proxy, URL dùng để kiểm tra là http://httpbin.org/get Khi truy cập liên kết này, chúng ta có thể nhận được thông tin liên quan đến yêu cầu. Trong đó, trường origin trong kết quả trả về chính là IP của client. Chúng ta có thể dựa vào đó để xác định proxy đã được cấu hình thành công hay chưa, tức là có giả mạo IP thành công hay không.

Được, tiếp theo chúng ta hãy xem cách thiết lập proxy cho từng thư viện request.

Nhận proxy crawler Python3

Một số website sẽ phát hiện việc truy cập dữ liệu của họ quá thường xuyên và áp dụng biện pháp để chặn các lượt truy cập đó. Sử dụng máy chủ proxy có thể phân tán nguồn truy cập, giảm khả năng bị phát hiện, từ đó tăng tỷ lệ crawl thành công.

Proxy tĩnh tốt nhất tại Mỹ

IPRoyal là nhà cung cấp dịch vụ proxy cực kỳ thân thiện với khu vực Trung Quốc, các giải pháp proxy residential của họ rất hấp dẫn

Xem IPRoyal
Proxy tĩnh rẻ nhất

Proxy-seller là một nhà cung cấp proxy datacenter, được nhiều nhà tiếp thị Internet quy mô nhỏ ưa chuộng.

Xem Proxy-seller
Proxy tĩnh giá phải chăng nhất

Shifter.io là một nhà cung cấp dịch vụ proxy nổi tiếng, nhằm mang đến cho người dùng khả năng bảo vệ quyền riêng tư và trải nghiệm Internet tốt hơn.

Xem Shifter.io

2. urllib

Trước tiên, chúng ta lấy urllib cơ bản nhất làm ví dụ để xem cách thiết lập proxy, mã như sau:

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = '127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 opener = build_opener(proxy_handler)
 try:
    response = opener.open('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Kết quả chạy như sau:

 {
  "args": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Host": "httpbin.org",
    "User-Agent": "Python-urllib/3.7",
    "X-Amzn-Trace-Id": "Root=1-60e9a1b6-0a20b8a678844a0b2ab4e889"
  },
  "origin": "210.173.1.204",
  "url": "https://httpbin.org/get"
 }
 

Ở đây chúng ta cần dùng ProxyHandler để thiết lập proxy, Thông số là kiểu từ điển, trong đó khóa là loại giao thức và giá trị là proxy. Lưu ý, phía trước proxy ở đây cần thêm giao thức, tức là http:// hoặc https://,khi liên kết được yêu cầu là giao thức HTTP, proxy tương ứng với khóa http sẽ được sử dụng; khi liên kết được yêu cầu là giao thức HTTPS, proxy tương ứng với khóa https sẽ được sử dụng. Tuy nhiên, ở đây chúng ta đặt bản thân proxy là giao thức HTTP, tức tiền tố được thống nhất đặt là http://vì vậy dù truy cập liên kết dùng giao thức HTTP hay HTTPS, yêu cầu đều sẽ được gửi qua proxy giao thức HTTP mà chúng ta đã cấu hình.

Sau khi tạo xong đối tượng ProxyHandler, chúng ta cần dùng phương thức build_opener để truyền đối tượng này vào và tạo một Opener, như vậy có nghĩa là Opener này đã được cấu hình proxy. Tiếp theo, chỉ cần gọi trực tiếp phương thức open của đối tượng Opener là có thể truy cập liên kết mong muốn.

Kết quả đầu ra khi chạy là một JSON, trong đó có một trường origin dùng để chỉ ra IP của phía client. Hãy kiểm tra để xác nhận rằng IP tại đây đúng là IP của proxy chứ không phải IP thật. Như vậy chúng ta đã thiết lập proxy thành công và có thể ẩn IP thật.

Nếu gặp proxy cần xác thực, chúng ta có thể thiết lập theo cách sau:

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = 'username:password@127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 opener = build_opener(proxy_handler)
 try:
    response = opener.open('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Phần thay đổi ở đây chỉ là biến proxy, chỉ cần thêm tên người dùng và mật khẩu xác thực proxy ở phía trước proxy. Trong đó username là tên người dùng, password là mật khẩu. Ví dụ, username là foo, mật khẩu là bar, thì proxy sẽ là foo:bar@127.0.0.1:7890

Nếu proxy là loại SOCKS5, thì có thể cấu hình proxy như sau:

 import socks
 import socket
 from urllib import request
 from urllib.error import URLError

 socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 7891)
 socket.socket = socks.socksocket
 try:
    response = request.urlopen('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Ở đây cần một mô-đun socks, có thể cài đặt bằng lệnh sau:

 pip3 install PySocks