selenium用法详解【从入门到实战】【Python爬虫】【4万字】_selenium实战

在这里插入图片描述



简介

Selenium 是最广泛使用的开源 Web UI用户界面自动化测试套件之一。Selenium 支持的语言包括C#JavaPerlPHPPython 和 Ruby。目前Selenium Web 驱动程序最受 Python 和 C#欢迎。 Selenium 测试脚本可以使用任何支持的编程语言进行编码并且可以直接在大多数现代 Web 浏览器中运行。在爬虫领域 selenium 同样是一把利器能够解决大部分的网页的反爬问题。下面就进入正式的 study 阶段。



selenium安装

打开 cmd输入下面命令进行安装。

pip install -i https://pypi.douban.com/simple selenium

执行后使用 pip show selenium 查看是否安装成功。



安装浏览器驱动

针对不同的浏览器需要安装不同的驱动。下面列举了常见的浏览器与对应的驱动程序下载链接部分网址需要 “科学上网” 才能打开哦dddd。

这里以安装 Chrome 驱动作为演示。但 Chrome 在用 selenium 进行自动化测试时还是有部分 bug 常规使用没什么问题但如果出现一些很少见的报错可以使用 Firefox 进行尝试毕竟是 selenium 官方推荐使用的。

确定浏览器版本

在新标签页输入 chrome://settings/ 进入设置界面然后选择 【关于 Chrome

查看自己的版本信息。这里我的版本是94这样在下载对应版本的 Chrome 驱动即可。
在这里插入图片描述

首先将点击登录后的页面进行截图然后定位到验证码的位置通过location()方法获取验证码左上角的坐标 size() 获取验证码的宽和高左上角坐标加上宽和高就是验证码右下角的坐标。获取坐标后就可以用**crop()**方法来进行裁剪然后将裁剪到的验证码图片保存。

此时虽然获取了验证码图片但是还不能直接提交给超级鹰。
因为超级鹰识别的验证码图片的宽和高有限制最好不超过 460px,310px
但是截取到的验证码图片宽高为 338px432px这时就要先将图片缩小一倍再提交即可等到收到坐标数据再将坐标乘2

def save_img():
    # 对当前页面进行截图保存
    driver.save_screenshot('page.png')
    # 定位验证码图片的位置
    code_img_ele = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div')
    # 获取验证码左上角的坐标x,y
    location = code_img_ele.location
    # 获取验证码图片对应的长和宽
    size = code_img_ele.size

    # 左上角和右下角的坐标
    rangle = (
        int(location['x'] * 1.25), int(location['y'] * 1.25), int((location['x'] + size['width']) * 1.25),
        int((location['y'] + size['height']) * 1.25)
    )

    i = Image.open('./page.png')
    code_img_name = './code.png'
    # crop根据rangle元组内的坐标进行裁剪
    frame = i.crop(rangle)
    frame.save(code_img_name)
    return code_img_ele

def narrow_img():
    # 缩小图片
    code = Image.open('./code.png')
    small_img = code.resize((169, 216))
    small_img.save('./small_img.png')
    print(code.size, small_img.size)

方法二、通过网页获取图片地址并保存

这种方法比上一种更加方便分析网页源码获取图片地址对该地址发送请求接收返回的二进制文件进行保存。首先打开网页源码找到图片地址。

请添加图片描述

图片地址是 img 标签的 src 属性值通过 xpath 得到地址直接对此 url 发送请求接收数据并保存即可。
注意由于获取的图片的高度仍然大于超级鹰标准格式所以也需要将图片缩小。

# 获取img标签的src属性值
img_url = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img').get_attribute('src')
headers = {
    'Users-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
}
# 获取图片二进制数据
img_data = requests.get(url=img_url, headers=headers).content
with open('./node1.png', 'wb')as fp:
    fp.write(img_data)
i = Image.open('./node1.png')
# 将图片缩小并保存设置宽为172高为192
small_img = i.resize((172, 192))
small_img.save('./small_img1.png')

使用超级鹰识别验证码

这部分没什么说的直接调用就行。

# 将验证码提交给超级鹰进行识别
chaojiying = Chaojiying_Client('用户名', '密码', '96001')  # 用户中心>>软件ID 生成一个替换 96001
im = open('small_img.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# 9004是验证码类型
print(chaojiying.PostPic(im, 9004)['pic_str'])
result = chaojiying.PostPic(im, 9004)['pic_str']

提取坐标数据动作链点击

超级鹰识别返回的数据格式是123,12 | 234,21 。我们可以将数据以 ' | ' 进行分割保存到列表中再以逗号分割将 xy 的坐标保存得到 [ [12312][23421] ] 这一格式然后遍历这一列表使用动作链对每一个列表元素对应的 x,y 指定的位置进行点击操作最后定位并点击确认登录成功。

all_list = []  # 要存储即将被点击的点的坐标  [[x1,y1],[x2,y2]]
if '|' in result:
    list_1 = result.split('|')
    count_1 = len(list_1)
    for i in range(count_1):
        xy_list = []
        x = int(list_1[i].split(',')[0])
        y = int(list_1[i].split(',')[1])
        xy_list.append(x)
        xy_list.append(y)
        all_list.append(xy_list)
else:
    x = int(result.split(',')[0])
    y = int(result.split(',')[1])
    xy_list = []
    xy_list.append(x)
    xy_list.append(y)
    all_list.append(xy_list)

# 遍历列表使用动作链对每一个列表元素对应的x,y指定的位置进行点击操作
# x,y坐标乘2和0.8是由于之前图片缩放过所以*20.8是因为本人电脑桌面缩放比例为125%需要还原成1
for l in all_list:
    x = l[0] * 2 * 0.8
    y = l[1] * 2 * 0.8
    # 将点击操作的参照物移动到指定的模块
    # 若用方法二获取的验证码图片要添加下面代码对code_img_ele赋值
    # code_img_ele = bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img')
    ActionChains(driver).move_to_element_with_offset(code_img_ele, x, y).click().perform()
    print('点击已完成')

# 完成动作链点击操作后定位确认按钮并点击
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a').click()

运行效果

由于验证码处理需要用到第三方平台外加设置了强制等待整体运行速度较慢。
请添加图片描述



❤️源码获取❤️

对于刚入门 Python 或是想要入门 Python 的小伙伴可以通过下方公众号联系作者 进入交流群一起交流学习都是从新手走过来的有时候一个简单的问题卡很久但可能别人的一点拨就会恍然大悟由衷的希望大家能够共同进步。另有整理的近千套简历模板几百册电子书等你来领取哦

也可以直接加本人微信备注【交流群】我拉你进Python交流群👇🏻

👇🏻 实战源码 可关注最下方 公众号卡片 回复 模拟登录B站 获取回复“666”入群👇🏻
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python