爬虫学习_自动填写验证码

    • 介绍一哈
  • 项目
    • 第一步 打开网站
    • 第二步 获取验证码图片
    • 第二步 获取验证码图片
    • 第三步 识别验证码
    • 结束
    • 完整代码

介绍一哈

最近在跟着静觅大神。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。的书、博客学习爬虫,准备学学写写记录一下。希望可以跟各位互相学习一下(抱拳)

项目

在学习了tesseract识别验证码后,准备用selenium + tesserocr写个中国知网的自动填写验证码
网站地址: 点我点我.

页面如下:

第一步 打开网站

直接用selenium打开 不多说不多说
讲究一点 可以添加点响应时长 和 等待浏览器加载完毕的 设置

from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('http://my.cnki.net/elibregister/commonRegister.aspx')

第二步 获取验证码图片

一开始的想法是 获取网页中验证码图片的地址 下载图片 再做验证码识别 然后再填入

在network中发现 CheckCode.aspx 就是验证码 那么我们就可以通过 [Request URL] 得到验证码图片地址(http://my.cnki.net/elibregister/CheckCode.aspx)

import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
url = 'http://my.cnki.net/elibregister/CheckCode.aspx'res = requests.get(url, headers=headers)
with open('./checkcode.png', 'wb') as f:f.write(res.content)

好了! 我们现在已经获取到验证码存到本地了! 只要识别之后 填入就ok了!
但是突然想到 用selenium打开的页面中的验证码与我们自己通过url获取的验证码其实没有一毛钱关系!
当时 还在想 有啥方法 可以 让selenium打开的页面 与 requests请求获取的验证码在同一个Session下进行
反正就是挺憨憨的

第二步 获取验证码图片

没错!还是第二步。后来发现 selenium 获取验证码其实有简单粗暴的方法 就是直接截图 o(╥﹏╥)o

     browser = webdriver.Chrome()browser.get('http://my.cnki.net/elibregister/commonRegister.aspx')browser.save_screenshot('./checkcode.png')  # 保存整个网页element = browser.find_element_by_xpath('//*[@id="checkcode"]')  # 获取验证码元素left = element.location['x']top = element.location['y']right = element.location['x'] + element.size['width']bottom = element.location['y'] + element.size['height']im = Image.open('./checkcode.png')im = im.crop((left, top, right, bottom))  # 切割im.save('./checkcode.png')

第三步 识别验证码

识别图片用到的是tesseract软件对应python中的tesserocr库
这块不多说 首先安装部分有点小坑 需要避雷 hjtoh 的一篇博客说的挺详细 大家有问题可以对照的看看。博客地址
其次是使用方法 涉及到很多图像的知识

     image = Image.open(image_path)  image = image.convert('L')  # 将图片转为灰度图片threshold = 138  # 设置阈值table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)image = image.point(table, '1')image.show()res = tesserocr.image_to_text(image)result = res.replace(' ', '')

总之 照着写 噼里啪啦 最终结果就出来了 中间具体原理没去研究 这段断码我们唯一要去改动只是阈值 threshold
原始图片

比如 threshold = 138

比如 threshold = 100

又比如 threshold = 180

很明显 阈值设为 140左右时 识别效果最好
实际设置时 根据验证码的款式 多试几个值 择优而选

得到验证码后 填入(ps: 这种简单操作的识别下 误识别率还是很高的)

     input = browser.find_element_by_xpath('//*[@id="txtOldCheckCode"]')input.send_keys(res)

结束

好了 最初设想的功能就已经全部实现了
第一遍博客 写的有点累啊
最后逼叨几句
1、 个人想法是利用tesseract做验证码识别 在实际情况下可能并不多

因为它的基础识别功能 对于验证码这块来说 还是挺弱的

验证码主体 和 干扰的竖线 灰度值不一样(不知道是不是灰度值这个词 反正就是这个意思 :干扰竖线比主体颜色淡!)所以才

能用这个方法处理图片 以此得到 可识别的 图片

如果碰到干扰线 跟 验证码 一个色儿的 那就去除不掉了 或者验证码 不是标准字体 那也就识别不出了

当然可以通过深度学习 训练自己 的验证码识别 器 但可能成本有点高

所以我猜想大多情况还是会使用 专业的验证码网站提供的 接口去做 验证的识别吧

完整代码

import tesserocr
from PIL import Image
from lxml import html
import requests
from selenium import webdriver
import timeclass TestImage(object):def __init__(self):self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}self.url = 'http://my.cnki.net/elibregister/commonRegister.aspx'self.check_url = 'http://my.cnki.net/elibregister/CheckCode.aspx'def check_code(self, image_path):image = Image.open(image_path)image = image.convert('L')threshold = 135table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)image = image.point(table, '1')image.show()res = tesserocr.image_to_text(image)result = res.replace(' ', '')# print(result)return resultdef login(self):browser = webdriver.Chrome()browser.get('http://my.cnki.net/elibregister/commonRegister.aspx')# browser = browser.get('https://www.baidu.com')browser.save_screenshot('bdbutton.png')element = browser.find_element_by_xpath('//*[@id="checkcode"]')print(element)print(element.location)  # 打印元素坐标print(element.size)  # 打印元素大小left = element.location['x']top = element.location['y']right = element.location['x'] + element.size['width']bottom = element.location['y'] + element.size['height']im = Image.open('./bdbutton.png')im = im.crop((left, top, right, bottom))im.save('bdbutton.png')res = self.check_code('./bdbutton.png')input = browser.find_element_by_xpath('//*[@id="txtOldCheckCode"]')input.send_keys(res)if __name__ == '__main__':test = TestImage()test.login()

