美文网首页爬虫
二十行代码!实现网站的验证码自动识别

二十行代码!实现网站的验证码自动识别

作者: 程序里的小仙女 | 来源:发表于2019-06-15 12:07 被阅读0次

一.
自己去chaojiying官网注册一个账号,购买相关的产品.

爬虫时候,自动识别需要登录的验证码,并实现自动登录,第一步使用超级鹰识别出网站的验证码

#!/usr/bin/env python
# coding:utf-8

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()

def main1(name):
    chaojiying = Chaojiying_Client("这里输入超级鹰的账号和密码,还有服务型号")  # 用户中心>>软件ID 生成一个替换 96001
    im = open(name, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    return  chaojiying.PostPic(im, 1902)  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()


if __name__ == '__main__':
    chaojiying = Chaojiying_Client('这里输入超级鹰的账号和密码,还有服务型号')  #用户中心>>软件ID 生成一个替换 96001
    im = open('a1.jpg', 'rb').read()         #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902))  #1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()


二.图片识别py程序
步骤:
1.打开chrome浏览器实现截图,这里使用到了

screenhot = browser.get_screenshot_as_png()

2.保存图片(这里可以使用两种方法)
第一种是:with open 'wb'二进制格式写入
第二种是: 使用pillow, 在PIL库中的Img.open方法


image.png

3.以上保存的是页面的整个屏幕截图,下一步是从大图中抠出小验证码,思路是确定验证码整个div的横纵坐标,得到验证码框.

image.png
  1. 使用超级鹰进行图片识别:
    这里的main1方法是调用超级鹰里面定义的main1
    result = main1('crop.png')
    print(result)

最后识别结果如下:


image.png

5.模拟登录
browser.close()

源码如下:仅供参考

from io import BytesIO
from  selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

from PIL import Image

from chaojiying import main1


def main():
    # 打开浏览器chrome实现截图
    url = 'http://bm.e21cn.com/log/login.aspx'
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser, 10)
    browser.get(url)

    #由于屏幕分辨率太小,导致截图不到验证码,需要拖拽屏幕

    # browser.execute_script('window.scrollTo(1000,2000)')

    screenhot = browser.get_screenshot_as_png()
    print(screenhot)
    # 1.保存大图 (使用with open)
    # with open('login_screen.png', 'wb') as f:
    #     f.write(screenhot)

    # 2.保存大使图(使用pillow)
    img = Image.open(BytesIO(screenhot))
    img.save('login1_screen.png')


    #再确定验证码的横纵坐标,再从大图中抠出小验证码
    input = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#imgCheckCode'))
    )
    location = input.location

    size = input.size
    #保存图片中x:578  y:196
    # location中 x:748 y:
    left = location['x']

    left_bottom = location['y']
    right = location['x'] + size['width']
    right_bottom = location['y'] + size['height']
    capchta = img.crop((left, left_bottom, right, right_bottom))
    capchta.save('crop.png')
    # print(capchta)

    #使用超级鹰进行图片识别
    result = main1('crop.png')
    print(result)



    #模拟登录
    browser.close()



if __name__ == '__main__':
    main()



---部分代码转载来自超级鹰官网,时注明超级鹰文档,仅供技术交流:

相关文章

网友评论

    本文标题:二十行代码!实现网站的验证码自动识别

    本文链接:https://www.haomeiwen.com/subject/jixbfctx.html