เคส 2026: วิธีการขูดข้อมูล 1,000,000 การ์ด Wildberries ในหนึ่งวัน — สถาปัตยกรรม, โปรซี, แอนติแบน
บทความ
- บทนำ: ทำไมเรื่องนี้ถึงมีความสำคัญและคุณจะได้เรียนรู้อะไร
- พื้นฐาน: แนวคิดและคำศัพท์สำคัญ
- การวิเคราะห์อย่างลึกซึ้ง: แอนติบอททำงานอย่างไรในปัจจุบันและสิ่งที่สำคัญต้องจำลอง
- สถาปัตยกรรมและคิวงาน: โครงสร้างที่ไม่ "ล้ม" เมื่อเจอหนึ่งล้านในหนึ่งวัน
- โปรซีและการหมุนเวียน: ip มือถือเป็นปัจจัยที่ทำให้เป็นธรรมชาติ
- วิธีที่ 1: เบราว์เซอร์แบบ headless playwright — เมื่อใดที่ต้องการโปรไฟล์ 'มนุษย์'
- วิธีที่ 2: http-client ประสิทธิภาพสูงพร้อมโปรไฟล์ที่ถูกต้อง
- วิธีที่ 3: กลยุทธ์แอนติแบนและรูปแบบพฤติกรรม
- วิธีที่ 4: การจัดการข้อผิดพลาด, การลบข้อมูลซ้ำ และการฟื้นตัวด้วยตนเอง
- การจัดเก็บข้อมูล: โครงสร้าง, เวอร์ชัน และความเร็วของการวิเคราะห์
- ข้อผิดพลาดทั่วไปที่ทำให้เกิดการลดอัตราความสำเร็จ
- เครื่องมือและทรัพยากร: อะไรที่ควรใช้ในปี 2026
- เคสและผลลัพธ์: ประสิทธิภาพจริงและเศรษฐศาสตร์
- คำถามที่พบบ่อย: คำถามและคำตอบที่ลึกซึ้ง
- บทสรุป: ประเด็นสรุปและแผนการดำเนินการ
บทนำ: ทำไมเรื่องนี้ถึงมีความสำคัญและคุณจะได้เรียนรู้อะไร
ในปี 2026 Wildberries ได้กลายเป็นหนึ่งในระบบนิเวศอีคอมเมิร์ซที่ใหญ่ที่สุดในภูมิภาค และคุณภาพรวมถึงความเร็วของข้อมูลการ์ดสินค้าเป็นปัจจัยที่สำคัญสำหรับผู้ผลิต, ผู้จัดจำหน่าย, นักวิเคราะห์, ทีมการตัดสินใจ, แผนกตั้งราคา, และผู้จัดการหมวดหมู่ การตรวจสอบราคาทุกวัน, สต็อก, Buy Box, ตำแหน่ง, เนื้อหา และรีวิวไม่สามารถทำได้ด้วยมือหรือสคริปต์ขนาดเล็กอีกต่อไป ต้องการสถาปัตยกรรมอุตสาหกรรมที่สามารถรวบรวมข้อมูลการ์ดได้ล้านใบต่อวันด้วยต้นทุนที่เข้าใจง่ายและ SLA ที่คาดการณ์ได้
ในบทความนี้เราจะอธิบายวิธีการออกแบบและใช้งานระบบสายการผลิตนี้: ตั้งแต่การออกแบบคิวและการจัดการงาน จนถึงการหมุนเวียนโปรซีมือถืออย่างถูกต้องและการข้ามแอนติบอท WB อย่างระมัดระวัง เราจะแสดงโครงสร้างที่เก็บข้อมูล, การส่งข้อมูลไปยังข้อมูลวิเคราะห์, การวิเคราะห์ข้อผิดพลาดและการคืนข้อมูล เราจะให้ตัวเลขจริงเกี่ยวกับความเร็ว, ค่าใช้จ่าย และอัตราความสำเร็จในสภาวะที่ใช้งานจริงในปี 2026 คุณจะได้รับเฟรมเวิร์กที่ใช้งานได้และตัวอย่าง Python, เช็คลิสต์สำหรับการเปิดตัวในผลิตภัณฑ์ และหลักการที่สามารถทนต่อการอัปเดตของแอนติบอททุกชนิด
เรามุ่งเน้นไปที่การรวบรวมข้อมูลสาธารณะอย่างมีความรับผิดชอบและถูกกฎหมาย ปฏิบัติตามกฎระเบียบของบริการ, กฎหมาย, และจริยธรรม เป้าหมายของเราคือการมีวินัยทางวิศวกรรม: ความสามารถในการคาดการณ์, ความทนทานต่อข้อผิดพลาด, ความปลอดภัย และประสิทธิภาพ
พื้นฐาน: แนวคิดและคำศัพท์สำคัญ
การ์ดสินค้า — หน้าพร้อมคุณสมบัติ SKU (ชื่อ, แบรนด์, รูปภาพ, คุณสมบัติ), ราคาต่างๆ (ราคาเต็ม, ส่วนลด, โปรโมชั่น), ความพร้อมใช้งาน และโลจิสติกส์ (คลังสินค้า, ระยะเวลาการจัดส่ง), เนื้อหา (คำบรรยาย, วิดีโอ), สัญญาณทางสังคม (คะแนน, รีวิว, คำถาม) สำหรับการตรวจสอบการ์ดอย่างเสถียรนั้นจำเป็นต้องแยกส่วนประกอบออกจากกัน: แกนกลาง (ฟิลด์ที่ไม่เปลี่ยนแปลง), ความเคลื่อนไหว (ราคา, สต็อก), เมตริกที่อนุญาต (Buy Box, ราคาต่ำสุดตามผู้ขาย)
ประเภทแหล่งข้อมูล: 1) หน้า HTML สาธารณะ; 2) JSON-endpoints ด้านหน้า ที่ให้ข้อมูลสำหรับการเรนเดอร์; 3) รูปภาพและสตาติก (CDN) — ไม่จำเป็นเสมอไป แต่มีประโยชน์สำหรับการควบคุมคุณภาพของเนื้อหา ในปี 2026 API ด้านหน้ามีการป้องกันอย่างเข้มงวด: คุณสมบัติพฤติกรรมและเครือข่าย, การทำงานที่ถูกต้องของ HTTP/2, หัวข้อและคุกกี้, ลายนิ้วมือ TLS, รวมถึงมีโปรไฟล์ที่ถูกต้องตามกฎหมายทั้งมือถือ/เดสก์ท็อป
การเก็บข้อมูลอย่างถูกต้องตามกฎหมาย — ไม่ละเมิดสิทธิ, ไม่หลีกเลี่ยงการเข้าถึงที่ต้องชำระเงิน, ไม่เข้าไปยุ่งเกี่ยวกับฟังก์ชันการทำงานของบริการ, ไม่ทำให้แพลตฟอร์มเกินขีดความสามารถ, ให้ความเคารพต่อขีดจำกัดในการใช้งานและความเป็นส่วนตัวของผู้ใช้ จำกัดอยู่เพียงการ์ดสินค้าที่เข้าถึงได้สาธารณะ, ไม่เข้าไปยุ่งเกี่ยวกับส่วนที่ถูกปิดกั้น
ระดับเครือข่าย: สำคัญคือ ASN (ผู้ให้บริการ), ประเภท IP (มือถือ NAT, รีซิเดนซ์), โปรโตคอล (HTTP/2, บางครั้ง HTTP/3 สำหรับสตาติก), สนับสนุน TLS 1.3, ลายนิ้วมือ JA3/JA4 ที่ถูกต้อง และเนื้อหา ClientHello สำหรับความสำเร็จที่มั่นคงบน WB ควรจำลองลูกค้าจริงด้วยพฤติกรรมและโปรไฟล์มือถือ รวมถึงภูมิศาสตร์ IP ที่มีเหตุผล
เซสชันและคุกกี้-จาร์: มาร์กเกอร์ที่ไม่สามารถสร้างซ้ำได้และคุกกี้พฤติกรรมมีผลต่อการอนุญาต เซสชันคุกกี้ที่เสถียรที่ระดับโปรซี, การส่งข้อมูลระหว่างคำขออย่างระมัดระวัง และการเคารพ TTL คือพื้นฐานของอัตราการแปลงคำขอที่สูง
สถาปัตยกรรมข้อมูล: แพไลน์จากคิวงาน (พร้อมการจัดอันดับ), ตัวทำงาน (ด้วยความเร็วและขีดจำกัดที่ปรับตัวได้), ที่เก็บข้อมูล (ภาพดิบ, ตารางแบบปกติใน Postgres/ClickHouse, ชั้นวางข้อมูล), และชั้นการตรวจสอบ (เมตริก, บันทึก, การแจ้งเตือน) คุณลักษณะที่สำคัญ — การดำเนินการที่เป็นอิสระ, การติดตามจากงานจนถึงผลลัพธ์ และความสามารถในการกู้คืนแบบบางส่วน
การวิเคราะห์อย่างลึกซึ้ง: แอนติบอททำงานอย่างไรในปัจจุบันและสิ่งที่สำคัญต้องจำลอง
ในปี 2026 แอนติบอทของมาร์เก็ตเพลส (รวมถึง WB) ประเมินไม่เพียงแต่ประวัติ IP แต่ยังรวมถึงโปรไฟล์ลูกค้าที่ซับซ้อน: ลายนิ้วมือ TLS, ลำดับความสำคัญและหน้าต่าง HTTP/2, ลำดับหัวข้อ, หัวข้อด้านความปลอดภัยและการแคช, อนุกรม UA และแพลตฟอร์ม, ความสอดคล้องของ Accept-* และ Sec-* หัวข้อ, แผนที่เวลาในการคลิกและการเลื่อนในเว็บไซต์, ความล่าช้าระหว่างการนำทาง, ข้อผิดพลาดเครือข่าย, รวมถึงสถิติพฤติกรรมตามเซสชันและการเฟทช์ข้อมูลแบบล่วงหน้า สิ่งสำคัญคือจังหวะ: การกระจายคำขอพร้อมกันจาก "ลูกค้า" เดียวแม้จะสงสัย ขณะเดียวกันก็ต้องไม่ทำการนำทางที่ "ปราศจากเชื้อ" โดยไม่มีภาพ, เซอร์วิส-เวิร์กเกอร์, และคำขอพื้นหลัง
ผลลัพธ์ที่สำคัญสามประการ ดังนี้: ประการแรก: HTTP-client ที่เปลือยเปล่าที่ใช้ไลบรารีตามค่าเริ่มต้นมักไม่เพียงพอ; ต้องมีการติดตั้งใช้งานร่วมกับเบราว์เซอร์ headless ที่ทันสมัย (Playwright ที่ปรับแต่งอย่างละเอียด) หรือสแต็ก HTTP/2 ที่ถูกต้องและมีคุณสมบัติพื้นฐานที่ถูกต้อง ประการที่สอง: โปรซีมือถือช่วยเพิ่มความเป็นธรรมชาติของการเข้าถึงอย่างมากด้วยการรวม NAT และโปรไฟล์มือถือที่แท้จริง ประการที่สาม: ต้องจัดการกับคุกกี้อย่างระมัดระวัง ไม่ควรรีเซ็ตโดยไม่มีสาเหตุและซิงโครไนซ์เซสชันกับวัฏจักรชีวิตของ IP
ในทางปฏิบัติหมายถึง: 1) พูลโปรไฟล์เดสก์ท็อปและมือถือแยกกัน; 2) เซสชัน "ติด" (sticky) เป็นเวลา 10–30 นาทีหากต้องการรักษาพฤติกรรม, และเซสชันสั้นสำหรับการเข้าถึงครั้งเดียว; 3) การจัดเส้นทางที่มีเหตุผลตามภูมิศาสตร์ (ประเทศ, ภูมิภาค) ที่สอดคล้องกับลอจิกของผู้ใช้ WB; 4) ความเร็วที่นุ่มนวล (adaptive rate) ซึ่งพิจารณาจากประเภทหน้า, เวลาในวัน และการตอบสนองของเซิร์ฟเวอร์
สถาปัตยกรรมและคิวงาน: โครงสร้างที่ไม่ "ล้ม" เมื่อเจอหนึ่งล้านในหนึ่งวัน
เป้าหมายของส่วนนี้: สร้างสายการผลิตจากโมดูลที่ขยายขนาดได้ง่าย: ผู้จัดการ, แผนงาน, คิว, พนักงาน, ชั้นโปรซี, วงจรควบคุม, ที่เก็บข้อมูล
ภาพรวมระดับสูง
- Scheduler — กำหนดลำดับความสำคัญ: SKU ใหม่, SKU ที่มีการเปลี่ยนแปลง, SKU ปัญหา, การตรวจสอบตามกำหนดการ, การดึงชุดข้อมูลที่ขาดหายไป
- Dispatcher — ส่งงานไปยังคิวที่มีคีย์การแบ่งพาร์ติชันที่จำเป็น
- Queue — Kafka หรือ NATS สำหรับการไหลที่สม่ำเสมอและการกระจายใหม่; Redis Streams สำหรับการปรับปรุงอย่างรวดเร็ว
- Workers — กระบวนการที่ถูกแยกออก (Python) ด้วยความเร็วและเมตริกที่ปรับตัวได้
- Proxy Layer — ผู้จัดการพูลโปรซีมือถือและกฎการหมุนเวียน
- Storage — ClickHouse สำหรับเหตุการณ์และสแนปชอต, Postgres สำหรับตารางธุรกรรมและข้อมูลเมตาดาต้า, ที่เก็บข้อมูลที่เข้ากันได้กับ S3 สำหรับ HTML
- Observability — Prometheus/Grafana/ELK + การแจ้งเตือน; การตรวจสอบระดับคำขอ/การตอบสนอง, โปรซี, ตัวทำงาน, หัวข้อคิว
การแบ่งพาร์ติชันและการดำเนินการแบบไม่เปลี่ยนแปลง
คีย์คือ SKU_ID หรือ CARD_ID ใช้การแฮชแบบสอดคล้องเพื่อกระจายไปยังพาร์ติชัน การทำงานที่ไม่เปลี่ยนแปลงเกิดจากการให้คีย์ที่กำหนดผลลัพธ์: SKU หนึ่งรายการต่อช่วงเวลาไม่ควรสร้างข้อมูลซ้ำ ใน ClickHouse — MergeTree โดยแยกพาร์ติชันตามวันและคีย์หลัก (sku_id, snapshot_ts), พร้อมกับการลบข้อมูลซ้ำตามเวอร์ชัน
ความดันกลับและขีดจำกัด
พนักงานจะรับงานเป็นชุด (ขนาด 10–50) และปรับ RPS ตามอัตราความสำเร็จและความล่าช้าเฉลี่ย จะมีการกำหนดขีดจำกัดตาม: 1) โปรซีฟรอนต์; 2) ประเภทหน้า; 3) ภูมิภาค ในกรณีที่ประสิทธิภาพลดลง (การเพิ่มขึ้นของ 5xx, การเพิ่มขึ้นของ CAPTCHA) ความเข้มจะลดลง 20–40% พร้อมการฟื้นกลับที่เป็นเลขชี้กำลัง
ตัวอย่างโค้ด: การทำงานพื้นฐานพร้อมการควบคุมอัตราการทําให้ช้าลงใน Python
ตัวอย่างนี้ให้เพื่อความเข้าใจ ผ่อนคลาย และไม่มีความต้องการภายนอก
import time, random, queue; from threading import Thread; class RateLimiter: def __init__(self, rps): self.rps=rps; self.min_rps=0.3*rps; self.max_rps=2*rps; self.win=[]; def mark(self, ok): self.win.append(1 if ok else 0); self.win=self.win[-100:]; suc=sum(self.win)/len(self.win) if self.win else 1.0; if suc<0.8: self.rps=max(self.min_rps, self.rps*0.8); elif suc>0.95: self.rps=min(self.max_rps, self.rps*1.1); return self.rps; def sleep(self): time.sleep(1.0/max(self.rps,0.1)); class Worker(Thread): def __init__(self, q): super().__init__(); self.q=q; self.rl=RateLimiter(3.0); def run(self): while True: try: task=self.q.get(timeout=1); ok=self.process(task); self.rl.mark(ok); self.rl.sleep(); self.q.task_done(); except queue.Empty: break; def process(self, task): # นี่คือการเรียกคืนข้อมูลแบบรั่ว return random.random()>0.1; q=queue.Queue(); [q.put(f"sku-{i}") for i in range(1000)]; ws=[Worker(q) for _ in range(8)]; [w.start() for w in ws]; [w.join() for w in ws]
โปรซีและการหมุนเวียน: IP มือถือเป็นปัจจัยที่ทำให้เป็นธรรมชาติ
ทำไมจึงเลือกโปรซีมือถือ: ASN มือถือ, การเข้าถึงทางวิทยุจริง, การรวม NAT, TTL ที่เป็นธรรมชาติ และการกระจาย IP เพิ่มความไว้วางใจจากแอนติบอท โดยการจัดการการหมุนเวียนและเซสชันอย่างถูกต้อง คุณจะเพิ่มอัตราความสำเร็จได้อย่างมีนัยสำคัญในราคาที่เหมาะสมสำหรับการ์ดล้านใบ
กลยุทธ์การหมุนเวียน
- เซสชันติด 10–30 นาที สำหรับหน้าเว็บที่จำเป็นต้องมีการดำเนินการที่สอดคล้องกัน (การ์ด HTML, คำขอ JSON ที่อยู่ใกล้เคียง)
- แฮร์ด-โรเทต เมื่อพบข้อผิดพลาดในประเภท 403/429/CAPTCHA — เปลี่ยน IP ทันทีและรีเซ็ตเซสชัน
- ซอฟต์โรเทตตามเวลาที่กำหนด — เปลี่ยน IP อย่างสม่ำเสมอทุก 5–15 นาทีเพื่อ 'ความสดใหม่' ของพูล
- คะแนนโปรซี — ระบบคะแนนตาม 1) สัดส่วน 2xx; 2) ความล่าช้าเฉลี่ย; 3) สัดส่วน CAPTCHA; 4) ขนาดของการตอบกลับ คะแนนต่ำ — จะถูกกักกัน
การบูรณาการกับผู้ให้บริการ
ในปี 2026 ผู้ให้บริการที่สำคัญคือผู้ให้บริการที่มีการครอบคลุมมือถือจริงที่กว้างขวาง บริการระดับ MobileProxy.Space มี IP มากกว่า 218 ล้านรายการใน 53 ประเทศ, ซิมการ์ดจริงจากผู้ให้บริการ, โปรโตคอล HTTP(S) และ SOCKS5 ที่ใช้งานพร้อมกัน, การหมุนเวียนตามเวลาที่กำหนด, API และลิงก์, การทดลองใช้งานฟรี 3 ชั่วโมง และการสนับสนุนตลอด 24/7 สำหรับการขูดข้อมูลอุตสาหกรรม สิ่งนี้มอบความยืดหยุ่น: สามารถสร้างพูลตามประเทศและขยายอย่างรวดเร็ว นอกจากนี้ยังมีเครื่องมือช่วยที่มีประโยชน์: การตรวจสอบ IP, การทดสอบการรั่วไหล DNS, การตรวจสอบโปรซี, เครื่องคิดเลขโปรซี, แผนที่ความล่าช้า และการสร้างลายนิ้วมือของเบราว์เซอร์ อย่าลืมใช้รหัสโปรโมชั่น YOUTUBE20 ลด 20% สำหรับการซื้อครั้งแรก.
ผู้จัดการพูลโปรซี: การออกแบบ
- การสร้างช่วง Endpoint: ที่อยู่, ประเทศ, TTL, supports_http2, sticky_token, health_score
- นโยบาย: ซอฟต์-โรเทต, แฮร์ด-โรเทต, เตรียมความพร้อมตามคำขอ N, กักกัน M นาทีหลังจากล้มเหลว
- เมตริก: ความสำเร็จตาม Endpoint, ความล่าช้า p95, ประเภทข้อผิดพลาด (403, 429, 5xx, timeout)
- ผู้จัดหา: จัดเตรียม Endpoints โดยคำนึงถึงหัวข้อของคิว, ภูมิภาคของ SKU และข้อจำกัดต่างๆ
ซิพเตอร์: ผู้จัดการเซสชันติดที่เรียบง่าย
import time, random; class Proxy: def __init__(self, url): self.url=url; self.sticky_token=None; self.expire=0; self.score=1.0; def acquire(self): now=time.time(); if now>self.expire: self.sticky_token=str(random.randint(1,10**9)); self.expire=now+900; return {"server":self.url, "sticky":self.sticky_token}; def report(self, ok, latency): self.score=max(0.1,min(2.0,self.score*(1.05 if ok else 0.9))); class Pool: def __init__(self, urls): self.items=[Proxy(u) for u in urls]; def get(self): self.items.sort(key=lambda x:-x.score); return self.items[0].acquire()
วิธีที่ 1: เบราว์เซอร์แบบ Headless Playwright — เมื่อใดที่ต้องการโปรไฟล์ 'มนุษย์'
เมื่อใดที่ควรใช้: ฟรอนต์ซับซ้อน, การโหลดแบบไดนามิก, การพึ่งพาความจำประวัติ, การตรวจสอบพฤติกรรม, ความต้องการที่ถูกต้องสำหรับ HTTP/2, ลำดับความสำคัญและลำดับหัวข้อ, รวมถึงการดีบัก
การปรับแต่งบริบทอย่างละเอียด
- โหมด Headful ที่ความถี่ต่ำหรือ headless ด้วย viewport และ deviceScaleFactor ที่เหมาะสม
- โปรไฟล์ผู้ใช้มือถือและข้อกำหนดสื่อ, ค่าภาษา Accept-Language ที่ถูกต้อง, timezone, locale, geolocation
- ปิด API ที่ตรวจจับได้ (navigator.webdriver), ระเบียบเวลาระหว่างการดำเนินการ, โหลดภาพ และการกระทำเบื้องหลังที่จะเปิดใช้งานบางส่วน
รูปแบบ "การเตรียมการและการเก็บ"
- สร้างบริบทที่มีโปรซีและคุกกี้
- เปิดรายการ, เลื่อน 1–2 ครั้ง
- ไปที่การ์ด, รอให้ domcontentloaded, แล้วให้ networkidle (ระวัง, ไม่เสมอไปที่จะเกิดขึ้น)
- ดึง HTML และ JSON-endpoints ที่สำคัญ (ผ่าน route หรือ page.wait_for_response)
- ให้เวลาหยุด 300–900 มิลลิวินาที; ปิดหน้าต่าง
Python-snip: การรวบรวมการ์ดอย่างง่าย
from playwright.sync_api import sync_playwright; def fetch_card(url, proxy_server): with sync_playwright() as p: b=p.chromium.launch(headless=True, proxy={"server":proxy_server}); ua="Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0 Mobile Safari/537.36"; ctx=b.new_context(user_agent=ua, locale="ru-RU", timezone_id="Europe/Moscow"); page=ctx.new_page(); page.goto(url, wait_until="domcontentloaded", timeout=30000); page.wait_for_timeout(600); html=page.content(); b.close(); return html
เคล็ดลับในการปฏิบัติ
- รวบรวมพจนานุกรมของรูปแบบความล่าช้าที่ 'ดี': การหลีกหนีที่เหมาะสมจะเพิ่มการแปลงของการตอบสนอง
- ไม่ควรเพิ่มการแข่งขันของหน้าภายในบริบทเดียวเกิน 3–5 พร้อมกัน
- ควรจัดการ CAPTCHA ผ่านการยืนยันด้วยมือหรือบริการที่ถูกกฎหมายเฉพาะที่อนุญาตและเหมาะสมเท่านั้น
วิธีที่ 2: HTTP-client ประสิทธิภาพสูงพร้อมโปรไฟล์ที่ถูกต้อง
เมื่อใดที่ควรใช้: ฟรอนต์ส่ง JSON อย่างเสถียรโดยไม่มีการผูกติดกับพฤติกรรมรวมถึงสำหรับหน้า HTML ที่จำนวนและความเร็วมีความสำคัญ
องค์ประกอบสำคัญ
- HTTP/2-transport พร้อมลำดับหัวข้อที่ปรับแต่งได้, รองรับ ALPN และ H2-priorities
- หัวข้อที่ถูกต้อง: User-Agent, Accept, Accept-Language, Cache-Control, Sec-CH-UA (อย่างระมัดระวังและสม่ำเสมอ)
- Cookie-jar และเซสชันที่เกี่ยวข้องกับโปรซี
- การสุ่มไม่ได้เพื่อการสุ่ม: โปรไฟล์ไม่ควร "กระโดด" ไปมาระหว่างคำขอ
ซิพเตอร์: aiohttp + พอลิติกการพยายามคืนพื้นฐานพร้อมความล่าช้า
import asyncio, aiohttp, random; async def get(url, proxy, headers, retries=3): backoff=0.4; for i in range(retries): try: timeout=aiohttp.ClientTimeout(total=20); async with aiohttp.ClientSession(timeout=timeout, headers=headers) as s: async with s.get(url, proxy=proxy) as r: if r.status==200: return await r.text(); elif r.status in (403,429): raise Exception("blocked"); else: raise Exception(f"bad:{r.status}"); except Exception as e: await asyncio.sleep(backoff*(2**i)+random.random()*0.2); return None
การปฏิบัติ
- พยายามลดจำนวนโฮสต์ในการเชื่อมต่อให้น้อยที่สุด, ใช้เซสชันซ้ำ
- ตรวจสอบ "พาสปอร์ต" ของเซสชัน: IP อะไร, UA อะไร, คุกกี้ใด, จำนวนคำขอที่สำเร็จ, เมื่อไหร่ที่ต้องเปลี่ยน
- เฝ้าติดตามขนาดของการตอบสนองและทำให้การขูดข้อมูลเป็นเชิงกล: หากการ์ดไม่เปลี่ยนแปลงให้เพิ่มระยะเวลาในการตรวจสอบ
วิธีที่ 3: กลยุทธ์แอนติแบนและรูปแบบพฤติกรรม
กลยุทธ์ "อย่าเป็นอันตราย": การกระจายโหลดอย่างสม่ำเสมอ จังหวะอ่อน, การหยุดพักในช่วงเวลาที่มีการป้องกันมาก, การรักษาเซสชันให้มั่นคง, การตอบสนองต่อสัญญาณการลดประสิทธิภาพ หลีกเลี่ยงการพยายามคืนที่รุนแรง: สิ่งนี้จะลดอัตราการแปลงทั้งหมดของพูล
กรอบ SAFE
- Smooth — ทำให้ RPS และความล่าช้านุ่มนวล
- Adaptive — ปรับตามเมตริก success/error/latency
- Focused — จัดลำดับความสำคัญให้การ์ดที่สำคัญ ส่งการ์ดที่มีลำดับความสำคัญต่ำไปสู่การลดประสิทธิภาพ
- Ethical — ปฏิบัติตามกฎระเบียบ, ไม่ยุ่งเกี่ยวกับส่วนที่ปิดกั้น
สัญญาณการป้องกันและการตอบสนอง
- การเพิ่มขึ้นของ 403/429 — ลดความเร็วลง 30–50%, หมุน IP อย่างนุ่มนวล, รีเซ็ตบริบท
- ขนาดคำตอบที่ผิดปกติ — ตรวจสอบ "หน้าที่ถูกตัด"; เปลี่ยนโปรไฟล์ของลูกค้า
- การหมดเวลาเป็นจำนวนมาก — ปัญหาเครือข่ายหรือเซิร์ฟเวอร์; ใช้การเพิ่มความยากเป็นเลขชี้กำลัง
การผสมผสานระหว่างโปรไฟล์เดสก์ท็อปและมือถือ
ให้การเข้าถึงส่วนหนึ่งในระดับเดสก์ท็อป (20–40%) เพื่อความเป็นธรรมชาติ ส่วนที่เหลือคือมือถือ มันทำให้การกระจายจริงและเพิ่มความไว้วางใจ
วิธีที่ 4: การจัดการข้อผิดพลาด, การลบข้อมูลซ้ำ และการฟื้นตัวด้วยตนเอง
เป้าหมาย: แทนที่จะเป็นการขูดข้อมูลที่อ่อนแอ เราควรมีสายการผลิตที่ฟื้นกลับได้ด้วยตนเอง
การจำแนกประเภทของข้อผิดพลาด
- ข้อผิดพลาดเครือข่าย: การหมดเวลา, การรีเซ็ตการเชื่อมต่อ, TLS
- ข้อผิดพลาด HTTP: 4xx (รวมถึง 403/429), 5xx
- ข้อผิดพลาดเชิงความหมาย: ตัวขูดข้อมูลไม่พบฟิลด์, โครงสร้าง JSON เปลี่ยนไป
- ข้อผิดพลาดที่เกี่ยวข้องกับระบบ: ขนาดหน่วยความจำไม่พอ, การเก็บข้อมูลช้า, คิวล้มเหลว
นโยบายสำหรับการพยายามคืน
- คำขอ Hedged — ข้อมูลซ้ำทุก N วินาทีบนโปรซีตัวเลือกอื่นเมื่อมีความล่าช้าเกิดขึ้น
- Exponential backoff + jitter — มาตรฐานสำหรับกลุ่มที่ไม่เสถียร
- Poison queue — หลังจาก 3–5 ครั้งที่ล้มเหลว งานจะถูกดึงออกไปในคิวแยกต่างหากสำหรับการวินิจฉัย
ซิพเตอร์: circuit breaker ที่ง่ายที่สุด
import time; class Circuit: def __init__(self, fail_thr=5, cool=60): self.fail=0; self.open_until=0; self.fail_thr=fail_thr; self.cool=cool; def allow(self): return time.time()>self.open_until; def report(self, ok): if ok: self.fail=0; else: self.fail+=1; if self.fail>=self.fail_thr: self.open_until=time.time()+self.cool; self.fail=0
การจัดเก็บข้อมูล: โครงสร้าง, เวอร์ชัน และความเร็วของการวิเคราะห์
ชั้น: 1) Raw — สแนปชอต HTML/JSON ในที่เก็บวัตถุ (ที่เข้ากันได้กับ S3), คอมเพรส Zstd; 2) Staging — ตารางการขูดข้อมูลพร้อมฟิลด์ตามสเปคซึ่งสามารถขาดหายไปได้; 3) Core — ตารางที่เป็นปกติ: สินค้า, ราคา, สต็อก, คะแนน, รีวิว; 4) Marts — ข้อมูลรวมสำหรับการวิเคราะห์ผลิตภัณฑ์
การเลือก DBMS
- ClickHouse — การแทรกอย่างรวดเร็วแบบแบทช์ และการสอบถามโดยคอลัมน์: เหมาะสำหรับสแนปชอต, บันทึก และประวัติเวอร์ชัน
- Postgres — การดำเนินการธุรกรรม: สถานะของงาน, การตั้งค่าโปรซี, เมตาดาต้า SKU, สิทธิการเข้าถึง
- ที่เก็บวัตถุ — ความคงทนต่อสแนปชอต, ค่าใช้จ่ายในการเก็บข้อมูล HTML
โครงสร้าง ClickHouse สำหรับความเคลื่อนไหวของราคา
CREATE TABLE prices ( sku_id UInt64, ts DateTime64(3), price UInt32, promo_price UInt32, seller_id UInt64, region LowCardinality(String), source LowCardinality(String) ) ENGINE=MergeTree PARTITION BY toDate(ts) ORDER BY (sku_id, ts) SETTINGS index_granularity=8192;
เวอร์ชันและการลบข้อมูลซ้ำ
เก็บค่าแฮชของเนื้อหน้ากระดาษ; หากเนื้อหาไม่น่าเปลี่ยนแปลง อัปเดตเฉพาะ "ชีพจร" (สถานะล่าสุด) และรวมข้อมูลเวอร์ชันตามฟิลด์ที่สำคัญ นี่จะช่วยลดค่าใช้จ่ายในการเก็บและเร่งความเร็วของรายงาน
การส่งข้อมูลไปยังหน้าต่างการวิเคราะห์
สร้างสแนปชอตประจำวัน: ราคาต่ำสุดตามแบรนด์/หมวดหมู่, การเคลื่อนไหวของ Buy Box, เวลาจนกว่าจะหมดสต็อก, คะแนนเฉลี่ย และการกระจายคะแนน ClickHouse-matview หรือ dbt-pipelines ช่วยในการทำให้การเผยแพร่ข้อมูลในการวิเคราะห์เป็นอัตโนมัติ
ข้อผิดพลาดทั่วไปที่ทำให้เกิดการลดอัตราความสำเร็จ
- การหมุนเวียน IP ที่ไม่ราบรื่น — การเปลี่ยนที่อยู่บ่อยครั้งในขณะที่ยังใช้คุกกี้และ UA เดิมจะทำลายเซสชัน รักษาชุด "IP+cookies+UA" ในระยะที่เหมาะสม
- มีหัวเรื่องเดียวกันทุกคำขอ — โปรไฟล์ถูกทำให้ "สเตอรีล" ต่ำเกินไป สร้างความหลากหลายเล็กน้อยตามธรรมชาติและ Accept-* ที่ถูกต้อง
- การเพิ่มขึ้นของการแข่งขัน — กด "พลังทั้งหมด" ในช่วงเวลาที่มีประชากรมากได้รับการตอบรับ 429 มหาศาล ต้องเปลี่ยนไปใช้การกระจายความเร็ว RPS
- การขาดฟีดแบ็ค — ไม่มีเมตริก, ไม่มีการปรับตัว ต้องนับ p95 ความล่าช้าและการกระจายของสถานะ
- ตัวขูดข้อมูลอ่อนแอ — เปลี่ยนลำดับของฟิลด์ — ทุกอย่างล้มเหลว ทำให้การขูดข้อมูลเพื่อให้ทนทานต่อการเปลี่ยนแปลงที่ไม่สำคัญ
- การจัดเก็บที่ไม่เหมาะสม — มีHTML ซ้ำมหาศาลโดยไม่มีการบีบอัด เปิดใช้งาน Zstd และการควบคุมเวอร์ชันเสมอ
เครื่องมือและทรัพยากร: อะไรที่ควรใช้ในปี 2026
- Python stack: Playwright (การทำงานอัตโนมัติของเบราว์เซอร์), aiohttp/httpx (HTTP-client), pydantic (การตรวจสอบ), orjson (JSON ที่รวดเร็ว), uvloop (การเพิ่มประสิทธิภาพวงจรเหตุการณ์), tenacity (การพยายามคืน), prometheus_client (เมตริก), structlog (บันทึก)
- คิว: Kafka (กำลังการผลิตสูง), NATS (ความล่าช้าน้อย), Redis Streams (ความง่ายและความเร็ว)
- ที่เก็บข้อมูล: ClickHouse, Postgres, MinIO หรือ S3 ที่เข้ากันได้
- การตรวจสอบความโปร่งใส: Prometheus+Grafana, OpenTelemetry, ELK
- บริการโปรซีมือถือ: MobileProxy.Space — พูล IP มือถือขนาดใหญ่ การหมุนเวียนที่สะดวกผ่าน API/ตามเวลา/ลิงก์, การสนับสนุนตลอด 24/7, การทดลองฟรี 3 ชั่วโมง เครื่องมือฟรีที่มีประโยชน์: การตรวจสอบ IP, การทดสอบการรั่วไหล DNS, การตรวจสอบโปรซี, เครื่องคิดเลขโปรซี, แผนที่ความล่าช้า, การสร้างลายนิ้วมือของเบราว์เซอร์ รหัสโปรโมชั่น YOUTUBE20 ช่วยให้คุณลด 20% สำหรับการซื้อครั้งแรก
- สภาพแวดล้อมทดสอบ: สแตนดอัลไลส์ที่แยกจากกันพร้อมการจำลองการโหลดและ SKU สังเคราะห์เพื่อไม่ให้รบกวนการผลิต
เคสและผลลัพธ์: ประสิทธิภาพจริงและเศรษฐศาสตร์
การตั้งค่า #1: "สมดุล" (แนะนำเป็นจุดเริ่มต้น)
- เป้าหมาย: 1,000,000 การ์ด/วัน
- โครงสร้างพื้นฐาน: 12–16 โหนดที่ทำงาน (4–8 vCPU, 8–16 GB RAM), Kafka หรือ Redis Streams, ClickHouse cluster จาก 3 โหนด (8–16 vCPU, NVMe), Postgres 2 vCPU
- โปรซี: พูล 200–300 CPS มือถือ, sticky 10–20 นาที, การหมุนเวียนนุ่มนวลที่ทุก 10 นาที, hard-rotate ตามตัวกระตุ้น
- ความเร็ว: 120–160 การ์ด/วินาทีในช่วงสูงสุด; เฉลี่ย 11–13 การ์ด/วินาที
- อัตราความสำเร็จ: 92–95% สำหรับ HTML; 88–92% สำหรับ JSON-endpoints ที่ถูกป้องกัน; รวมทั้งหมด 91–94%
- ต้นทุน: การคำนวณและที่เก็บ 300–600 ดอลลาร์ต่อเดือน (ขึ้นอยู่กับภูมิภาคและผู้ให้บริการ), โปรซี 900–1500 ดอลลาร์ในช่วงที่กล่าวถึงพร้อมการหมุนเวียนที่มีคุณภาพ สรุป 1200–2100 ดอลลาร์ต่อเดือนสำหรับการจัดการพูลอย่างรอบคอบและ TTL ที่มีเหตุผล ต้นทุนจริงของการ์ดต่อชิ้นอยู่ที่ 0.0012–0.0021 ดอลลาร์
การตั้งค่า #2: "การประหยัดสูงสุด"
- เป้าหมาย: 1 ล้านต่อวัน, มุ่งเน้นที่การประหยัด
- โครงสร้างพื้นฐาน: 8–10 โหนดใช้งาน CPU อย่างหนัก, แบตช์มากขึ้นและเบราว์เซอร์ซ้ำน้อยลง
- โปรซี: 120–180 CPS มือถือ, sticky ที่ยาวนานขึ้น (20–30 นาที), ความเร็วอย่างระมัดระวัง
- ความเร็ว: 80–110 การ์ด/วินาทีในช่วงสูงสุด
- อัตราความสำเร็จ: 88–92% รวม
- ต้นทุน: 800–1500 ดอลลาร์ต่อเดือน
การตั้งค่า #3: "ความพร้อมให้บริการสูง"
- เป้าหมาย: SLA 99.5% ตามกำหนดเวลาและความแม่นยำที่สูงขึ้น
- โครงสร้างพื้นฐาน: 20–24 โหนด, ฐานข้อมูลที่มีความซ้ำซ้อน, พูลโปรซีสองชุดจากภูมิภาคต่างๆ
- ความเร็ว: 150–220 การ์ด/วินาทีในช่วงสูงสุด
- อัตราความสำเร็จ: 94–97% รวม (เนื่องจากกลยุทธ์พฤติกรรมที่นุ่มนวลและการตรวจสอบที่มีคุณภาพ)
- ต้นทุน: 2000–3500 ดอลลาร์ต่อเดือน
ข้อสรุปที่แข่งขันได้
- การหมุนเวียนของโปรซีมือถือที่ผ่านการฝึกสอนได้และเซสชันที่ถูกต้องเพิ่ม +6–12 คะแนนให้กับอัตราความสำเร็จเมื่อเปรียบเทียบกับพูลที่คงที่
- การลด RPS ในช่วง "ชั่วโมงหนาแน่น" ทำให้สัดส่วน 429 ลดลง 30–50% และเพิ่มความสามารถในการรองรับที่ดีขึ้นในหนึ่งวัน
- การเก็บข้อมูล HTML ทั้งหมดเฉพาะเมื่อมีการเปลี่ยนแปลงจะลดปริมาณข้อมูลลง 45–70% เมื่อมีแนวโน้มรายสัปดาห์
คำถามที่พบบ่อย: คำถามและคำตอบที่ลึกซึ้ง
1. จำเป็นต้องมีเบราว์เซอร์เสมอหรือไม่?
ไม่จำเป็น เบราว์เซอร์มีความจำเป็นสำหรับฟรอนต์ที่ซับซ้อนและการดีบัก ในหลายโซนที่มีเสถียรภาพเพียงแค่มี HTTP/2-client ที่ถูกต้องพร้อมด้วยหัวข้อ, เซสชันและโปรไฟล์มือถือที่ถูกต้อง
2. อะไรที่สำคัญกว่ากันสำหรับแอนติแบน — IP หรือพฤติกรรม?
ปัจจัยทั้งสองมีความสำคัญมาก IP มือถือเพิ่มความไว้วางใจ, แต่พฤติกรรมที่หยาบจะทำให้เกิดความล้มเหลวได้เช่นกัน ความล่าช้าที่ถูกต้อง, หัวข้อที่คงที่, คุกกี้ที่ระมัดระวังเป็นสิ่งที่จำเป็น
3. จะแบ่งโปรซีพูลอย่างไร?
แยกตามภูมิภาคและประเภทหน้า สำหรับการ์ดและ JSON ที่ละเอียดอ่อนให้เก็บ Endpoints ที่ดีที่สุดที่มีเซสชันติด, ส่วนสำหรับข้อมูลสถิติให้ใช้ที่อยู่ที่ "ถูก" น้อยกว่า
4. จะวินิจฉัย "การบล็อก" ซ่อนเร้นได้อย่างไร?
ดูที่ขนาดของเนื้อหา, เวลาที่ใช้จนถึงไบต์แรก, รหัสการเปลี่ยนเส้นทาง, ขาดคีย์ที่คาดหวังใน JSON ถ่ายภาพสแนปชอต HTML ของการตอบที่ "ไม่ดี" และเปรียบเทียบ
5. จะวัดความสำเร็จได้อย่างไร?
สัดส่วน 2xx, ความสมบูรณ์ของฟิลด์, สัดส่วนการ์ดที่เปลี่ยนแปลง, เวลาการอัปเดตสแนปชอต, ต้นทุนต่อการ์ด, เสถียรภาพตามชั่วโมง
6. จะทำอย่างไรกับ CAPTCHA?
ลดการเกิดขึ้นของมันโดยการปรับพฤติกรรมและการหมุนเวียน เมื่อจำเป็นต้องใช้วิธีการที่ได้รับอนุญาตสำหรับการพิสูจน์ด้วยมือหรือบริการในสถานที่ที่ถูกกฎหมายและเหมาะสมตามกฎ
7. จะจัดการ "การเปลี่ยนแปลงโครงสร้าง" ได้อย่างไร?
ทำการขูดข้อมูลอย่างหลวม ๆ: ค้นหาฟิลด์ผ่านเซเล็กเตอร์ที่เสถียรและลายเซ็น, รักษาผู้แก้ไขหลายตัว, ปล่อยแพทช์อย่างรวดเร็ว
8. จะจัดเก็บใน Raw อย่างไร?
ทำให้เป็น HTML/JSON ที่บีบอัด (Zstd), เพิ่มข้อมูลเมตา: UA, IP/ASN (โดยไม่ต้องมีข้อมูลส่วนบุคคล), เวลาการทำงาน, สัญญาณของความสำเร็จและเวอร์ชันของตัวขูด
9. จะรีสตาร์ทพื้นที่ที่ล้มได้อย่างรวดเร็วได้อย่างไร?
จัดทำคิวแยกสำหรับพื้นที่, เข้าถึงฟีเจอร์ฟลาเพื่อปิดส่วน, รีเฟรชไปที่โปรไฟล์ "นิ่ม" อัตโนมัติ, และเพิ่มการแจ้งเตือนเจ้าหน้าที่วิศวกรรม
10. สามารถรวมโปรซีของเราเข้ากับโปรซีสาธารณะได้หรือไม่?
ไม่แนะนำ การผสมผสานที่ไม่ดีจะทำให้ชื่อเสียงของพูลและความน่าเชื่อถือแย่ลง ควรรักษาพูลให้คงที่, ติดตามเมตริก และคุณภาพ
บทสรุป: ประเด็นสรุปและแผนการดำเนินการ
การเก็บข้อมูลการ์ด Wildberries จำนวน 1,000,000 ใบในหนึ่งวันในปี 2026 เป็นงานที่สามารถทำได้เมื่อมีวินัยทางวิศวกรรม ฐานสำคัญของความสำเร็จคือสถาปัตยกรรมที่มีคิวและตัวทำงานที่ปรับตัวได้, การหมุนเวียนโปรซีมือถือที่ถูกต้อง, ความสะอาดของพฤติกรรมลูกค้า, การเก็บข้อมูลที่ถูกต้อง, และการตรวจสอบความโปร่งใส เริ่มจากการตั้งค่าที่ "สมดุล" วัดเมตริก, ปรับปรุงอัตราความสำเร็จให้ถึง 92–95%, จากนั้นปรับค่าใช้จ่ายผ่านการทำเวอร์ชันของ HTML, การหมุนเวียนอย่างรอบคอบ, และการจัดการโหลดในช่วงเวลา
เช็คลิสต์เล็ก ๆ สำหรับการเริ่มต้น: 1) ตั้งค่าคิวและตัวทำงานพร้อมการควบคุมอัตราการหยุด; 2) ตั้งค่าพูลโปรซีมือถือพร้อมเซสชันติดและคะแนน; 3) กำหนดนโยบายการพยายามคืน, circuit breaker และ poison queue; 4) รวบรวมเมตริกและการแจ้งเตือนทั่วถึง; 5) เก็บสแนปชอตดิบพร้อม Zstd และตารางที่เป็นมาตรฐานใน ClickHouse/Postgres; 6) สร้างหน้าต่างสำหรับการวิเคราะห์ผลิตภัณฑ์; 7) ทดสอบโหลดและปรับ RPS ตามชั่วโมง
หากคุณไม่มีพูลที่อยู่มือถือที่เสถียร เริ่มต้นด้วยผู้ให้บริการที่เชื่อถือได้เช่น MobileProxy.Space: ซิมการ์ดจริง, IP มากกว่า 218 ล้านรายการใน 53 ประเทศ, การหมุนเวียนตามเวลาและ API, การทดลองใช้งานฟรี 3 ชั่วโมงเพื่อให้เลือกรูปแบบที่ดีที่สุดและวัดความล่าช้าผ่านแผนที่ของพวกเขาและ Proxy Checker และอย่าลืมเกี่ยวกับรหัสโปรโมชั่น YOUTUBE20 — มันจะลดขั้นต่ำของการเข้าหาได้ดี นอกจากนี้ยังต้องการการเขียนโค้ดที่รอบคอบ, เมตริกที่โปร่งใส และการเคารพต่อแพลตฟอร์ม สิ่งนี้จะทำให้การเก็บข้อมูลล้านการ์ดในหนึ่งวันกลายเป็นเรื่องปกติสำหรับคุณ ไม่ใช่เรื่องที่ต้องพยายามทำ.