一:定位元素的坐标
当 Selenium 定位到元素后,如果想获取元素在页面中的具体坐标位置,可以通过 element.location 的方式来得到元素的起始坐标字典(元素的左上顶点)。然后再通过 element.size 的方式来获取该元素的宽度和高度。
在页面中只要获取元素的起始坐标,再将元素的宽度和高度进行相加就可以得到元素的结束坐标位置,这样就能够在页面中定位该元素的完整坐标位置了。
"""
获取百度logo图片的左上角坐标,宽高,右下角的坐标
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建浏览器对象(注意这个Chrome首字母大写)
driver = webdriver.Chrome()
# 发起请求
driver.get('https://www.baidu.com/')
time.sleep(1)
# 窗口最大化
driver.maximize_window()
# 定位到百度的logo
image_element = driver.find_element(By.ID, 's_lg_img')
# 获取左上角坐标
location = image_element.location # 结果是一个字典
print('百度logo图片左上角坐标:', location)
# 获取图片的宽高
img_size = image_element.size # 结果是一个字典
print('百度logo图片的宽高:', img_size)
# 获取图片右下角的坐标
# 右下角x轴: 左上角x轴 + 图片宽度
x = location['x'] + img_size['width']
# 右下角y轴:左上角y轴 + 图片高度
y = location['y'] + img_size['height']
print('百度logo图片右下角坐标:', x, y)
time.sleep(5)
二:滑动验证的解锁
验证码的分类
在登录账号的过程中很多网站都会对用户身份进行验证,也就是我们平常所看到的各种需要输入的验证操作等。
常见的验证方式如下:
点击按钮滑动解锁,拼图滑动解锁;
输入英文,数字,汉字的验证码;
点击图片,汉字,图标的点击验证;
动作链的介绍
滑动验证的操作是通过人类的行为来进行检查的方式。如果想通过程序来实现,就需要创建一个动作连来模拟人的行为。
动作链 | 使用介绍 |
---|---|
ActionChains | 创建动作链对象 |
click_and_hold | 点击并长按滑动块 |
move_by_offset | 滑动的目标位置 |
perform | 开始拖动滑动块 |
release | 松开选择的滑动块 |
测试网站:
https://www.helloweba.net/demo/2017/unlock/
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建一个浏览器对象
driver = webdriver.Chrome()
# 发送请求
driver.get('https://www.helloweba.net/demo/2017/unlock/')
# 1.定位滑动按钮
short_obj = driver.find_element(By.XPATH, '//div[@class="bar1bar"]/div[@class="slide-to-unlock-handle"]')
# 2.按住
# 创建一个动作链对象,参数就是浏览器对象
action_obj = webdriver.ActionChains(driver)
# 点击并且按住,参数就是定位的按钮
action_obj.click_and_hold(short_obj)
# 定位整条滑块
long_obj = driver.find_element(By.XPATH, '//div[@class="bar1bar"]/div[@class="slide-to-unlock-bg"]')
# 得到它的宽高
size = long_obj.size
width = size['width']
# 定位滑动坐标,其中width表示移动的宽度,0表示移动的高度,这里制作水平移动,不做垂直移动。
action_obj.move_by_offset(width, 0).perform()
# 4.松开滑动
action_obj.release()
time.sleep(3)
三:打码平台的介绍
打码平台是一种用于解决验证码,图像识别或文本识别等问题的在线服务平台。用户在注册账号等一些相关操作时会经常出现一些根据提示图片来手动输入或点击的操作。这样可以将需要识别的图片发送给打码平台进行识别处理,平台再将处理结果返回给请求方,以完成数据识别和处理的过程。
超级鹰就是一个这样的平台,它可以帮助我们解决验证码破解、图像识别、文本识别等难题。
官网链接:
https://www.chaojiying.com/
注:在超级鹰使用时首先需要注册账号,而且识别验证码功能会消耗积分,可以通过积分充值(价格较低)或绑定微信(赠送积分)获取积分。
具体费用参考价格体系:
https://www.chaojiying.com/price.html
在获取积分后,只需要创建一个软件 ID 就可以使用验证码的识别功能了。首选在网页左侧的最下方找到软件 ID 分类,点击进入分类后选择生成一个软件 ID,然后填入软件名称和软件说明并点击提交按钮。这样就会在软件 ID分类中显示刚刚创建的软件ID信息了。
在做好前面的准备工作之后,就可以开始使用超级鹰的验证码的识别功能。使用前需要先看一下超级鹰提供的开发文档,官方文档中有对应的使用教程和接口参数介绍。
四:登录案例的实现
超级鹰网站本身就是一个需要输入验证码才能登录的网站,所以这里我们选择超级鹰网站本身来做一个登录验证的案例。
超级鹰对传入的验证码图片有尺寸的要求,而且图片内容必须是识别验证码的部分,不能直接将整个网页截图传给超级鹰。所以我们需要先从网页中截图获取整个页面,然后使用图片裁切出验证码的部分单独保存,再将验证图片发送给超级鹰识别。
图片采集步骤:
- 使用save_screenshot()函数进行网页截图;
- 安装Pillow图片处理库,用读取网页的截图;
- 用Selenium获取网页中验证码的坐标位置;
- 对读取网页截图的图片对象调用crop()方法进行裁切;
- 将裁剪后的验证码图片单独保存;
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from day13.chaojiying import Chaojiying_Client # 导入超级鹰接口
# 1、创建浏览器对象
driver = webdriver.Chrome()
# 2、发送请求
driver.get('https://www.chaojiying.com/user/login/')
# 3、获取图片坐标
img_element = driver.find_element(By.XPATH, '//div[@class="login_form"]//img')
# 4、将定位的到的验证码图片元素进行截图保存
img_element.screenshot('验证码.png')
# 5、实例化超级鹰的类得到对象
chaojiying = Chaojiying_Client(
'xinyu666', # 用户名
'xinyu666*', # 密码
'951117' # 软件ID
)
# 6、读取验证码图片
image = open('验证码.png', 'rb').read()
# 7、使用超级鹰对象识别图片中的验证码
code = chaojiying.PostPic(image, 1902)['pic_str']
print(code)
# 定位账号输入框,并输入用户账号
driver.find_element(By.NAME, 'user').send_keys('xinyu666')
time.sleep(1)
# 定位密码输入框,并输入用户密码
driver.find_element(By.NAME, 'pass').send_keys('xinyu666*')
time.sleep(1)
# 定义验证码输入框,并输入验证码
driver.find_element(By.NAME, 'imgtxt').send_keys(code)
time.sleep(1)
# 定义登录按钮,并点击按钮登录账号
driver.find_element(By.CLASS_NAME, 'login_form_input_submit').click()
time.sleep(5)