先来讲述一下问题:
今天遇到了在爬虫时候使用超级鹰触控点击图片二维码的时候点击错位,位置不正确,经过不断尝试还是不行,最终找到解决办法
因为不解所以特意查阅了一下官方文档的介绍:
文档写着:基于左上角的方位坐标
原本我的selenium版本4.4.3在点击事件时候发现总是错误,要么不见了,要么点击不正确,如图情况
经过测试发现4.4.3的版本此功能是基于中间的,但具体是为什么我也不知道,变动了什么没有深入去理会,毕竟官方文档写着是基于左上角
解决办法:
最终还是没能查阅新版本的使用方法,只能尝试降版本看看,最终解决
先将目前版本删除:
点击终端输入以下安装命令:
pip install selenium==4.0
接着就能恢复左上角为基准
接着附上b站处理验证码登录代码:
代码:
import io
import time
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from chaojiying_Python.chaojiying import Chaojiying_Client
#创建驱动
def create_chrome_driver(*,headless = False):
options = webdriver.ChromeOptions()
if headless:
options.add_argument('--headless')
#伪装模拟器反爬去
options.add_experimental_option("excludeSwitches",['enable-automation'])
options.add_experimental_option("useAutomationExtension",False)
driver = webdriver.Chrome(options=options)
with open('./stealth.min.js') as f:
js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js
})
# driver.execute_cdp_cmd(
# 'Page.addScripToEvaluateOnNewDocument',
# {'source':'Object.defineProperty(navigator,"webdriver",{get:() => undefined})'}
# )
return driver
driver = create_chrome_driver()
driver.get('https://www.bilibili.com/')
driver.implicitly_wait(5)
time.sleep(1)#预留时间以防过快导致定位不到
driver.find_element(By.CLASS_NAME,"header-login-entry").click()#点击登录
# iframe = driver.find_element(By.TAG_NAME,"iframe")
# driver.switch_to.frame(iframe) #发现不需要切入iframe
driver.find_element(By.CLASS_NAME,"bili-mini-tab-message").click() #点击手机号形式登录
time.sleep(1)
driver.find_element(By.CLASS_NAME,'tel-input').send_keys("18802222345") #传入手机号
driver.find_element(By.CLASS_NAME,'text').click() #点击获取验证码
time.sleep(1)
auth = driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[6]')#定位验证码位置
location, size = auth.location, auth.size #获取定位和大小
print(location, size)
width, height = size['width'], size['height']-46 #减去底部
left, top, right, bottom = location['x'], location['y'], location['x'] + width, location['y'] + height
full_image = driver.get_screenshot_as_png() #截图验证码图片
image = Image.open(io.BytesIO(full_image)) #二进制可读写方式不保存文件形式
image.save("a.png") #保存来测试位置是否正确
images = image.crop((left*2, top*2, right*2, bottom*2)) #*2是因为mac系统
images.thumbnail((width,height)) #生成缩略图,同时因为mac系统大所以有时候需要,超级鹰有限制所以需要
#将图片保存为io可读写字节串形式 ---》最终以getvalue()去传入
buffer = io.BytesIO()
images.save(buffer,format='png')
images.show()
chaojiying = Chaojiying_Client('账号', '密码', 'ID') #用户中心>>软件ID 生成一个替换 96001 #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
location_click = chaojiying.PostPic(buffer.getvalue(), '9004')
print(location_click)
print(location_click['err_no'])
if location_click['err_no'] ==0:
ac = ActionChains(driver)
pic_str = location_click['pic_str']
pic = pic_str.split('|')
for loca_ac in pic:
x,y = map(int,loca_ac.split(','))
print(x,y)
ac.move_to_element_with_offset(auth,x,y).click()
time.sleep(0.5)
ac.perform()
else:
print("处理失败")
time.sleep(5)
driver.close()
效果:
文章来源:https://www.toymoban.com/news/detail-661179.html
文章来源地址https://www.toymoban.com/news/detail-661179.html
到了这里,关于selenium 4.3.3鼠标定位move_to_element_with_offset定位问题,超级鹰解决文字点击验证码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!