คำตอบด่วน
ฉันจะใช้พร็อกซีพร้อมชื่อผู้ใช้และรหัสผ่านใน Selenium ได้อย่างไร?
รันโปรแกรมแปลงสัญญาณท้องถิ่นตัวเล็ก ๆ ที่เพิ่มเฮดเดอร์ Proxy-Authorization แล้วชี้ Chrome ให้ใช้ --proxy-server=http://127.0.0.1:8899 Chrome จะไม่สนใจข้อมูลรับรองในแฟล็กนั้น และ Selenium ไม่มีทางเลือกแบบพกพาสำหรับรหัสผ่านพร็อกซี พร็อกซีเรซิเดนเชียล CrawlRelay ทำงานแบบนี้บน gw.crawlrelay.com:7777 จาก US$0.50/GB จ่ายด้วยคริปโต พร้อมไม่ต้อง KYC
การตั้งค่า Selenium ในภาพรวม
| ทำไมต้องมีตัวแปลงสัญญาณ | แฟล็ก --proxy-server ของ Chrome รับไม่ได้ทั้งชื่อผู้ใช้และรหัสผ่าน |
|---|---|
| ตัวแปลงสัญญาณ | ฟังที่ 127.0.0.1:8899, เพิ่ม Proxy-Authorization, ส่งต่อไปที่ gw.crawlrelay.com:7777 |
| ตัวเลือกของ Chrome | --proxy-server=http://127.0.0.1:8899 |
| การหมุนเวียน | ทุกการเชื่อมต่อ CONNECT ใหม่คือการเชื่อมต่อใหม่ ดังนั้นโดยปกติจะมีทางออกใหม่; เพิ่ม ID เซสชันสำหรับ IP เดียว |
| ทางเลือกที่ง่ายกว่า | Playwright รับชื่อผู้ใช้และรหัสผ่านโดยตรง |
พร็อกซีเรซิเดนเชียลในเครื่องทำงานอย่างไร?
มันรับคำขอพร็อกซีจากเบราว์เซอร์ แทรก header หนึ่งอันที่มีข้อมูลรับรองของคุณ และก็ส่งข้อมูลในสองทาง สำหรับเว็บไซต์ HTTPS เบราว์เซอร์จะส่ง CONNECT host:443, gateway ตอบกลับ 200 Connection established แล้ว TLS ก็ทำงานแบบ end to end ระหว่าง Chrome และเว็บไซต์นั้น forwarder จะไม่เห็นเนื้อหาหน้าเว็บในรูปแบบข้อความปกติ
เวอร์ชันนี้แบบมินิมอลรองรับเว็บไซต์ HTTPS ที่การเชื่อมต่อนั้นมีท่อ CONNECT หนึ่งอัน ครอบคลุมเกือบทุกเว็บไซต์ในปัจจุบัน ให้ผูกไว้กับ 127.0.0.1 เพื่อไม่มีเครื่องอื่นใช้ข้อมูลรับรองของคุณได้
import asyncio
import base64
import os
UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())
async def pipe(reader, writer):
try:
while True:
data = await reader.read(65536)
if not data:
break
writer.write(data)
await writer.drain()
except ConnectionError:
pass
finally:
writer.close()
async def handle(client_reader, client_writer):
try:
head = await client_reader.readuntil(b"\r\n\r\n") # request line and headers from the browser
except asyncio.IncompleteReadError:
client_writer.close()
return
lines = head.split(b"\r\n")
lines.insert(1, AUTH) # add the credentials right after the request line
up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
up_writer.write(b"\r\n".join(lines))
await up_writer.drain()
await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))
async def main():
server = await asyncio.start_server(handle, "127.0.0.1", 8899)
async with server:
await server.serve_forever()
if __name__ == "__main__":
asyncio.run(main())ฉันจะตั้งค่า Selenium ให้ใช้พร็อกซีเรซิเดนเชียลนี้อย่างไร?
สตาร์ท forwarder.py ในเทอร์มินัลหนึ่ง จากนั้นรันสคริปต์ Selenium ของคุณโดยใช้ที่อยู่พร็อกซีในเครื่อง Selenium Manager ที่ฝังอยู่ใน Selenium 4.6 ขึ้นไปจะดาวน์โหลด ChromeDriver ที่ตรงกันให้เอง ไม่ต้องติดตั้งอะไรเพิ่ม
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899") # the local forwarder
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
try:
driver.set_page_load_timeout(60)
driver.get("https://api.ipify.org")
print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
driver.quit()ฉันจะขอ IP คนละตัวสำหรับแต่ละเซสชัน Selenium หรือ IP ใหม่ทุกหน้าได้อย่างไร?
พร็อกซีเรซิเดนเชียลส่งชื่อผู้ใช้ที่คุณให้มา พฤติกรรมเซสชันขึ้นกับชื่อผู้ใช้นั้น:
- สลับเปลี่ยนตามการเชื่อมต่อ: ไม่ใส่พาร์ทเซสชัน (
USERNAME-country-us) Chrome เปิดการเชื่อมต่อหลายอันต่อหน้าเพจ จะโหลดผ่าน IP หลายตัวได้ในหน้าเดียว - หนึ่ง IP ต่อเซสชัน Selenium: ตั้งค่า
CRAWLRELAY_USERเป็นUSERNAME-country-us-session-run42-ttl-30ก่อนสตาร์ท forwarder ทุกการเชื่อมต่อจะออกผ่าน IP เดิมสูงสุด 30 นาที IP อาจเปลี่ยนก่อนหน้านั้น - หลายเซสชันพร้อมกัน: รัน forwarder หนึ่งตัวต่อเซสชันที่พอร์ตในเครื่องแตกต่าง เช่น 8899 กับ 8900 แล้วให้ WebDriver แต่ละตัวใช้พอร์ตของตัวเอง
แล้ว selenium-wire หรือส่วนขยายเบราว์เซอร์ล่ะ?
selenium-wire แพ็กเกจยอดนิยมที่เพิ่มการพิสูจน์ตัวตนพร็อกซีโดยดักจับทราฟฟิก ถูกผู้เขียนเลิกพัฒนาและอัปเดตตั้งแต่ มกราคม 2024 ส่วนขยายเบราว์เซอร์ที่ตอบรับการพิสูจน์ตัวตนพร็อกซีก็ใช้ได้ แต่ต้องแพ็กเกจและโหลดเข้าโปรไฟล์แต่ละอัน Forwarder ข้างต้นไม่มีไลบรารีพึ่งพาและใช้ได้กับเบราว์เซอร์ทุกตัวที่ Selenium ควบคุม สำหรับโปรเจ็กต์ใหม่ Playwright ง่ายกว่ามาก: รับชื่อผู้ใช้และรหัสผ่านพร็อกซีโดยตรง
คำถามเกี่ยวกับ Selenium และพร็อกซี
ทำไม Chrome ถึงขึ้นหน้าต่างล็อกอินพร็อกซีใน Selenium?
เพราะพร็อกซีขอข้อมูลรับรองแต่ Chrome ไม่มี: ธง --proxy-server รับแค่ host กับ port เท่านั้น ในโหมด headless ก็เป็นปัญหาเดียวกันที่ ERR_TUNNEL_CONNECTION_FAILED ใช้ forwarder ในเครื่องที่เติมข้อมูลรับรอง หรือใช้ Playwright ที่รับชื่อผู้ใช้และรหัสผ่านได้เลย
พร็อกซีเรซิเดนเชียลนี้ทำให้การขูดข้อมูลช้าลงไหม?
แทบจะไม่เลย มันก็แค่คัดลอกข้อมูลระหว่างซ็อกเก็ตสองฝั่งในเครื่องกับซ็อกเก็ตภายนอก โดยไม่ถอดรหัสเวลาโหลดหน้าเว็บขึ้นกับพร็อกซีเรซิเดนเชียลที่ออกและเว็บไซต์ที่เป้าหมาย ไม่เกี่ยวกับ forwarder ที่รันในเครื่องเดียวกัน
ฉันจะใช้ Firefox แทน Chrome ใน Selenium ได้ไหม?
ได้ ตั้งค่าพร็อกซี่ของ Firefox ผ่าน FirefoxOptions: network.proxy.type เป็น 1 และ network.proxy.http กับ network.proxy.ssl เป็น 127.0.0.1 ที่พอร์ต 8899 ให้ forwarder ทำงานข้างหน้า เพราะ Firefox จะถามข้อมูลรับรองพร็อกซีในกล่องโต้ตอบที่ Selenium เติมไม่ได้แม่นยำ
รหัสผ่านของฉันปลอดภัยใน forwarder ไหม?
ยังอยู่ในเครื่องคุณตราบใดที่ forwarder ฟังพอร์ต 127.0.0.1 ตามตัวอย่าง แนะนำให้อ่านจากตัวแปรแวดล้อม ไม่ควรเก็บในที่เก็บโค้ด และใช้ซับยูเซอร์แยกแต่ละ scraper พร้อมจำกัดปริมาณทราฟฟิก เพื่อป้องกันรหัสผ่านรั่วไหลกระทบแผนใช้งานทั้งหมด
ให้ Selenium ใช้พร็อกซีเรซิเดนเชียลเป็นทางออก
US$1.50 สำหรับ 1 GB เพื่อทดสอบ, US$0.50/GB จาก 50 GB.