在使用Selenium写自动化爬虫时,遇到验证码是常事了。我在写爬取测试的时候,遇到了点击型的验证码,例如下图这种:
这种看似很简单,但是它居然卡爬虫?用简单的点触验证码的方法来做也没法实现
平常的点触的方法:
btn = driver.find_element_by_css_selector('.botton_')
btn.click()
这种方法失败后, 我决定要使用模拟鼠标点击的方法,通过pyautogui
库来实现。
pyautogui
可以模拟鼠标的慢加速、快到按钮时减速、缓慢停止等行为,以模仿人类点击按钮的方式。
简单的代码是这样的:
import pyautogui
pyautogui.moveTo(x=100, y=100)
pyautogui.click()
需要实现的逻辑是:
- 将网页放大到最大,就像点F11,这一步为了第二步可以获得正确的位置
- 定位到点触验证码点在网页上的位置
- 鼠标移动到该位置,并点击
- 如果想把页面还原
为了找到验证码的位置,我的实现的方法是这样的:
from selenium import webdriver
import pyautogui
import time
driver = webdriver.Chrome(options=option)time.sleep(3)
driver.maximize_window() # 最大化窗口
time.sleep(6)
current_position = pyautogui.position()
print(f"目标移动位置:X={xx}, Y={y}")
print(f"当前鼠标位置:X={current_position.x}, Y={current_position.y}")
这里是报出鼠标位置的方法,前提是在最大化窗口之后,我们把鼠标手动移动到目标的位置,例如:放在红色圈区域的位置这就能print出,在最大化页面下(一定要让页面最大化),要点击区域的绝对x轴和y轴的长度了,这样就能定位到目标的地方了。
driver.maximize_window() # 最大化窗口
sleep(3)
x=931
y=664
#pyautogui.moveTo(x, y)
#点击上面的位置
#pyautogui.restore() #调整会原来的大小
pyautogui.moveTo(x, y) #, duration=2, tween=pyautogui.linear
pyautogui.click()
sleep(3)#将页面缩小到成普通位置,以免占用电脑屏幕,这一步仅供参考
original_size = {'width': 800, 'height': 600}
driver.set_window_size(original_size['width'], original_size['height'])
sleep(3)
driver.refresh()#刷新
如果直接通过css_selector或者xpath的元素来点击验证按钮,无法通过验证的话,可以模拟鼠标点击的方法,这样更像模拟人类的行为。
注意,这种方法也只能是在,验证码出现的在一定时间内的,完成点击才不会被视为爬虫,所以在点击的时候,最好不要耽误太多时间在测试上。
当然如果有代理服务器的情况下做可能会更好。