• 售前

  • 售后

热门帖子
入门百科

python爬虫怎样办理图片验证码

[复制链接]
意乱了真假意wk 显示全部楼层 发表于 2021-10-25 19:07:52 |阅读模式 打印 上一主题 下一主题
之前刚开始做爬虫的时候碰到过登录验证码题目,看过很多帖子都没有办理我的题目,发现大多数帖子都是治标不治本,于是想分享一下自己的办理方案。本次接纳的网站是古诗文网,利用百度API,由于百度API免费!免费!免费!得当自己学习的时候利用。假如还没有利用过百度API辨认验证码的朋侪可以看一下我的这个帖子。
以下案例接纳的时古诗文网:登录古诗文网,
1、selenium处理惩罚图片验证码


先定位到验证码图片,在获取验证码图片在页面中的位置,利用save_screenshot截取页面,再根据图片的位置去截取验证码,最后通过接口辨认笔墨获取验证码,直接上代码:
  1. element = driver.find_element_by_id('imgCode') # 定位验证码图片
  2. # 获取验证码图片在网页中的位置
  3. left = int(element.location['x'])  # 获取图片左上角坐标x
  4. top = int(element.location['y'])  # 获取图片左上角y
  5. right = int(element.location['x'] + element.size['width'])    # 获取图片右下角x
  6. bottom = int(element.location['y'] + element.size['height'])  # 获取图片右下角y
  7. # 通过Image处理图像
  8. path = current_dir + str(random.random()) + '.png'  # 生成随机文件名
  9. driver.save_screenshot(path)    # 截取当前窗口并保存图片
  10. im = Image.open(path)        # 打开图片
  11. im = im.crop((left, top, right, bottom))  # 截图验证码
  12. im.save(path)    # 保存验证码图片
  13. # 使用百度API识别验证码
  14. def get_code():
  15.   client = AipOcr(APP_ID, API_KEY, SECRET_KEY)  # 百度API文档中提供的方法识别文字
  16.   # 由于我处理的验证码图片没有填多的线条,所以直接采用灰度是验证码数字更加清晰,具体的处理方式可根据验证码的实际情况而定
  17.   im = Image.open(path)
  18.   # 转换为灰度图像
  19.   im = im.convert('L')
  20.   im.save(path)
  21.   # 读取图片,应为百度API中提供的方法参数只能是字节流
  22.   with open(path, 'rb')as f:
  23.     image = f.read()
  24.   # 使用API中提供的方法识别验证码并返回验证码
  25.   code = client.basicGeneral(image)
  26.   print(code['words_result'][0]['words']) # {'words_result': [{'words': '4TBiD ', 'location': {'top': 1, 'left': 6, 'width': 43, 'height': 13}}], 'log_id': 1358288307112378368, 'words_result_num': 1}
  27.   return code['words_result'][0]['words']
复制代码
2、利用requests哀求验证码


