当前位置: 代码网 > it编程>前端脚本>Python > Python爬虫之selenium,有验证码模拟登录

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

2024年08月02日 Python 我要评论
在学习Selenium之前,通过request.get()或者.post(),很难获取网站所加载的动态数据,通过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真是一个强大的测试工具

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com