爬虫学习_selenium自动填写验证码相关推荐

  1. 快速实现自动填写验证码的功能

    今日科技快讯 近日,Uber的创始人卡拉尼克终于被迫离职了.自进入2017年以来,Uber的麻烦事就没有断过.先是由于支持特朗普的限制移民政策而成为众矢之的,接着又被前女性员工控诉在Uber时长期受到 ...

  2. python3 爬虫学习:自动给你心上人的微博点赞(一)

    使用selenium打开微博 在之前的案例里面,我们学习了使用requests.BeautifulSoup库来爬取豆瓣读书的数据,今天我们要来学习一个新的工具:selenium. selenium最初 ...

  3. python自动点赞软件_python3 爬虫学习:自动给你心上人的微博点赞(一)

    使用selenium打开微博 在之前的案例里面,我们学习了使用requests.BeautifulSoup库来爬取豆瓣读书的数据,今天我们要来学习一个新的工具:selenium. selenium最初 ...

  4. Python3 爬虫学习笔记 C13【验证码对抗系列 — 滑动验证码】

    Python3 爬虫学习笔记第十三章 -- [验证码对抗系列 - 滑动验证码] 文章目录 [13.1]关于滑动验证码 [13.2]滑动验证码攻克思路 [13.3]模拟登录 bilibili - 总体思 ...

  5. 爬虫学习(4):自动保存百度云盘资源

    完整代码移步从今天开始种树 开始 在上一文中,我们保存了百度云盘的地址和提取码,但是这种分享链接很容易被屏蔽,最好的做法就是保存资源到自己的网盘,不过采集的链接有上万个,人肉保存并不现实,所以本文尝试 ...

  6. Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】

    Python3 爬虫学习笔记第十四章 -- [验证码对抗系列 - 点触验证码] 文章目录 [14.1]关于点触验证码 [14.2]点触验证码攻克思路 [14.3]模拟登录 12306 - 总体思路 [ ...

  7. Python3 爬虫学习笔记 C12【验证码对抗系列 — 图形验证码】

    Python3 爬虫学习笔记第十二章 -- [验证码对抗系列 - 图形验证码] 文章目录 [12.1]关于普通图形验证码 [12.2]tesserocr 库识别验证码 [12.3]pytesserac ...

  8. 截取短信验证码,实现自动填写验证码

    一个小功能实现短线验证码验自动填写功能. 拿到这个功能时,首先需要怎么去拦截获取手机短信.就用观察着来观察系统里的短消息的数据库的变化,"表"内容观察者,只要数据库发生变化,都会出 ...

  9. python自动点赞_python3 爬虫学习:自动给你心上人的微博点赞(二)

    selenium定位元素的八大方法: 在开始登录前,咱们得先学习一下selenium定位元素的方法,不然找不到元素是没办法完成自动操作 百度 python工程狮 find_element_by_id( ...

最新文章

  1. Ios上任意控件上添加自定义Badge
  2. 计算机视觉之人脸检测相关Paper资源汇总
  3. anaconda python2.7,安装在windows中的Python 2.7 Anaconda2
  4. WCF自定义地址路由映射(不用svc文件)
  5. git的安装与使用(一)--windows平台 .
  6. python库文件安装_python安装库包出现问题
  7. AnyChat视频直播系统全面分析
  8. ActiveMQ消息队列安装和使用
  9. 神奇的机器人评课_神奇的机器人教学案
  10. 根据id查询数据(向前台返回json格式的数据)
  11. 王晓耕老师-风险管理专家
  12. Word 公式编辑器: 快捷键
  13. 学习廖雪峰 Git 总结
  14. 只需三步!查看笔记本电脑连接的WiFi密码
  15. soundbar未来发展_Soundbar专题:一条走天下,属于客厅影院的未来
  16. css动画怎么暂停,纯CSS代码实现动画的暂停与播放
  17. 原生64位卸载工具Revo Uninstaller Pro V2.5.7
  18. 电子信息工程求职目标_实用的信息工程专业求职信四篇
  19. 硕士毕业论文模板(专业硕士)
  20. Vivado与modelsim联合仿真(2018.3---10.6c)

热门文章

  1. Python干掉了98%的办公软件
  2. [2]无线通信--CDMA多址技术(1)
  3. 代码整洁之道(clean code)序
  4. PW6513原装现货
  5. html国内旅游计划,Web实验一 国内旅游界面
  6. 思科设备命令讲解(超基础)
  7. elementui的el-autocomplete远程搜索组件如何回显结果
  8. 腾讯开放平台提交app审核无法上传apk文件
  9. windows自带w32tm实现做ntp client端,精确同步时间。
  10. 线性代数(十) : 矩阵的列空间与零空间