python爬虫模拟登录之图片验证码实现详解

作者:start?field 时间:2022-06-30 00:07:29 

我们在用爬虫对门户网站进行模拟登录是总会有输入图片验证码的,例如这种

python爬虫模拟登录之图片验证码实现详解

那我们怎么解决这个问题实现全自动的模拟登录呢?只要思想不滑坡,办法总比困难多。我这里使用的是百度智能云里面的文字识别功能,每天好像可以免费使用个几百次,识别效果也还行,对一般人而言是够用了。

接下来说说,怎么使用。

首先,打开百度智能云(https://cloud.baidu.com/)进行登入,再进入人工智能->文字识别里创建应用。

python爬虫模拟登录之图片验证码实现详解

在使用名称和底下应用描述随便写写,然后点立即创建。 

python爬虫模拟登录之图片验证码实现详解

python爬虫模拟登录之图片验证码实现详解

 创建完成,就可以拿到 AppID 、API Key 、Secret Key

python爬虫模拟登录之图片验证码实现详解

之后要在pycharm下载baidu-aip,然后导入AipOcr包。

from aip import AipOcr? ? ? ?#aip在baidu-aip中

 再然后就是初始化百度API

#百度API
APP_ID = '你的之前拿到的AppID'
API_KEY = '你的之前拿到的API Key'
Secret_Key = '你的之前拿到的Secret Key'

我们先要把 图片验证码下载下来进行二值化处理,这样识别的准确率高一些。

这里要下载pillow库,然后导入Image包

from PIL import Image         #PIL在pillow库中
#图片处理
   # 二值化处理 灰度阈值设为127,高于这个值的点全部填白色
   img_old = Image.open('code.jpg')
   img_old = img_old.convert('L') # 灰度图 模式“L” 每个像素用8个bit表示,0表示黑,255表示白
   threshld = 127 #设置阈值,图片的像素范围(0,255)
   table = []
   for i in range(256):
       if i <threshld:
           table.append(0)
       else:
           table.append(1)
   img_old = img_old.point(table,'1') # 对图像像素操作 模式“1” 为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白
   img_old.save('code.jpg')

对于那些有干扰线,特别还是明暗交替的图片验证码来说,这样很好的避免了 * 扰。

这里的图片中没有太多干扰线且也没有明暗交替所以看起来不明显,只是想让大家看看对比。

处理前                                                                                                                       处理后

python爬虫模拟登录之图片验证码实现详解

python爬虫模拟登录之图片验证码实现详解

后面就是调用baidu_aip来读取图片中的内容。baidu_aip.handwriting

#读取处理后的验证码
   with open('code.jpg','rb') as fp:
       img_new = fp.read()
   baidu_aip = AipOcr(APP_ID,API_KEY,Secret_Key)
   result = baidu_aip.handwriting(img_new)   #使用的是识别手写文字,返回一个字典,其中words_result是一个列表,里面有识别结果也是一个字典
   print('验证码是:',result['words_result'][0]['words'])

 baidu_aip.handwriting这里面有很多识别文字的方法,我用的是识别手写文字,如果大家使用这个方法感觉效果不好可以选择其他方法。

最后是完整的代码。

# -- coding:UTF-8 --
import requests
from PIL import Image
from aip import AipOcr

if __name__ == "__main__":
   #百度API
   APP_ID = '你的之前拿到的AppID'
   API_KEY = '你的之前拿到的API Key'
   Secret_Key = '你的之前拿到的Secret Key'

headers = {
       "user-agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 97.0.4692.71Safari / 537.36Edg / 97.0.1072.55"
   }
   url = 'http://www.hyocr.com/captcha.php'
   #下载验证码图片
   session = requests.session()
   img_data = session.get(url=url,headers=headers).content
   with open('./code.jpg','wb') as fp:
       fp.write(img_data)
   #图片处理
   # 二值化处理 灰度阈值设为127,高于这个值的点全部填白色
   img_old = Image.open('code.jpg')
   img_old = img_old.convert('L') # 灰度图 模式“L” 每个像素用8个bit表示,0表示黑,255表示白
   threshld = 127 #设置阈值,图片的像素范围(0,255)
   table = []
   for i in range(256):
       if i <threshld:
           table.append(0)
       else:
           table.append(1)
   img_old = img_old.point(table,'1') # 对图像像素操作 模式“1” 为二值图像,非黑即白。但是它每个像素用8个bit表示,0表示黑,255表示白
   img_old.save('code.jpg')

#读取处理后的验证码
   with open('code.jpg','rb') as fp:
       img_new = fp.read()
   baidu_aip = AipOcr(APP_ID,API_KEY,Secret_Key)
   result = baidu_aip.handwriting(img_new)   #使用的是识别手写文字,返回一个字典,其中words_result是一个列表,里面有识别结果也是一个字典
   print('验证码是:',result['words_result'][0]['words'])

python爬虫模拟登录之图片验证码实现详解

这只是百度智能云里面的一个小功能,还有很多其他的功能,大家感兴趣可以去看看百度智能云里面的官方文档 ,还有视频教程。

来源:https://blog.csdn.net/qq_53221728/article/details/122964257

标签:python,爬虫,图片验证码
0
投稿

猜你喜欢

  • python分块读取大数据,避免内存不足的方法

    2022-09-30 13:05:17
  • 如何动态添加Form项?

    2009-11-18 20:44:00
  • Pygame 精准检测图像碰撞的问题

    2022-01-17 17:56:13
  • pandas 把数据写入txt文件每行固定写入一定数量的值方法

    2021-06-13 20:08:14
  • Python利用QQ邮箱发送邮件的实现方法(分享)

    2023-01-06 23:23:25
  • Python seek()和tell()函数的具体使用

    2023-12-07 20:59:39
  • Pytorch模型迁移和迁移学习,导入部分模型参数的操作

    2021-08-05 09:18:16
  • 非原型 不设计

    2010-01-21 12:51:00
  • python用for循环求和的方法总结

    2023-11-03 16:52:39
  • PHP引用的调用方法分析

    2023-11-06 15:23:23
  • Div即父容器不根据内容自适应高度的解决方法

    2010-04-23 18:19:00
  • Python Django2 model 查询介绍(条件、范围、模糊查询)

    2023-11-02 15:32:09
  • Pandas DataFrame操作数据增删查改

    2022-07-10 09:37:39
  • ASP 快速执行网页

    2020-07-07 11:14:17
  • python如何利用paramiko执行服务器命令

    2022-09-29 03:39:34
  • Python正则表达式re.sub()用法详解

    2022-05-29 14:30:01
  • JavaScript事件委托技术实例分析

    2023-07-01 01:18:23
  • Python中BeautifuSoup库的用法使用详解

    2023-11-19 04:52:48
  • asp程序运行速度测试

    2008-02-11 19:11:00
  • python区块链简易版交易完善挖矿奖励示例

    2023-02-26 20:02:11
  • asp之家 网络编程 m.aspxhome.com