当前位置:   article > 正文

python爬虫验证码的处理(云打码)_云打码 错误上报 python

云打码 错误上报 python

爬虫开发过程中经常会遇到验证码,对于普通的非滑块验证码,首先要想办法把验证码图片保存到本地:用抓包工具抓包查看验证码图片的url,通过这个url把图片下载写到二进制文件。接下来对验证码的处理方法有三种:

  • 手动输入验证码
  • 接入打码平台
  • 更换ip绕过验证码 

先简要介绍一下如何接入打码平台实现自动打码。我选择的是云打码:http://www.yundama.com。注册成为开发者,找客服可以要到调试分用来调试,查看开发文档。

下载Python调用示例,文档结构如下:

打开YDMPython3.x.py查看源码(Python2调用示例对应的是YDMPython2.x.py):

  1. # -*- coding: cp936 -*-
  2. import sys
  3. import os
  4. from ctypes import *
  5. # 下载接口放目录 http://www.yundama.com/apidoc/YDM_SDK.html
  6. # 错误代码请查询 http://www.yundama.com/apidoc/YDM_ErrorCode.html
  7. # 所有函数请查询 http://www.yundama.com/apidoc
  8. print('>>>正在初始化...')
  9. YDMApi = windll.LoadLibrary('yundamaAPI')
  10. # 1. http://www.yundama.com/index/reg/developer 注册开发者账号
  11. # 2. http://www.yundama.com/developer/myapp 添加新软件
  12. # 3. 使用添加的软件ID和密钥进行开发,享受丰厚分成
  13. appId = 1 # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
  14. appKey = b'22cc5376925e9387a23cf797cb9ba745' # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
  15. print('软件ID:%d\r\n软件密钥:%s' % (appId, appKey))
  16. # 注意这里是普通会员账号,不是开发者账号,注册地址 http://www.yundama.com/index/reg/user
  17. # 开发者可以联系客服领取免费调试题分
  18. username = b'test'
  19. password = b'test'
  20. if username == b'test':
  21. exit('\r\n>>>请先设置用户名密码')
  22. ####################### 一键识别函数 YDM_EasyDecodeByPath #######################
  23. print('\r\n>>>正在一键识别...')
  24. # 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
  25. codetype = 1004
  26. # 分配30个字节存放识别结果
  27. result = c_char_p(b" ")
  28. # 识别超时时间 单位:秒
  29. timeout = 60
  30. # 验证码文件路径
  31. filename = b'getimage.jpg'
  32. # 一键识别函数,无需调用 YDM_SetAppInfo 和 YDM_Login,适合脚本调用
  33. captchaId = YDMApi.YDM_EasyDecodeByPath(username, password, appId, appKey, filename, codetype, timeout, result)
  34. print("一键识别:验证码ID:%d,识别结果:%s" % (captchaId, result.value))
  35. ################################################################################
  36. ########################## 普通识别函数 YDM_DecodeByPath #########################
  37. print('\r\n>>>正在登陆...')
  38. # 第一步:初始化云打码,只需调用一次即可
  39. YDMApi.YDM_SetAppInfo(appId, appKey)
  40. # 第二步:登陆云打码账号,只需调用一次即可
  41. uid = YDMApi.YDM_Login(username, password)
  42. if uid > 0:
  43. print('>>>正在获取余额...')
  44. # 查询账号余额,按需要调用
  45. balance = YDMApi.YDM_GetBalance(username, password)
  46. print('登陆成功,用户名:%s,剩余题分:%d' % (username, balance))
  47. print('\r\n>>>正在普通识别...')
  48. # 第三步:开始识别
  49. # 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
  50. codetype = 1004
  51. # 分配30个字节存放识别结果
  52. result = c_char_p(b" ")
  53. # 验证码文件路径
  54. filename = b'getimage.jpg'
  55. # 普通识别函数,需先调用 YDM_SetAppInfo 和 YDM_Login 初始化
  56. captchaId = YDMApi.YDM_DecodeByPath(filename, codetype, result)
  57. print("普通识别:验证码ID:%d,识别结果:%s" % (captchaId, result.value))
  58. else:
  59. print('登陆失败,错误代码:%d' % uid)
  60. ################################################################################
  61. print('\r\n>>>错误代码请查询 http://www.yundama.com/apidoc/YDM_ErrorCode.html')
  62. input('\r\n测试完成,按回车键结束...')

调用方法很简单,先加载dll库,然后调用一键识别函数即可,这段代码看起来很杂乱,我封装成函数以便调用,下面是我封装好的函数,删除了源码中普通识别函数的调用:

  1. from ctypes import *
  2. def ydm_func(ydm_appid, ydm_appkey, ydm_username, ydm_password, filename, captcha_type):
  3. """
  4. 封装的云打码函数
  5. """
  6. YDMApi = windll.LoadLibrary('yundamaAPI-x64')
  7. # 查询所有类型 http://www.yundama.com/price.html
  8. # 分配30个字节存放识别结果
  9. result = c_char_p(b" ")
  10. timeout = 10
  11. captchaId = YDMApi.YDM_EasyDecodeByPath(ydm_username, ydm_password, ydm_appid, ydm_appkey, filename, captcha_type,
  12. timeout, result)
  13. print("一键识别:验证码ID:%d,识别结果:%s" % (captchaId, result.value))
  14. return result.value

我的系统是64位的,故选择加载yundamaAPI-x64.dll这个库,识别完成返回验证码字符串。

使用示例如下,YDM_APPID,YDM_APPKEY,YDM_USERNAME,YDM_PASSWROD可以写入配置文件,方便管理。

 qr = ydm_func(YDM_APPID, YDM_APPKEY, YDM_USERNAME, YDM_PASSWORD, b'captcha.png',1004)

 

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

闽ICP备14008679号