QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 2030|回复: 0

[Python] 教你怎么用python批量登录带有验证码的网站

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2021-4-21 19:20:29 | 显示全部楼层 |阅读模式
一、介绍7 L, i4 b5 D+ X* k( W6 C
       原理为使用selenium驱动chorme打开一个新的进程并打开数组中的网址,之后程序自动输入我们事先填入的账号密码,通过已实现的验证码识别模块填写验证码进行登录。登陆完成后自动切换页面,进行下一个页面的登录
* V7 e8 Q2 d* M! i8 E& t二、准备
# A' T% L3 r7 m' c# s
  • 部署环境:win10
  • 开发环境:python2.7
  • chrome版本89.0.4389.128& f; |/ W7 |% |* }
三、实践% G) k7 e4 b# A% ~! [: H6 v3 x
3.1 下载驱动
. X  ?; f9 y  a6 ]! Q! U$ g
  • 设置查看chorme版本
  • 下载对应版本的chromedriver
  • 解压后,将chromedriver.exe分别放进chrome浏览器目录 和 Python根目录
  • chrome浏览器目录(如:C:\Program Files (x86)\Google\Chrome\Application)
  • Python根目录(如:D:\Python\Python37); V# X& J! t2 F  y2 y: A0 j
3.2 安装python依赖5 T7 R* e9 j4 k9 C
  • pip install pillow
  • pip install selenium
    # O# F$ V$ G/ x  H' Q
3.3 编写程序, u  ^" n6 r$ S6 b, x* k5 U
       batchlogin.py
" H. e3 D- T1 z$ V% B# h/ _
  1. #coding=UTF-8
  2. import time
  3. import os
  4. from selenium import webdriver
  5. from selenium.common.exceptions import NoAlertPresentException
  6. from pytesser import *
  7. from PIL import Image
  8. from PIL import ImageEnhance  
  9. from PIL import ImageFilter  
  10. import traceback
  11. threshold = 140  
  12. table = []  
  13. for i in range(256):  
  14.     if i < threshold:  
  15.         table.append(0)  
  16.     else:  
  17.         table.append(1)  
  18. rep={'O':'0',  
  19.     'I':'1','L':'1',  
  20.     'Z':'2',  
  21.     'S':'8'  
  22.     };  
  23. ## 灰度化照片后得到验证码
  24. def  getverify1(name):        
  25.     im = Image.open(name)  
  26.     # 转化到灰度图
  27.     imgry = im.convert('L')
  28.     # imgry.save('g'+name)  
  29.     # 二值化,采用阈值分割法,threshold为分割点
  30.     out = imgry.point(table,'1')  
  31.     # out.save('b'+name)  
  32.     # 识别
  33.     text = image_to_string(out)  
  34.     # 校正
  35.     text = text.strip()  
  36.     text = text.upper();   
  37.     for r in rep:  
  38.         text = text.replace(r,rep[r])   
  39.     # out.save(text+'.jpg')  
  40.     print text  
  41.     return text  
  42. # 获取浏览器当前的验证码图片并调用返回验证码
  43. def getVCode(driver):  
  44.     # 保存浏览器当前页面
  45.     driver.save_screenshot("page.png")
  46.     # 从页面中截取验证码(XPATH定位)
  47.     vcode = driver.find_element_by_xpath("//*[@id='randImage']")
  48.     # 获取验证码上下左右边界坐标(手动加减像素以更精确)
  49.     loc = vcode.location   
  50.     size = vcode.size
  51.     left = loc['x']+5
  52.     top = loc['y']
  53.     right = (loc['x'] +size['width']-5)
  54.     button = (loc['y']+size['height'])
  55.     # 截取页面中的验证码(进行截图:参数时一个元组(left,top,right,button)并保存
  56.     page_pic = Image.open('page.png')
  57.     v_code_pic = page_pic.crop((left,top,right,button))   
  58.     v_code_pic.save('yzm.png')   
  59.     return getverify1('yzm.png')
  60.     # return getverify1(v_code_pic)
  61. #自动登录操作(参数为登路账号,密码,webdriver驱动对象)
  62. def login(username,password,driver):
  63.     v_code = getVCode(driver)
  64.     driver.find_element_by_id('user_name').click() # 点击用户名输入框
  65.     driver.find_element_by_id('user_name').clear() # 清空输入框
  66.     driver.find_element_by_id('user_name').send_keys(username) # 自动敲入用户名
  67.    
  68.     driver.find_element_by_id('user_password').click() # 点击密码输入框
  69.     driver.find_element_by_id('user_password').clear() # 清空输入框
  70.     driver.find_element_by_id('user_password').send_keys(password) # 自动敲入密码
  71.     driver.find_element_by_id('v_code').click() # 点击验证码输入框
  72.     driver.find_element_by_id('v_code').clear() # 清空输入框
  73.     driver.find_element_by_id('v_code').send_keys(v_code) # 自动敲入验证码
  74.     driver.find_element_by_xpath('//*[@id="SubmitButton"]').click()
      open.py8 p* x0 U4 K% n/ t4 Z8 N; J
  1. #coding=UTF-8
  2. from selenium import webdriver
  3. from batchlogin import *
  4. driver = webdriver.Chrome()
  5. urls=[
  6.     'http://www.test.com:6086/QX_SPD_B2B/',
  7.         'http://www.test.com:6086/QX_SPD_B2B/'
  8. ]
  9. for i in range(0, len(urls)):
  10.     url = urls[i]
  11.     windows_open = "window.open('" + url + "')"
  12.     driver.execute_script(windows_open)
  13.     time.sleep(1)
  14.     #获取当前页面句柄
  15.     windows = driver.window_handles
  16.     driver.switch_to_window(windows[i+1])
  17.     login("USERNAME","PASSWORD",driver)
  18.     #cookies=driver.get_cookies()
  19.     #print(cookies)
  20.     ##解决页面加载不正确的问题
  21.     time.sleep(2)
  22. time.sleep(100)
  23. driver.close()
3.4 优化
6 L& y" n: a6 L7 ~# S. o# h+ D       在图片保存那块直接读取网站的图片并且不保存直接识别。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-22 00:32

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表