python爬虫selenium登陆-破解验证码

验证码目前最常见的有两种
一种是图片验证码
另一种是滑块验证码
本篇博客主要用来破解图片验证码

博主是大数据专业大二学生,如果有纰漏望各位大佬指正
本篇文章使用打码平台(超级鹰)对登陆验证码进行破解,
目的-使用自动化selenium框架输入 用户名 密码 验证码 之后点击登陆。
在这里插入图片描述
在这里插入图片描述

一、准备
1.下载pillow用来保存和处理图片

pip install pillow

2下载超级鹰网页源码(为之后的破解做解析使用)

在这里插入图片描述
在这里插入图片描述
超级鹰给的脚本代码有些小问题正确代码如下

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


if __name__ == '__main__':
        chaojiying = Chaojiying_Client('username', 'password', '96001')	#用户中心>>软件ID 生成一个替换 96001
        im = open('D:/爬虫/chaojiying_Python/a.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        print (chaojiying.PostPic(im, 1902)['pic_str'])												#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()

二、思路
1、首先使用selenium框架打开登陆界面,截取页面屏幕并保存
2、将保存的图片通过选取像素左上右下的方式截取到验证码的照片并保存。
3、通过超级鹰破解源码对验证码图片进行破解并提取出图片中的数字或者字母
4.通过定位xpath的方式输入用户名 密码 验证码 最后点击登陆
5.selenium模拟登陆

三、截取图片中验证码的位置(通过像素方式截取)
(一、)首先通过selenium框架将超级鹰页面截取代码实现如下

from selenium import webdriver
screen = './screen.png'
node = './node.png'
def get_picture(driver):
    driver.get('https://www.chaojiying.com/user/login')
    driver.save_screenshot('./screen.png') #保存页面到''./screen.png''
if __name__ == '__main__':
    #如果想自动化测试不打开网页可以使用如下代码
    option = webdriver.ChromeOptions()
    option.add_argument("headless")
    driver = webdriver.Chrome(chrome_options=option)
    get_picture(driver)

(二、)在根目录下获取到照片之后通过画图方式打开即可获取左上和右下的像素。
在这里插入图片描述
我获取的像素为
(1003,438,1271,511)

四、通过代码实现保存截取后的验证码图片

def cut_picture(src,noice,api): #api表示像素 src表示截取的整个界面的图片 noice表示将截取后的验证码图片的位置
    #打开截取的页面
    img = Image.open(src)
    #打开后截取从左上到右下的图片
    img_new = img.crop(api)
    #保存验证码截图
    img_new.save(noice)

五、解析验证码-对验证码的内容进行识别

def rectangle(noice):
    chaojiying = Chaojiying_Client('user', 'password', '96001')  # 用户中心>>软件ID 生成一个替换 96001
    im = open(noice, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    return chaojiying.PostPic(im, 1902)['pic_str']

小编这里就不将超级鹰的账号和密码公开了 哈哈。大家做实验在官网充值一元钱即可。

六、通过xpath定位模拟登陆超级鹰

def login(driver,username,passwd,yzm):
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys(username)
    time.sleep(2)
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys(passwd)
    time.sleep(2)
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(yzm)
    time.sleep(2)
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()
    time.sleep(2)
    if driver.title=='登录超级鹰用户中心':
        return False
    else:
        return True

一定要在登陆末尾加入 if–else判断欧 主要是为主函数退出循环做铺垫,不然谷歌浏览器会一直打开。

七、主代码实现

from PIL import Image
import time
from chaojiying_Python.chaojiying import Chaojiying_Client
from selenium import webdriver
screen = './screen.png'
node = './node.png'
def get_picture(driver):
    driver.get('https://www.chaojiying.com/user/login')
    driver.save_screenshot('./screen.png') #保存页面到''./screen.png''
#截取页面
# (1003,438,1271,511)
def cut_picture(src,noice,api): #api表示像素 src表示截取的整个界面的图片 noice表示将截取后的验证码图片的位置
    #打开截取的页面
    img = Image.open(src)
    #打开后截取从左上到右下的图片
    img_new = img.crop(api)
    #保存验证码截图
    img_new.save(noice)
# #开始识别
def rectangle(noice):
    chaojiying = Chaojiying_Client('user', 'password', '96001')  # 用户中心>>软件ID 生成一个替换 96001
    im = open(noice, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    return chaojiying.PostPic(im, 1902)['pic_str']
def login(driver,username,passwd,yzm):
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys(username)
    time.sleep(2)
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys(passwd)
    time.sleep(2)
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(yzm)
    time.sleep(2)
    driver.find_element_by_xpath('/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()
    time.sleep(2)
    if driver.title=='登录超级鹰用户中心':
        return False
    else:
        return True
def main():
        driver = webdriver.Chrome()
        while True:
            #保存全图图片
            get_picture(driver)
            #截取验证码图片
            api = (1003,438,1271,511)
            cut_picture(screen,node,api)
            yzm = rectangle(node)
            #登陆
            ret=login(driver,'user','root',yzm)
            if ret:
                print('登陆成功')
                print(driver.page_source)
                break
            else:
                print("登陆失败")
if __name__ == '__main__':
    #如果想自动化测试不打开网页可以使用如下代码
    option = webdriver.ChromeOptions()
    option.add_argument("headless")
    driver = webdriver.Chrome(chrome_options=option)
    get_picture(driver)

user和root一定要修改成自己的账号和密码。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值