首先说明一下,测试用的这个URL需要开启魔法访问,不然页面加载的时候会有弹窗,系统是Win10,DrissionPage用的 4.1版。
我先是用DP库 控制鼠标,找到验证框点击,能够找到验证框,但验证失败。通过截图可以看到,虽然点击了验证你是真人,但是不给通过。
代码
from DrissionPage import Chromium, ChromiumOptions
options = ChromiumOptions()
options.headless(False)
options.incognito(True)
options.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36')
options.auto_port()
tab = Chromium(options).latest_tab
tab.get('https://ahrefs.com/backlink-checker/?input=baidu.com&mode=subdomains')
tab.wait(15) #设置一个合适的时间 等待 验证真人 加载
xpath ='x://*[@id="root"]/div[1]/section[1]/div/div/div/div/div/div[2]/div[2]/div[2]/form/div[1]/div/div'
div=tab.ele(xpath)
print(div)
iframe = div.shadow_root.ele('t:iframe')
print(iframe)
body = iframe.ele('t:body')
print(body)
title = iframe.ele('t:title').text
print(title)
ele = body.sr('t:input')
print(ele)
ele.click()
tab.get_screenshot(name='pic1.jpg')
tab.wait(2)
tab.get_screenshot(name='pic2.jpg')
input('Press any key to quit')
截图显示已经在正确的位置上完成点击动作
截图显示验证失败
既然DP控制鼠标点击不行,我就想到了pyautogui。先手动获取验证框的位置,然后将获取的验证框坐标填入,再次执行脚本,成功!这样过CF盾,算半自动?为什么会这样,哪位大神能解释一下。
代码
from DrissionPage import Chromium, ChromiumOptions
import pyautogui
import time
import random
def human_like_move(target_x, target_y, duration=1):
start_x, start_y = pyautogui.position()
print('鼠标起始位置:', start_x, start_y)
end_x, end_y = target_x, target_y
print('目标位置:', end_x, end_y)
points = [(start_x, start_y)]
num_points = int(duration * 10)
for i in range(1, num_points + 1):
t = i / num_points
ease_t = t * t * (3 - 2 * t)
point_x = start_x + (end_x - start_x) * ease_t
point_y = start_y + (end_y - start_y) * ease_t
point_x += random.gauss(0, 2)
point_y += random.gauss(0, 2)
points.append((point_x, point_y))
for point in points:
pyautogui.moveTo(point[0], point[1], duration=duration/num_points)
time.sleep(random.uniform(0.001, 0.003))
print('移动完成,当前位置:', pyautogui.position())
options = ChromiumOptions()
# options.headless(True)
options.incognito(True)
options.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36')
options.auto_port()
tab = Chromium(options).latest_tab
tab.get('https://ahrefs.com/backlink-checker/?input=baidu.com&mode=subdomains')
tab.wait(15)
# 获取当前鼠标位置, 用于第一次定位验证框,后面可以注释掉
j, k= pyautogui.position()
print(f"定位到鼠标位置: X: {j}, Y: {k}")
x, y = 567, 411 #这里要换成自己获得的验证框的坐标
human_like_move(x, y)
tab.wait(2)
print('点击')
pyautogui.click()
tab.get_screenshot(name='pic1.jpg')
tab.wait(2)
tab.get_screenshot(name='pic2.jpg')
input('Press any key to quit')
截图显示的是通过验证后的广告弹窗