Python爬虫之selenium,有验证码模拟登录

本文介绍了如何使用Selenium进行自动化测试,包括安装必要的库,模拟登录网站,处理验证码(通过屏幕截图和第三方识别服务),并展示了完整的登录流程。重点强调了如何处理动态加载内容和验证码问题。

一. 前言

        在学习Selenium之前,通过request.get()或者.post(),很难获取网站所加载的动态数据,通过Selenium强大的自动化功能、多浏览器支持、跨平台支持等优点,让我轻松获取一些之前很难获取的数据,这次的案例也是结合之前的所学知识完成

二. 开始前提

        需要下载selenium,以及对应浏览器版本的驱动webdriver,PIL库,selenium,和PIL库都好下载,只需通过python内置的下载,打开python左上角的File里的

setting,进入project:你的项目名下的Python Interpreter

然后再点击那个小" + "号,在搜索需要下载的库就行了,点击Install Package进行下载

tips:pil如果不能下载,可能是pip的版本过低,控制台输入python -m pip install --upgrade pip即可

如果使用默认,是国外下载源下载太慢,点击Manage Repositories 在里边可以输入国内的下载源速度更快,我这里就分享一个国内的https://pypi.tuna.tsinghua.edu.cn/simple/

浏览器我使用的是谷歌的浏览器,尽量去根据浏览器驱动版本去下载对应的版本的浏览器,因为这谷歌的浏览器的自动更新版本实在太头疼,一更新就和驱动版本不对应,导致程序报错,建议就是避免下载最新版本的浏览器,可能会没有相应的驱动

2.1  114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件

三、模拟登陆网站

1.导库

from PIL import Image
from  selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from selenium.webdriver.common.by import By

2. 打开网站

# 配置选项
options = Options()

#模拟浏览器登录
options.add_experimental_option('detach',True)


# 实现规避检测
options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 初始化浏览器
driver = webdriver.Chrome(options=options)

# 使打开的屏幕最大化
driver.maximize_window()

# 打开网站
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')


四、验证码的处理

1.屏幕截图

        自己使用selenium进行自动化登录的难点还是在于验证码图片的如何获取保存?前期使用request.get()或者是driver.page_source都只能获取到请求之后的验证码图片,下载保存验证码图片早已刷新,跟在页面显示的验证码图片完全不一样,为了解决这个问题,可以使用selenium的屏幕截图的功能,在根据PIL库来对图形进行处理

# 获取页面宽度与高度
hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
h, w = driver.execute_script(hight), driver.execute_script(width)
print(w, h)

# 指定四个点的坐标,这里以左上角和右下角的坐标为例
# x1起始宽度到 x2最大宽度的距离
# y1起始高度到 y2最大高度的距离
x1, y1 = 790, 240 # 左上角坐标
x2, y2 = 870, 300  # 右下角坐标

# 获取整个页面截图
screenshot_path = 'screenshot.png'
driver.save_screenshot(screenshot_path)

这里的x,y需要具体根据验证码的页面位置来调节,也可以通过F12网页元素坐标,

在CONSOLE窗口中,输入document.getElementById('元素ID').getBoundingClientRect()

回车,即可查看在屏幕的位置;通过点击调试模式右上角的……。,选择“悬浮模式”,不影响实际的像素数

给出的具体数据也是仅供参考吧,实际截取的具体验证码的位置还得自己慢慢调节

2.保存截图

# 截取指定区域
im = Image.open(screenshot_path)
region = im.crop((x1, y1, x2, y2))

# 保存截图
cropped_path = 'result_screenshot.png'
region.save(cropped_path)

3.获取验证码

        如何获取图片的当中的验证码?根据自己或者人工肉眼来获取有点麻烦,那么就通过第三方验证码识别平台,这里我就推荐超级鹰,比起其他的使用方便快捷很多,关键是新手注册送1000积分,可以供自己测试很多次了,另外1000积分也只要1块,也是相当给力了

那么如何使用这个第三方平台呢?首先注册一个账号,让后下载python的语言Demo,把他解压在项目的文件夹中

将这个chaojiying.py剪切到当前目录就行,然后可以将文件的if __name__=="__main__"下边注释掉,复制到刚才编写的代码中,使用这个py文件,只需从外边导入就行

from chaojiying import Chaojiying_Client
if __name__ == '__main__':
    chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
    im = open('a.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print chaojiying.PostPic(im, 1902)												#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
    #print chaojiying.PostPic(base64_str, 1902)  #此处为传入 base64代码

根据使用说明填写自己账号和密码,以及软件id

另外需要把def PostPicf返回为 r.josn值改为,result['pic_str'],就是我截取到图片中的验证码的值

以及软件id在用户中心里面

4.模拟登录

最终我们只需要利用selenium的xpath获取标签的具体位置,然后填写我们获取的数据,就能够自动登录了

driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
driver.find_element(By.XPATH,'//*[@id="denglu"]').click()

print("登录成功!!!")

以下是完整代码,可以供你们参考

from PIL import Image
from  selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from selenium.webdriver.common.by import By
from chaojiying import Chaojiying_Client

# 配置选项
options = Options()
options.add_experimental_option('detach',True)

# 设置使用无头浏览器
# options.add_argument("--headless")

# 实现规避检测
options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 初始化浏览器
driver = webdriver.Chrome(options=options)
# 使打开的屏幕最大化
driver.maximize_window()
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')


# 获取页面宽度与高度
hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
h, w = driver.execute_script(hight), driver.execute_script(width)
print(w, h)

# 指定四个点的坐标,这里以左上角和右下角的坐标为例
# x1起始宽度到 x2最大宽度的距离
# y1起始高度到 y2最大高度的距离
x1, y1 = 790, 240 # 左上角坐标
x2, y2 = 870, 300  # 右下角坐标

# 获取整个页面截图
screenshot_path = 'screenshot.png'
driver.save_screenshot(screenshot_path)

# 截取指定区域
im = Image.open(screenshot_path)
region = im.crop((x1, y1, x2, y2))

# 保存截图
cropped_path = 'result_screenshot.png'
region.save(cropped_path)

chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
im = open('result_screenshot.png', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
img_code=chaojiying.PostPic(im, 1004)
print ("识别的验证码为"+img_code)


driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
driver.find_element(By.XPATH,'//*[@id="denglu"]').click()

print("登录成功!!!")

五.总结

        感兴趣的话还可以尝试以下其他的网站进行模拟自动登录,以后可以方便的进行各个软件的登录啦,Selenium真是一个强大的测试工具

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值