Cách cấu hình và xoay vòng bể proxy trong Python Scrapy
Cập nhật:
Scrapy là framework thu thập dữ liệu bất đồng bộ tốc độ cao nhất trong Python (dựa trên kiến trúc Twisted). Nhờ HttpProxyMiddleware được tích hợp sẵn, bạn chỉ cần gán chuỗi http://user:pass@ip:port của VinaProxy vào khóa request.meta['proxy'] hoặc viết một Downloader Middleware 10 dòng code để tự động xoay vòng qua hàng chục địa chỉ IP tĩnh.
request.meta['proxy'] = 'http://user:pass@ip:port'- 1 IP40.000 ₫
- 5+ IP35.000 ₫
- 10+ IP25.000 ₫
- 20+ IP25.000 ₫
- 50+ IP25.000 ₫
- 100+ IP25.000 ₫
- 200+ IP25.000 ₫
- 500+ IP25.000 ₫
- 1000+ IP22.000 ₫
- 2000+ IP20.000 ₫
- 1 IP40.000 ₫
- 5+ IP35.000 ₫
- 10+ IP25.000 ₫
- 20+ IP25.000 ₫
- 50+ IP25.000 ₫
- 100+ IP25.000 ₫
- 200+ IP25.000 ₫
- 500+ IP25.000 ₫
- 1000+ IP22.000 ₫
- 2000+ IP20.000 ₫
Cơ chế hoạt động của HttpProxyMiddleware và thiết lập settings.py
Mặc định HttpProxyMiddleware (thứ tự 750 trong DOWNLOADER_MIDDLEWARES_BASE) tự động tách phần user:pass từ URL http://user:pass@ip:port, mã hóa Base64 và đính kèm vào header Proxy-Authorization cho mỗi request đi ra.
| Thiết lập trong Scrapy | Giá trị khuyến nghị | Tác dụng kỹ thuật |
|---|---|---|
request.meta['proxy'] | 'http://user:pass@ip:port' | Chỉ định máy chủ proxy cho từng Request cụ thể |
CONCURRENT_REQUESTS_PER_IP | 2 hoặc 4 | Giới hạn số kết nối đồng thời trên mỗi IP để tránh lỗi HTTP 429 |
DOWNLOAD_DELAY | 1.0 (kèm RANDOMIZE_DOWNLOAD_DELAY = True) | Giãn nhịp truy vấn tự nhiên trên từng địa chỉ IP |
AUTOTHROTTLE_ENABLED | True | Tự động giảm tốc độ nếu máy chủ đích phản hồi chậm |
Viết Downloader Middleware xoay vòng danh sách proxy trong middlewares.py
- Định nghĩa lớp
ProxyPoolMiddlewarecó hàmprocess_request(self, request, spider)gánrequest.meta['proxy'] = random.choice(self.proxies) - Đặt thứ tự của
ProxyPoolMiddlewarelà740trongDOWNLOADER_MIDDLEWARES(trướcHttpProxyMiddlewareở vị trí750) để Scrapy tự xử lý phần mã hóa xác thực - Kết hợp với
RetryMiddlewaređể khi một request gặp mã429hoặc503, Scrapy tự động thử lại bằng một địa chỉ IP khác trong bể
Các bước thực hiện
- 1
Xuất danh sách proxy sang định dạng http://user:pass@ip:port
Sử dụng công cụ đổi định dạng proxy để chuyển danh sách VinaProxy sang mảng URL.
- 2
Thêm lớp ProxyPoolMiddleware vào file middlewares.py
Trong hàm
process_request(self, request, spider), gánrequest.meta['proxy'] = random.choice(PROXIES). - 3
Kích hoạt trong settings.py ở vị trí 740
Khai báo
'myproject.middlewares.ProxyPoolMiddleware': 740trongDOWNLOADER_MIDDLEWARESvà bậtCONCURRENT_REQUESTS_PER_IP = 2. - 4
Chạy thử nghiệm bằng lệnh scrapy crawl
Kiểm tra log đầu ra để xác nhận các request được phân bổ đều và không gặp lỗi 407.
Câu hỏi thường gặp
Tại sao đặt Middleware ở số 800 trong DOWNLOADER_MIDDLEWARES lại bị lỗi xác thực?
HttpProxyMiddleware mặc định của Scrapy nằm ở số 750 và chịu trách nhiệm tách user:pass ra khỏi URL để tạo header Proxy-Authorization. Do đó Middleware gán request.meta['proxy'] của bạn bắt buộc phải có số thứ tự nhỏ hơn 750 (ví dụ 740 hoặc 350).
Scrapy có tái sử dụng kết nối tới từng proxy trong bể không?
Có. Động cơ Twisted trong Scrapy duy trì bể kết nối (connection pool) riêng cho từng địa chỉ proxy, giúp các request tiếp theo đi qua cùng IP đó không mất thời gian bắt tay lại.
Quét hàng triệu sản phẩm bằng Scrapy có bị tính thêm phí băng thông tại VinaProxy không?
Không. Tất cả proxy IPv4 riêng và Static ISP của VinaProxy đều không giới hạn dung lượng băng thông.
Xây dựng cụm Crawler Scrapy tốc độ cao không giới hạn băng thông
Mua sỉ proxy IPv4 riêng & Static ISP tại 7 quốc gia, tích hợp vào Scrapy trong 2 phút.
Mua Proxy cho Scrapy