คำตอบด่วน
การทำงานของ sticky sessions และการหมุน IP บนพร็อกซีเรซิเดนเชียลเป็นอย่างไร?
บน CrawlRelay ชื่อผู้ใช้ที่ไม่มีรหัสเซสชันจะได้รับ IP จากพูลทุกการเชื่อมต่อ TCP ใหม่ โดยปกติจะเป็น IP ที่ต่างกัน และ -session-<id>-ttl-<minutes> จะรักษา IP หนึ่งสำหรับรหัสนั้นเป็นเวลา นานสูงสุด 30 นาที แม้ว่า IP อาจเปลี่ยนแปลงก่อนหน้านั้น การหมุนจะตามการเชื่อมต่อ ไม่ใช่คำขอ HTTP ดังนั้น keep-alive จะเป็นตัวกำหนดว่า IP ของคุณจะเปลี่ยนจริง ๆ เมื่อไหร่ ทราฟฟิกพร็อกซีเรซิเดนเชียลมีค่าใช้จ่ายเริ่มต้น US$0.50/GB จาก 50 GB ชำระเงินด้วยคริปโต, ไม่ต้อง KYC
กฎของเซสชันสรุปแบบคร่าว ๆ
| หน่วยของการหมุน | IP จากพูลในทุกการเชื่อมต่อ TCP ใหม่ โดยปกติจะเป็น IP ที่ต่างกัน |
|---|---|
| Sticky session | -session-<id>-ttl-<minutes> ต่อท้ายชื่อผู้ใช้ |
| ความยาวของเซสชัน | นานสูงสุด 30 นาที |
| รหัสเซสชัน | 1–32 ตัวอักษรหรือตัวเลข; รหัสหนึ่งต่อการไหลของข้อมูล |
| เงื่อนไขที่ทำให้เซสชันจบก่อนเวลา | อุปกรณ์พร็อกซีเรซิเดนเชียลเบื้องหลังนั้นออฟไลน์ |
| Shared IDs | ลูกค้าที่ส่ง ID เดียวกันจะใช้พร็อกซีเรซิเดนเชียล exit เดียวกัน |
| ค่าใช้จ่าย | ไม่มี: session และการเปลี่ยนพร็อกซีรวมในราคาต่อ GB แล้ว |
เมื่อส่ง session ID ที่เกตเวย์จะเกิดอะไรขึ้น?
เกตเวย์จะอ่านชื่อผู้ใช้ในแต่ละการเชื่อมต่อใหม่ หากไม่มีส่วน session จะเลือกพร็อกซีเรซิเดนเชียลที่ตรงกับเป้าหมายของคุณสำหรับการเชื่อมต่อนั้นเท่านั้น หากมีส่วน session จะคงพร็อกซี exit เดิมสำหรับ ID นั้นตาม TTL ที่คุณตั้งไว้
พร็อกซี IP ติดหนึบคือการเชื่อมต่อจริงที่บ้าน จึงอาจตัดก่อนหมด TTL ได้ เช่น อุปกรณ์ปิด Wi-Fi หลุดหรือเปลี่ยนเครือข่าย งานที่ต่อเนื่องนานต้องจัดการโดยตรวจสอบ IP exit ที่จุดเช็กพอยต์และเริ่มใหม่จากจุดเช็กพอยต์แทนที่จะล้มทั้งงาน
ไลบรารีแต่ละตัวใช้การเชื่อมต่อซ้ำกันอย่างไร?
ถ้าไลบรารีเก็บการเชื่อมต่อนั้นไว้ ทุกคำขอในเชื่อมต่อนั้นจะใช้พร็อกซี exit เดียวกัน นี่คือวิธีที่ทำให้ได้พฤติกรรมที่ต้องการอย่างตั้งใจ
| ไลบรารี | ค่าเริ่มต้น | IP ใหม่ทุกคำขอ | IP หนึ่งตัวสำหรับแต่ละ flow |
|---|---|---|---|
| Python requests | Session เก็บการเชื่อมต่อต่อเนื่อง | Header Connection: close หรือ Session ใหม่ในแต่ละคำขอ | Session ตัวเดียวกับ session ID ในชื่อผู้ใช้ |
| httpx | ไคลเอนต์รวมการเชื่อมต่อ | httpx.Limits(max_keepalive_connections=0) | ไคลเอนต์หนึ่งตัวต่อ session ID |
| aiohttp | TCPConnector รวมการเชื่อมต่อ | TCPConnector(force_close=True) | session ID ใน proxy URL username |
| Scrapy | รวมตามข้อมูลรับรองพร็อกซีและโฮสต์ | meta={"proxy_session": "new"} กับ middleware ของเรา | proxy_session ตายตัวสำหรับ flow |
| Playwright / Puppeteer | Chrome รวมต่อ context | context ใหม่ต่อหน้า | context หนึ่งตัวต่อ session ID |
| Node.js undici, axios, got | Agents เก็บ sockets ตลอด | Agent ใหม่ต่อคำขอ หรือปิด keep-alive | Agent หนึ่งตัวต่อ session ID |
| curl | หนึ่งการเชื่อมต่อต่อคำสั่ง | เป็นอย่างนี้อยู่แล้ว | session ID เดียวกันในแต่ละคำสั่ง |
กลยุทธ์ session แบบไหนเหมาะกับงาน scraping อะไร?
| งาน | กลยุทธ์ | TTL แนะนำ |
|---|---|---|
| หน้าผลิตภัณฑ์ บทความ หรือรายการแยก | หมุน: ไม่มี session ID | — |
| การแบ่งหน้าโดยที่หน้าถัดไปขึ้นกับคุกกี้หรือเคอร์เซอร์ | พร็อกซีเรซิเดนเชียลแบบติดหนึบหนึ่งครั้งต่อรายการ | 10–30 นาที |
| ค้นหา, แล้วผลลัพธ์, แล้วหน้ารายละเอียด | พร็อกซีเรซิเดนเชียลแบบติดหนึบหนึ่งครั้งต่อการค้นหา | 10–20 นาที |
| การเรนเดอร์เว็บด้วยเฮดเลสบราวเซอร์หลายหน้าในไซต์เดียวกัน | พร็อกซีเรซิเดนเชียลแบบติดหนึบหนึ่งครั้งต่อคอนเท็กซ์ของบราวเซอร์ | อายุของคอนเท็กซ์, สูงสุด 30 นาที |
| ตรวจสอบสิ่งที่หน้าแสดงในหลายเมือง | พร็อกซีเรซิเดนเชียลระยะสั้นหนึ่งครั้งต่อการตรวจสอบเมือง | 5 นาที |
| ตรวจสอบหน้าเดิมซ้ำทุกชั่วโมง | หมุน | — |
ฉันจะจัดการพูลพร็อกซีเรซิเดนเชียลแบบติดหนึบใน Python อย่างไร?
พูลขนาดเล็กจะกระจายโหลดไปยังพร็อกซีเรซิเดนเชียลที่เสถียรไม่กี่อัน และเกษียณแต่ละอันหลังจากจำนวนคำขอที่กำหนดหรือหลังมีสัญญาณว่าการเชื่อมต่อล้มเหลว เช่น 502 หรือ 503 โปรดทราบว่ามันไม่ได้ทำสิ่งนี้: ไม่ได้สลับ IP เพื่อผ่าน 403 หรือ 429 เหล่านี้แปลว่าเว็บไซต์ต้องการให้คุณช้าลง ดังนั้นพูลจะส่งข้อความนั้นกลับไปยังโค้ดของคุณ
import random
import uuid
import requests
GATEWAY = "gw.crawlrelay.com:7777"
BASE_USER, PASSWORD = "USERNAME-country-us", "PASSWORD"
class SlowDown(Exception):
"""The target asked us to slow down (403 or 429): back off, do not rotate."""
class StickySession:
def __init__(self, ttl=15, max_requests=50):
self.id = uuid.uuid4().hex[:10]
self.max_requests, self.used = max_requests, 0
user = "%s-session-%s-ttl-%d" % (BASE_USER, self.id, ttl)
proxy = "http://%s:%s@%s" % (user, PASSWORD, GATEWAY)
self.http = requests.Session()
self.http.proxies = {"http": proxy, "https": proxy}
class SessionPool:
EXIT_PROBLEMS = {502, 503, 504}
def __init__(self, size=5, **options):
self.options = options
self.sessions = [StickySession(**options) for _ in range(size)]
def _replace(self, i):
self.sessions[i].http.close()
self.sessions[i] = StickySession(**self.options)
def get(self, url, **kwargs):
i = random.randrange(len(self.sessions))
s = self.sessions[i]
s.used += 1
try:
r = s.http.get(url, timeout=(10, 30), **kwargs)
except requests.exceptions.RequestException:
self._replace(i) # dropped exit or timeout: start a fresh session
raise
if r.status_code in (403, 429):
raise SlowDown("%s returned %d" % (url, r.status_code))
if r.status_code in self.EXIT_PROBLEMS or s.used >= s.max_requests:
self._replace(i)
return r
pool = SessionPool(size=5, ttl=15, max_requests=50)
print(pool.get("https://api.ipify.org").text)ฉันจะรู้ได้อย่างไรว่าพร็อกซีที่ติดหนึบเปลี่ยนหรือไม่?
ถาม การขอบริการสะท้อน IP เช่น https://api.ipify.org ผ่านเซสชันเดียวกันในจุดเริ่มต้นของกระบวนการและทุกจุดตรวจสอบแล้วเปรียบเทียบคำตอบ การเปลี่ยนแปลว่าพร็อกซีที่อยู่ข้างหลังเซสชันเปลี่ยนไป: เริ่มต้นใหม่จากจุดตรวจสอบล่าสุด หรือเปิดเซสชันใหม่ บันทึกไว้พร้อม session ID เพื่อแยกความแตกต่างระหว่างการเปลี่ยน IP กับพฤติกรรมเว็บไซต์ตอนดีบัก
ข้อผิดพลาดของเซสชันแบบไหนที่มีค่าใช้จ่ายมากที่สุด?
- หมุนทุกคำขอของกระบวนการหลายขั้นตอน. เว็บไซต์จะเห็นตะกร้า, เคอร์เซอร์ หรือโทเคนการค้นหากระโดดไปมาระหว่างประเทศและรีเซ็ตมัน
- เซสชัน ID หนึ่งอันสำหรับทุกคนทำงาน. เซสชันถูกออกแบบให้สำหรับกระบวนการหนึ่งชุด จึงต้องให้แต่ละคนและแต่ละกระบวนการมี ID เอง
- เซสชันยาวเกินกว่างาน. TTL 30 นาทีสำหรับกระบวนการ 2 นาทีทำให้ IP ถูกใช้โดยเปล่าประโยชน์และทำให้บันทึกลำบากขึ้น
- มอง 429 เป็นปัญหา IP. IP ใหม่ไม่ได้เปลี่ยนกฎของเว็บไซต์; ต้องชะลอแทน ดู 429 Too Many Requests.
- สมมติว่าหมุนเปลี่ยนทุกคำขอ. keep-alive ช่วยรักษาการเชื่อมต่อไว้; ดูตารางข้างบนสำหรับไลบรารีของคุณ
เซสชันและการหมุน: คำถาม
เซสชันติดหนึบจะอยู่นานแค่ไหน?
เซสชันติดตามเก็บ IP เดิมตามเวลาที่ตั้งไว้ (ttl เป็นนาที) สูงสุด 30 นาที IP อาจเปลี่ยนก่อนเวลากำหนด เช่น เมื่ออุปกรณ์พร็อกซีเรซิเดนเชียลออฟไลน์. เลือก TTL ให้ยาวกว่ากระบวนการที่ให้บริการเล็กน้อยและตรวจสอบพร็อกซีที่จุดตรวจสอบ
เซสชันติดหนึบจะมีค่าใช้จ่ายมากกว่าการหมุนไหม?
ไม่ใช่. CrawlRelay คิดเงินตามปริมาณข้อมูลต่อ GB รวมถึงเซสชัน, การหมุน และการกำหนดเป้าหมาย พร็อกซีเรซิเดนเชียลแบบติดหนึบยังช่วยประหยัดปริมาณข้อมูล เพราะการเชื่อมต่อแบบเก็บไว้ช่วยหลีกเลี่ยงการจับมือ TLS ใหม่ทุกคำขอ
หมุนทุกคำขอดีกว่าสำหรับการสแครปข้อมูลไหม?
สำหรับหน้าเว็บแยกกัน การหมุนช่วยกระจายโหลดและหลีกเลี่ยงการเข้าใช้ไซต์จาก IP เดียวเป็นเวลานาน สำหรับอะไรที่มีสถานะ เช่น การแบ่งหน้าที่ผูกกับคุกกี้ มันจะทำให้กระบวนการล่ม ส่วนใหญ่จะผสมทั้งสองอย่าง: หมุนระหว่างหมวดหมู่ อยู่ติดหนึบภายในกระบวนการ
ฉันจะเลือก IP ที่แน่นอนได้ไหม?
ไม่ได้ พร็อกซีเรซิเดนเชียลจะกำหนดพร็อกซีจากพูลที่เปลี่ยนตลอดเวลา ตามเป้าหมายในชื่อผู้ใช้ คุณเลือกประเทศ, เมือง, รัฐในสหรัฐ, รหัสไปรษณีย์ หรือ ASN และสามารถเก็บ IP ไว้กับเซสชันได้ แต่ไม่สามารถจองที่อยู่เฉพาะได้
การหมุนและเซสชันมีในทุกแผน
US$1.50 สำหรับ 1 GB, US$0.50/GB ตั้งแต่ 50 GB