当前位置:   article > 正文

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

python 验证码 模拟登录

一. 前言

        在学习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.导库

  1. from PIL import Image
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.options import Options
  4. from time import sleep
  5. from selenium.webdriver.common.by import By
'
运行

2. 打开网站

  1. # 配置选项
  2. options = Options()
  3. #模拟浏览器登录
  4. options.add_experimental_option('detach',True)
  5. # 实现规避检测
  6. options.add_experimental_option('excludeSwitches', ['enable-automation'])
  7. # 初始化浏览器
  8. driver = webdriver.Chrome(options=options)
  9. # 使打开的屏幕最大化
  10. driver.maximize_window()
  11. # 打开网站
  12. 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库来对图形进行处理

  1. # 获取页面宽度与高度
  2. hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
  3. h, w = driver.execute_script(hight), driver.execute_script(width)
  4. print(w, h)
  5. # 指定四个点的坐标,这里以左上角和右下角的坐标为例
  6. # x1起始宽度到 x2最大宽度的距离
  7. # y1起始高度到 y2最大高度的距离
  8. x1, y1 = 790, 240 # 左上角坐标
  9. x2, y2 = 870, 300 # 右下角坐标
  10. # 获取整个页面截图
  11. screenshot_path = 'screenshot.png'
  12. driver.save_screenshot(screenshot_path)

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

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

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

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

2.保存截图

  1. # 截取指定区域
  2. im = Image.open(screenshot_path)
  3. region = im.crop((x1, y1, x2, y2))
  4. # 保存截图
  5. cropped_path = 'result_screenshot.png'
  6. region.save(cropped_path)

3.获取验证码

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

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

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

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

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

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

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

4.模拟登录

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

  1. driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
  2. driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
  3. driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
  4. driver.find_element(By.XPATH,'//*[@id="denglu"]').click()
  5. print("登录成功!!!")

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

  1. from PIL import Image
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.options import Options
  4. from time import sleep
  5. from selenium.webdriver.common.by import By
  6. from chaojiying import Chaojiying_Client
  7. # 配置选项
  8. options = Options()
  9. options.add_experimental_option('detach',True)
  10. # 设置使用无头浏览器
  11. # options.add_argument("--headless")
  12. # 实现规避检测
  13. options.add_experimental_option('excludeSwitches', ['enable-automation'])
  14. # 初始化浏览器
  15. driver = webdriver.Chrome(options=options)
  16. # 使打开的屏幕最大化
  17. driver.maximize_window()
  18. driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
  19. # 获取页面宽度与高度
  20. hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
  21. h, w = driver.execute_script(hight), driver.execute_script(width)
  22. print(w, h)
  23. # 指定四个点的坐标,这里以左上角和右下角的坐标为例
  24. # x1起始宽度到 x2最大宽度的距离
  25. # y1起始高度到 y2最大高度的距离
  26. x1, y1 = 790, 240 # 左上角坐标
  27. x2, y2 = 870, 300 # 右下角坐标
  28. # 获取整个页面截图
  29. screenshot_path = 'screenshot.png'
  30. driver.save_screenshot(screenshot_path)
  31. # 截取指定区域
  32. im = Image.open(screenshot_path)
  33. region = im.crop((x1, y1, x2, y2))
  34. # 保存截图
  35. cropped_path = 'result_screenshot.png'
  36. region.save(cropped_path)
  37. chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
  38. im = open('result_screenshot.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  39. img_code=chaojiying.PostPic(im, 1004)
  40. print ("识别的验证码为"+img_code)
  41. driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
  42. driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
  43. driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
  44. driver.find_element(By.XPATH,'//*[@id="denglu"]').click()
  45. print("登录成功!!!")

五.总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/801871
推荐阅读
相关标签
  

闽ICP备14008679号