这里用到了会话机制,对于初学者来说大概不太了解,简单说一下会话机制的作用,会话就是用来生存你之前哀求的cookie,让欣赏器知道你之前就在这里,这样欣赏器就不会认为你重新来到这里,从而革新验证码,这样就可以带着我们获取的验证码去登录了。
  1. conn = requests.Sessoin(  # 创建会话
  2. resp = conn.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
  3. selector = Selector(text=resp.text)
  4. img_url = 'https://so.gushiwen.cn/'+selector.xpath('.//img[@id="imgCode"]/@src').get() # 获取图片的路由
  5. img = conn.get(img_url)  # 保持会话请求
  6. filename = str(random.random()) + '.png'
  7. with open(filename, 'wb')as f:
  8.   f.write(img.content)
  9. # 为了后面的调用接口识别不报图片格式错误,进行一次图片转换
  10. im = Image.open(filename)
  11. im.save(filename)
  12. # 使用二进制方式读取图片
  13. with open(filename, 'rb')as f:
  14. image = f.read()
  15. data = client.handwriting(image)  # diao'yong
  16. # 使用API中提供的方法识别验证码并返回验证码
  17. code = client.basicGeneral(image)
  18. code = code['words_result'][0]['words']
复制代码
selenium源码
  1. # -* coding: utf-8 *-
  2. import time
  3. import random
  4. from PIL import Image
  5. from aip import AipOcr
  6. from selenium.webdriver import Chrome
  7. # 百度API参数
  8. APP_ID = '23647800'
  9. API_KEY = 'n95KOQgVuOMoAP72qZZo7uoN'
  10. SECRET_KEY = '7yhyGglHUsY52DD8kf4w0Qjnxum07hMK'
  11. client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 调用API接口
  12. def scrapy(username, password):
  13.   """
  14.   :param username:  用户名
  15.   :param password:  密码
  16.   """
  17.   driver = Chrome()
  18.   driver.get('https://so.gushiwen.cn/user/login.aspx')
  19.   driver.find_element_by_id('email').send_keys(username) # 输入账号
  20.   driver.find_element_by_id('pwd').send_keys(password)  # 输入密码
  21.   element = driver.find_element_by_id('imgCode') # 定位验证码图片
  22.   # 获取验证码图片在网页中的位置
  23.   left = int(element.location['x']) # 获取图片左上角坐标x
  24.   top = int(element.location['y']) # 获取图片左上角y
  25.   right = int(element.location['x'] + element.size['width']) # 获取图片右下角x
  26.   bottom = int(element.location['y'] + element.size['height']) # 获取图片右下角y
  27.   # 通过Image处理图像
  28.   filename = str(random.random()) + '.png' # 生成随机文件名
  29.   driver.save_screenshot(filename) # 截取当前窗口并保存图片
  30.   im = Image.open(filename) # 打开图片
  31.   im = im.crop((left, top, right, bottom)) # 截图验证码
  32.   im.save(filename) # 保存验证码图片
  33.   # 由于我处理的验证码图片没有填多的线条,所以直接采用灰度是验证码数字更加清晰,具体的处理方式可根据验证码的实际情况而定
  34.   im = Image.open(filename)
  35.   # 转换为灰度图像
  36.   im = im.convert('L')
  37.   im.save(filename)
  38.   # 读取图片,应为百度API中提供的方法参数只能是字节流
  39.   with open(filename, 'rb')as f:
  40.     image = f.read()
  41.   # 使用API中提供的方法识别验证码并返回验证码
  42.   data = client.basicGeneral(image)
  43.   try:
  44.     code = data['words_result'][0]['words']
  45.   except:
  46.     return data['error_msg']
  47.   driver.find_element_by_id('code').send_keys(code)  # 输入验证码
  48.   driver.find_element_by_id('denglu').click()   # 点击登录
  49.   time.sleep(1000)  # 为了看清登录,等待1000秒
  50. if __name__ == '__main__':
  51.   print(scrapy(username, password)) # 传入你在古诗文网注册的账号密码
复制代码
requests源码
  1. # -* coding: utf-8 *-
  2. import os
  3. import random
  4. import re
  5. import requests
  6. from PIL import Image
  7. from aip import AipOcr
  8. from scrapy import Selector
  9. headers = {
  10.   'referer': 'https://so.gushiwen.cn/user/login.aspx',
  11.   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
  12. }
  13. # 百度API参数
  14. APP_ID = '23647800'
  15. API_KEY = 'n95KOQgVuOMoAP72qZZo7uoN'
  16. SECRET_KEY = '7yhyGglHUsY52DD8kf4w0Qjnxum07hMK'
  17. def scrapy(username, password):
  18.   """
  19.   :param username:  用户名
  20.   :param password:  密码
  21.   """
  22.   client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 调用API接口
  23.   conn = requests.Session() # 创建会话
  24.   resp = conn.get('https://so.gushiwen.cn/user/login.aspx', headers=headers) # 获取登录页面
  25.   selector = Selector(text=resp.text)
  26.   __VIEWSTATE = selector.xpath('.//input[@id="__VIEWSTATE"]/@value').get()
  27.   __VIEWSTATEGENERATOR = selector.xpath('.//input[@id="__VIEWSTATEGENERATOR"]/@value').get()
  28.   img_url = 'https://so.gushiwen.cn/' + selector.xpath('.//img[@id="imgCode"]/@src').get() # 获取图片的路由
  29.   img = conn.get(img_url, headers=headers) # 获取图片路由
  30.   # 保存图片
  31.   filename = str(random.random()) + '.png' # 随机生成文件名, 图片格式不能为jpg,API不支持jpg格式的识别
  32.   with open(filename, 'wb')as f:
  33.     f.write(img.content)
  34.    # 由于我处理的验证码图片没有填多的线条,所以直接采用灰度是验证码数字更加清晰,具体的处理方式可根据验证码的实际情况而定
  35.   im = Image.open(filename)
  36.   # 转换为灰度图像
  37.   im = im.convert('L')
  38.   im.save(filename)
  39.   # 使用二进制方式读取图片
  40.   with open(filename, 'rb')as f:
  41.     image = f.read()
  42.   # # 标准识别, 每天免费50000次
  43.   # data = client.basicGeneral(image)
  44.   # 精确识别,每天免费500次
  45.   data = client.handwriting(image)
  46.   # 捕获一下接口识别当中的错误,可参照文档查看报错原因
  47.   try:
  48.     code = data['words_result'][0]['words']
  49.   except:
  50.     return data['error_msg']
  51.   form_data = {
  52.     '__VIEWSTATE': __VIEWSTATE,
  53.     '__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
  54.     'from': '',
  55.     'email': username,
  56.     'pwd': password,
  57.     'code':cod,
  58.     'denglu': '登录'
  59.   }
  60.   # 登录
  61.   html = conn.post('https://so.gushiwen.cn/user/login.aspx', headers=headers, data=form_data).text
  62.   # 获取登录标志位
  63.   login_flag = re.findall("alert\('(.*?)'\);",html)[0] if re.findall("alert\('(.*?)'\);",html) else ''
  64.   if not login_flag:
  65.     return '登录成功!'
  66.   elif '验证码有误!' in login_flag:
  67.     return "验证码错误"
  68. if __name__ == '__main__':
  69.   print(scrapy(username, password))
复制代码
以上就是python爬虫如何办理图片验证码的详细内容,更多关于python 办理图片验证码的资料请关注草根技术分享别的干系文章!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作