Scrapy proxy setup, gumamit ng meta proxy para sa ibang IP bawat request
Ang gabay na ito ay nagpapaliwanag kung paano ikonekta ang HTTP proxy ng Socks5Proxy sa meta proxy ng Scrapy, downloader middleware para i-rotate ang listahan mula sa API bawat request, at speed setting na angkop sa target site.
Paano hinahandle ng Scrapy ang proxy?
Ang Scrapy ay may HttpProxyMiddleware na naka-enable bilang default. Kung ilalagay mo ang proxy address sa meta dictionary ng request, ang request ay ipapadala sa proxy na iyon, at ang username at password sa address ay iko-convert ng middleware sa Proxy-Authorization header. Ang HTTPS address ay dadaan sa CONNECT tunnel.
Ang default download handler ng Scrapy ay sinusuportahan ang HTTP proxy. Kung kailangan talaga ng SOCKS5, kailangan ng separate handler, kaya inirerekomenda ang paggamit ng HTTP port ng parehong IP sa Scrapy. Ang IP na makikita sa target site ay pareho.
Ginagamit ang IP 198.51.100.23, HTTP port 8000, username spx_user, password spx_pass.
pip install scrapy
scrapy startproject shop
cd shopPaano maglagay ng proxy sa isang request?
Kapag gumawa ng Request sa start_requests, ilagay ang proxy sa meta. Gawin din ang parehong paraan kapag humiling ng susunod na page sa callback. Kung kailangang ipagpatuloy ang parehong session, ipasa ang proxy value mula sa meta ng nakaraang response para manatili ang parehong IP.
import scrapy
PROXY = "http://spx_user:spx_pass@198.51.100.23:8000"
class IpCheckSpider(scrapy.Spider):
name = "ip_check"
def start_requests(self):
yield scrapy.Request("https://api.ipify.org?format=json", meta={"proxy": PROXY})
def parse(self, response):
self.logger.info("seen as %s", response.json()["ip"])Paano i-rotate ang IP bawat request?
Gumawa ng isang downloader middleware na maglalagay ng susunod na proxy sa bawat request para maikot nang hindi binabago ang spider code. Ang middleware sa ibaba ay kumukuha ng listahan mula sa API sa simula, at kung mayroon nang proxy sa meta, iiwan ito para magamit ang parehong session fixation at rotation.
Ilagay ang API key sa settings.py o basahin mula sa environment variable. Dapat mas mababa ang numero kaysa sa default HttpProxyMiddleware(750) para ma-process ng default middleware ang address na inilagay ng middleware.
import itertools
import requests
class RotatingProxyMiddleware:
def __init__(self, key):
text = requests.get(
"https://socks5proxy.io/api/v1/proxies/download",
params={"format": "user:pass@ip:port", "protocol": "http"},
headers={"Authorization": "Bearer " + key},
timeout=30,
).text
self.pool = itertools.cycle(["http://" + l.strip() for l in text.splitlines() if l.strip()])
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.settings.get("SPX_API_KEY"))
def process_request(self, request, spider):
if "proxy" not in request.meta: # keep a proxy that was set on purpose (sticky sessions)
request.meta["proxy"] = next(self.pool)SPX_API_KEY = "YOUR_API_KEY"
DOWNLOADER_MIDDLEWARES = {
"shop.middlewares.RotatingProxyMiddleware": 740,
}
CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 16
DOWNLOAD_DELAY = 0.25
AUTOTHROTTLE_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504, 522, 524, 408]
DOWNLOAD_TIMEOUT = 30Paano i-adjust ang bilis at pag-retry?
Ang CONCURRENT_REQUESTS_PER_DOMAIN ay ang bilang ng concurrent requests na pwedeng ipadala sa parehong domain. Habang dumadami ang proxy IP, pwedeng taasan ang value na ito nang hindi nag-i-increase ang load sa bawat IP. Halimbawa, kung may 500 IP at 50 concurrent requests, ang bawat IP ay gagamitin lang sa average na 1 sa bawat 10 requests.
Kapag naka-enable ang AUTOTHROTTLE, aayusin nito ang request interval base sa response speed. Kung dumami ang 429 responses, pwede mong subukan ulit gamit ang RETRY_HTTP_CODES, pero pwede mo ring tanggalin ang proxy sa meta para gamitin ng middleware ang susunod na proxy sa retry.
Para sa mas magandang kalidad ng datos, tiyaking ang nakolektang resulta ay aktwal na page at hindi confirmation screen. Kung walang desired elements sa response, pwede mong i-retry gamit ang ibang IP.
- I-adjust ang bilang ng sabay-sabay na request bawat domain ayon sa bilang ng IP
- AUTOTHROTTLE para sa automatic interval adjustment base sa response speed
- 429 at 5xx ay subukan sa ibang IP
- Pag-filter ng verification screen gamit ang response content check
Ano ang nagbabago kapag kumokonekta gamit ang IP authorization?
Kapag nairehistro mo ang IPv4 ng server na nagpapatakbo ng Scrapy sa dashboard, maaari mong gamitin ang meta proxy nang walang username at password tulad ng http://198.51.100.23:8000. Maaari ring makuha ang listahan sa format=ip:port. Kung nagpapatakbo ka ng spider sa maraming server, irehistro ang IP ng bawat server. Hanggang 10 IP ang maaaring irehistro.
Paano i-bind ang mga request na nangangailangan ng session sa iisang IP?
Para sa mga flow na tuloy-tuloy ang cookies tulad ng pag-log in o shopping cart, kailangan mong gamitin ang parehong IP. Ilagay ang meta proxy mismo sa unang request, at sa callback, ipasa ang proxy value mula sa response.meta sa susunod na request para hindi ito palitan ng rotating middleware. Gamitin din ang cookiejar meta key ng Scrapy para hiwalay ang cookies bawat session.
Kung ipapares mo ang isang proxy at isang cookie bundle sa bawat session, kahit sabay-sabay ang maraming session ay hindi ito maghahalo.
import scrapy
PROXIES = [
"http://spx_user:spx_pass@198.51.100.23:8000",
"http://spx_user:spx_pass@198.51.100.24:8000",
]
class SessionSpider(scrapy.Spider):
name = "sessions"
def start_requests(self):
for i, proxy in enumerate(PROXIES):
yield scrapy.Request("https://example.com/", meta={"proxy": proxy, "cookiejar": i}, dont_filter=True)
def parse(self, response):
# follow-up request keeps the same proxy and the same cookie jar
yield response.follow("/account", meta={"proxy": response.meta["proxy"], "cookiejar": response.meta["cookiejar"]}, callback=self.parse_account)
def parse_account(self, response):
self.logger.info("status %s via %s", response.status, response.meta["proxy"])Paano tanggalin pansamantala ang failed proxy?
Kung makakakuha ng 403 o 429 na response sa process_response ng middleware, maaari mong ipahinga ang proxy na iyon ng ilang minuto at ipadala ulit ang parehong request gamit ang ibang proxy. Kopyahin ang request, tanggalin ang proxy sa meta, i-on ang dont_filter, at ibalik ito para pumasok ang susunod na proxy.
Simple lang ang pamamahala ng proxy list at reuse time gamit ang dictionary. Iwasan ang agad na pag-reuse ng parehong IP para bigyan ng oras ang target site na mag-lift ng restrictions.
Ano ang dapat i-set up sa Scrapy para makatipid ng bandwidth?
Ang Scrapy ay default na tumatanggap lang ng HTML, kaya mas mababa ang bandwidth consumption kumpara sa browser tools. Kasama pa rito ang HttpCompressionMiddleware na naka-enable bilang default para mas mabawasan ang transmission volume. Ito ang dahilan kung bakit maaaring mag-collect ng maraming page sa loob ng monthly bandwidth ng shared plan.
Upang hindi makatanggap ng parehong pahina nang paulit-ulit, i-on ang HTTPCACHE_ENABLED habang nagde-develop upang hindi na muling tawagin ang target site at proxy sa bawat pagsubok. Sa operasyon, panatilihin ang deduplication (default na naka-on), at gamitin lamang ang dont_filter para sa mga request na talagang kailangang makuha muli.
Limitahan ang link-following range para hindi kumalat sa unnecessary subpages. Malinaw na scope = mas mabilis at mas magaan para sa lahat.
Paano malulutas ang mga common issues?
Kapag may 407 response, tignan ang username at password sa address. Kung may special characters ang password, kailangan itong i-percent encode. TunnelError ay nangyayari kapag hindi natanggap ng proxy ang CONNECT request - tignan kung HTTP port ang ginamit.
Kung lahat ng request ay galing sa iisang IP, maaaring nasa likod ng HttpProxyMiddleware ang middleware sequence number, o direktang nilagay ng spider ang meta proxy. Tingnan ang sequence sa settings.py at spider code.