Proxy's instellen en roteren in Python Scrapy
Updated:
De asynchrone Twisted-engine van Scrapy bevat een ingebouwde HttpProxyMiddleware (met prioriteit 750) die http://user:pass@ip:port-tekenreeksen verwerkt die zijn toegewezen aan request.meta['proxy']. Door een aangepaste Downloader Middleware van 10 regels met prioriteit 740 te schrijven, kunnen je spiders automatisch roteren over een pool van ongelimiteerde statische IP's van VinaProxy.
request.meta['proxy'] = 'http://user:pass@ip:port'- 1 IP₫ 40.000
- 5+ IP's₫ 35.000
- 10+ IP's₫ 25.000
- 20+ IP's₫ 25.000
- 50+ IP's₫ 25.000
- 100+ IP's₫ 25.000
- 200+ IP's₫ 25.000
- 500+ IP's₫ 25.000
- 1000+ IP's₫ 22.000
- 2000+ IP's₫ 20.000
- 1 IP₫ 40.000
- 5+ IP's₫ 35.000
- 10+ IP's₫ 25.000
- 20+ IP's₫ 25.000
- 50+ IP's₫ 25.000
- 100+ IP's₫ 25.000
- 200+ IP's₫ 25.000
- 500+ IP's₫ 25.000
- 1000+ IP's₫ 22.000
- 2000+ IP's₫ 20.000
Volgorde van Scrapy-proxymiddleware en concurrency-instellingen
Omdat HttpProxyMiddleware met volgorde 750 wordt uitgevoerd om user:pass uit de proxy-URL te strippen en de Proxy-Authorization-header te coderen, moet elke aangepaste middleware die request.meta['proxy'] instelt met een lager nummer worden uitgevoerd (bijv. 740):
| Scrapy-instelling | Aanbevolen waarde | Doel |
|---|---|---|
request.meta['proxy'] | 'http://user:pass@ip:port' | Leidt het verzoek via de opgegeven proxy van VinaProxy |
| Middleware-prioriteit | 740 (vóór 750) | Zorgt ervoor dat HttpProxyMiddleware de user:pass-header codeert |
CONCURRENT_REQUESTS_PER_IP | 2 tot 4 | Limiteert gelijktijdige sockets per proxy-IP om HTTP 429 te voorkomen |
AUTOTHROTTLE_ENABLED | True | Past de crawl-vertraging dynamisch aan op basis van de doellatentie |
Best practices voor grootschalige Scrapy-crawls
- Laad je proxy-lijst van VinaProxy in
from_crawler()en wijsrequest.meta['proxy'] = random.choice(self.proxies)toe binnenprocess_request() - Schakel
RANDOMIZE_DOWNLOAD_DELAY = Truein naastDOWNLOAD_DELAY = 1.0, zodat de verzoekintervallen per IP nooit robotachtig lijken - Kies bij een retry (
429of503) een andere proxy uit je pool voordat je het verzoek opnieuw in de wachtrij plaatst
Stappenplan
- 1
Formatteer je proxypool als http://user:pass@ip:port
Plak je lijst van VinaProxy in onze Proxy Format Converter om URL-tekenreeksen te verkrijgen.
- 2
Maak een ProxyPoolMiddleware aan in middlewares.py
Definieer
process_request(self, request, spider)omrequest.meta['proxy'] = random.choice(self.proxies)in te stellen. - 3
Registreer met prioriteit 740 in settings.py
Voeg
'myproject.middlewares.ProxyPoolMiddleware': 740toe onderDOWNLOADER_MIDDLEWARESen stelCONCURRENT_REQUESTS_PER_IP = 2in. - 4
Test met scrapy shell of scrapy crawl
Voer een testverzoek uit naar
https://vinaproxy.com/api/my-ipom de rotatie en authenticatie te verifiëren.
Veelgestelde vragen
Waarom faalde mijn aangepaste Scrapy-proxymiddleware bij prioriteit 800?
De ingebouwde HttpProxyMiddleware van Scrapy draait met prioriteit 750. Als je middleware op 800 draait (na 750), worden de inline user:pass-inloggegevens nooit geconverteerd naar een Proxy-Authorization-header. Stel de prioriteit van je middleware altijd lager in dan 750 (zoals 740).
Houdt Scrapy persistente verbindingen open naar elke proxy?
Ja. De connectiepool van Twisted onderhoudt persistente keep-alive-verbindingen per proxy-eindpunt.
Zijn proxy's van VinaProxy ongelimiteerd voor Scrapy-taken van miljoenen pagina's?
Ja. Alle Dedicated IPv4- en Static ISP-abonnementen bevatten onbeperkte maandelijkse bandbreedte.
Schaal je Scrapy-spiders met ongelimiteerde statische IP-pools
Direct Dedicated IPv4- en Static ISP-proxy's in bulk in 7 landen.
Koop Scrapy-proxy's