https://github.com/ultrafunkamsterdam/undetected-chromedriver
แพทช์ Selenium Chromedriver ที่ปรับให้เหมาะสมซึ่งไม่เรียกใช้บริการต่อต้านบอทเช่น Distill Network / Imperva / DataDome / Botprotect.io ดาวน์โหลดไบนารีของไดรเวอร์โดยอัตโนมัติและทำการแก้ไข
pip install undetected-chromedriver
หรือหากคุณรู้สึกอยากผจญภัย ติดตั้งโดยตรงผ่าน GitHub
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
ฉันจะกำหนดขีดจำกัดในตัวติดตามปัญหา ถูกละเมิดมานานเกินไปแล้ว
มีข่าวดีไหม?
ใช่ ฉันได้เปิด Undetected-Discussions แล้ว ซึ่งฉันคิดว่าจะช่วยเราได้ดีขึ้นในระยะยาว
แพ็คเกจนี้ไม่ได้ และฉันขอย้ำอีกครั้งว่าไม่ได้ซ่อนที่อยู่ IP ของคุณ ดังนั้นเมื่อเรียกใช้จากศูนย์ข้อมูล (แม้จะเล็กกว่า) คุณก็มีโอกาสสูงที่จะไม่ผ่าน! นอกจากนี้หากชื่อเสียง IP ที่บ้านของคุณต่ำ คุณจะไม่ผ่าน!
เรียกใช้โค้ดต่อไปนี้จาก home และจากศูนย์ข้อมูล
import undetected_chromedriver as uc
driver = uc . Chrome ( headless = True , use_subprocess = False )
driver . get ( 'https://nowsecure.nl' )
driver . save_screenshot ( 'nowsecure.png' )
อัปเดตครั้งใหญ่! โปรดใช้ความระมัดระวังเนื่องจากอาจทำให้โค้ดของคุณเสียหายได้
เขียนกลไกป้องกันการตรวจจับใหม่แทนที่จะลบและเปลี่ยนชื่อตัวแปร เราแค่เก็บมันไว้ แต่ป้องกันไม่ให้ถูกฉีดเข้าไปตั้งแต่แรก สิ่งนี้จะทำให้เราปลอดภัยจากการตรวจจับอย่างน้อยก็ในอนาคตอันใกล้นี้
เขียนการตั้งชื่อไฟล์ใหม่ เพื่อป้องกันไม่ให้ลงท้ายด้วย {randomstring`chromedriver.exe 1,000 รายการ แทนที่จะเรียกว่า undetected_chromedriver.exe
การล้างข้อมูลจะลบไฟล์ compat, v2 และโฟลเดอร์ทดสอบ
เพิ่มเมธอด WebElement.click_safe() ซึ่งคุณสามารถลองได้ในกรณีที่คุณถูกตรวจพบหลังจากคลิกลิงก์ ไม่รับประกันว่าจะใช้งานได้
เพิ่ม WebElement.children(self, tag=None, recursive=False) เพื่อรับ/ค้นหาโหนดย่อยได้อย่างง่ายดาย ตัวอย่าง:
body = driver.find_element('tag name', 'body')
# get the 6th child (any tag) of body, and grab all img's within (recursive).
images = body.children()[6].children('img', True)
srcs = list(map(lambda _:_.attrs.get('src'), images))
เพิ่ม example.py ซึ่งฉันสามารถชี้ให้ผู้อื่นทราบเมื่อถามคำถามไร้สาระ (ไม่ จริงๆ แล้วค่อนข้างเจ๋ง ทุกคนควรเห็น)
เพิ่มการรองรับแพลตฟอร์มแลมบ์ดา
เพิ่มการรองรับสำหรับ x86_32
เพิ่มการรองรับระบบการรายงานเป็น linux2
การปรับโครงสร้างใหม่บางส่วน
use_subprocess มีค่าเริ่มต้นเป็น True มีคนมากเกินไปไม่เข้าใจการประมวลผลหลายตัวและ name == ' main และหลังจากการทดสอบดูเหมือนว่าจะไม่สร้างความแตกต่างอีกต่อไปใน chrome 104+
เพิ่ม no_sandbox ซึ่งมีค่าเริ่มต้นเป็น True และไม่มีแถบ "คุณกำลังใช้บรรทัดคำสั่งที่ไม่ปลอดภัย ... " ที่น่ารำคาญ
อัพเดตอิมเมจนักเทียบท่า ตอนนี้คุณสามารถ vnc หรือ rdp ลงในคอนเทนเนอร์ของคุณเพื่อดูหน้าต่างเบราว์เซอร์จริงได้
แน่นอนว่าโหมด "ปกติ" ก็ใช้งานได้เช่นกัน
เวอร์ชันนี้ might
ทำให้โค้ดของคุณพัง ทดสอบก่อนอัปเดต!
เพิ่มตรรกะการป้องกันการตรวจจับใหม่!
v2 กลายเป็นโมดูลหลักแล้ว ดังนั้นจึงไม่จำเป็นต้องอ้างอิงถึง v2 อีกต่อไป นี่หมายความว่าตอนนี้คุณสามารถใช้:
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' )
สำหรับความเข้ากันได้แบบย้อนหลัง v2 จะไม่ถูกลบออก แต่เป็นนามแฝงของโมดูลหลัก
แก้ไข "หน้าจอต้อนรับ" ที่จู้จี้บนระบบปฏิบัติการที่ไม่ใช่ Windows สำหรับนักลัทธิคลั่งไคล้ที่ ❤ ยินดีต้อนรับหน้าจอและป้อนข้อมูลเพิ่มเติมให้กับ Google ให้ใช้ Chrome(suppress_welcome=False)
แทนที่ executable_path
ในตัวสร้างเพื่อสนับสนุน browser_executable_path
ซึ่งไม่ควรใช้เว้นแต่คุณจะเป็นกรณีขอบ (ใช่แล้วคุณเป็น) ที่ไม่สามารถเพิ่มโฟลเดอร์การติดตั้ง Chrome ที่คุณกำหนดเองลงในตัวแปรสภาพแวดล้อม PATH ของคุณหรือมีกองทัพของเบราว์เซอร์ / เวอร์ชันที่แตกต่างกัน และการค้นหาอัตโนมัติส่งคืนเบราว์เซอร์ที่ไม่ถูกต้อง
"v1" (?) ย้ายไปที่ _compat แล้ว
เวอร์ชันการพึ่งพาคงที่
การจัดการแบบกำหนดเองของ ChromeOptions ถูกลบออก ดังนั้นจึงเข้ากันได้กับ webdriver.chromium.options.ChromiumOptions
ลบ Chrome.get() fu และคืนค่ากลับไปเป็นต้นฉบับ "เกือบ":
with
ไม่จำเป็นต้องใช้คำสั่งอีกต่อไป แม้ว่าจะยังคงใช้งานได้เพื่อความเข้ากันได้แบบย้อนหลังก็ตามทดสอบความสำเร็จจนถึงปัจจุบัน: 100%
แค่จะพูดถึงอีกครั้ง เนื่องจากบางคนอ่านยาก: หัวขาดก็ยังเป็น WIP การหยิบประเด็นขึ้นมาก็ไม่จำเป็น
เปลี่ยนพฤติกรรมการสร้างกระบวนการให้แยกออกอย่างสมบูรณ์
เปลี่ยนวิธีการ .get(url) เพื่อใช้ตัวจัดการบริบทเสมอ
เปลี่ยนวิธีการ .get (url) เพื่อใช้ cdp ภายใต้ประทุน
... คำสั่ง with
ไม่จำเป็นอีกต่อไป ..
สิ่งที่ต้องทำ: ทำงานไปสู่ความไม่ตรงกันและซีลีเนียม 4
เมื่อใดก็ตามที่คุณพบกับความหวาดกลัว
from session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
วิธีแก้ปัญหานั้นง่าย:
import undetected_chromedriver as uc
driver = uc . Chrome ( version_main = 95 )
กรกฎาคม 2021: ขณะนี้ยุ่งอยู่กับการติดตั้งซีลีเนียม 4 สำหรับ Chromedriver ที่ตรวจไม่พบ
ข่าวด่วน: #255
เพื่อป้องกันการดึงผมโดยไม่จำเป็นและก่อให้เกิดปัญหา โปรดคำนึงถึง ข้อความสำคัญที่อยู่ท้ายเอกสารนี้
นี่คือทั้งหมดที่คุณต้องทำ มีการตั้งค่ารวมอยู่ด้วยและพบปฏิบัติการเบราว์เซอร์ของคุณโดยอัตโนมัติ นี่เป็นตัวอย่างข้อมูลที่ฉันแนะนำให้ใช้ในกรณีที่คุณประสบปัญหา
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
นี่คือทั้งหมดที่คุณต้องทำ หากไม่มีโฟลเดอร์ที่ระบุ โปรไฟล์ใหม่จะถูกสร้างขึ้น dirs ข้อมูลที่ระบุเช่นนี้จะไม่ถูกลบอัตโนมัติเมื่อออก
import undetected_chromedriver as uc
options = uc . ChromeOptions ()
# setting profile
options . user_data_dir = "c: \ temp \ profile"
# use specific (older) version
driver = uc . Chrome (
options = options , version_main = 94
) # version_main allows to specify your chrome version instead of following chrome global version
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
นี่คือทั้งหมดที่คุณต้องทำ ตอนนี้คุณสามารถฟังและสมัครรับ devtools-protocol ระดับต่ำได้แล้ว ฉันเพิ่งพบว่ามีการวางแผนสำหรับการเปิดตัว Chromedriver อย่างเป็นทางการในอนาคตด้วย อย่างไรก็ตาม ตอนนี้ฉันใช้งานของตัวเองแล้ว เนื่องจากฉันต้องการมันเองเพื่อการสืบสวน