Phiên bản đơn giản#
Phân loại câu trả lời trước khi thử lại. Một chương trình 403 có thể ngụ ý một quy tắc truy cập khác sẽ không giải quyết. Đối với 429, tôn trọng rery- Sau và giảm tốc độ yêu cầu; sử dụng bị hạn chế để kết nối tạm thời hay máy phục vụ thất bại. Hãy thử lại chỉ khi bạn có khả năng ngăn chặn hành động lặp lại.
import scrapy
PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"
class PricesSpider(scrapy.Spider):
name = "prices"
start_urls = ["https://example.com/catalog"]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, meta={"proxy": PROXY})
def parse(self, response):
for href in response.css("a.product::attr(href)").getall():
yield response.follow(href, callback=self.parse_product, meta={"proxy": PROXY})
def parse_product(self, response):
yield {"url": response.url, "price": response.css(".price::text").get()}Một phần mềm giữa cho các phiên chạy dính trên mỗi mục#
import hashlib
class Proxy CyberMiddleware:
GATEWAY = "res.proxy-cyber.com:9000"
def __init__(self, user, password, country):
self.user, self.password, self.country = user, password, country
@classmethod
def from_crawler(cls, crawler):
s = crawler.settings
return cls(s.get("KEY_PROXY_USER"), s.get("KEY_PROXY_PASS"), s.get("KEY_PROXY_COUNTRY", "us"))
def process_request(self, request, spider):
# Sticky when the request carries a session key (e.g. one per product flow), rotating otherwise
key = request.meta.get("session_key")
user = f"{self.user}-cc-{self.country}"
if key:
sid = hashlib.sha1(key.encode()).hexdigest()[:12]
user += f"-sid-{sid}-ttl-10m"
request.meta["proxy"] = f"http://{user}:{self.password}@{self.GATEWAY}"DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.Proxy CyberMiddleware": 350, # before HttpProxyMiddleware (750)
}
KEY_PROXY_USER = "USER"
KEY_PROXY_PASS = "PASS"
KEY_PROXY_COUNTRY = "de"
CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 8
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0
DOWNLOAD_TIMEOUT = 45
RETRY_ENABLED = True
RETRY_TIMES = 2
RETRY_HTTP_CODES = [408, 429, 500, 502, 503, 504, 522, 524]
COMPRESSION_ENABLED = TrueDùng lại thông tin kết nối và địa chỉ IP là điều khiển khác nhau. Một phiên chạy khách sử dụng lại ổ cắm; chỉ cửa đã gán quyết định độ xoay và cách gọi dính. Dùng tham số phiên chạy được cung cấp bằng dịch vụ của bạn, và kiểm tra lối thoát qua vài yêu cầu. Đóng ổ cắm hoặc gửi: đóng kết nối không bảo đảm một IP khác.
Giữ cho dự luật bị giảm#
- Sổ tay không tải ảnh hay tập lệnh; chỉ HTML và JSON, vì vậy một trang có giá trị kích cỡ HTML của nó.
- Bật nén (mặc định) và tránh
Splashhoặc vẽ trình duyệt trừ khi dữ liệu cần thiết. - Có bộ nhớ tạm
HTTPCACHE_ENABLED = TrueTrong quá trình phát triển, bạn không trả tiền để xem lại cùng một trang trong khi gỡ lỗi các bộ chọn.
Cư xử lịch sự#
Hồ bơi là một cách để khách lịch sự, chứ không phải một người thiếu lịch sự. CONCURRENT_REQUESTS_PER_DOMAIN và Auto Throttle giữ mỗi mục tiêu tại một tỷ lệ có thể thay thế con người mỗi lối thoát; Chính sách sử dụng được chấp nhận cấm bất cứ thứ gì trông giống như một cuộc tấn công.
Người ta thắc mắc#
Tôi có cần thuốc kích thích không?
Không phải với cổng ra: xoay xảy ra ở mặt proxy phím cho mỗi kết nối mới. Gói đó quản lý danh sách các proxy tĩnh; với res.key-poxy.com có một proxy cần cấu hình.
Làm sao tôi có thể sử dụng một đất nước khác cho mỗi yêu cầu?
Đặt yêu cầu.meta["nước"] trong nhện và đọc nó trong phần mềm giữa để xây dựng tham số -c-c tham số; ví dụ sử dụng một thiết lập đơn cho ngắn gọn.