网络爬虫笔记—图形验证码获取

1、验证码获取思路

  • 1)使用selenium库操作谷歌浏览器,打开目标网站;
  • 2)对目标网站进行截图,并将图片保存到本地;
  • 3)获取验证码元素节点在屏幕上的位置,即横纵坐标;
  • 4)使用Image库读取2)中保存的截图;
  • 5)利用3)获取的元素节点位置,对4)中读取的截图,再次进行局部截图,只截取元素节点位置对应部分。

2、执行步骤

2.1、导入所需库和打开目标网站

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from PIL import Imagebrowser = webdriver.Chrome()#创建谷歌浏览器
myurl="https://my.cnki.net/Register/CommonRegister.aspx?returnUrl=https://www.cnki.net"
browser.get(myurl)#打开目标网站
browser.maximize_window()#将浏览器全屏
time.sleep(2)#代码停止2秒
  • 目标网站:知网注册页面

  • 代码解析

1)browser.maximize_window():该代码可以将浏览器全屏显示,其目的是为了方便后面截图,如不全屏会影响后面元素节点的截取;

2)time.sleep(2):该代码可使程序暂停2秒执行,其目的是给网页加载预留足够的时间,以保证截图时,网页已加载完成。

2.2、网页截图保存

browser.save_screenshot("screenshot.png")#网页截图,保存
  • 代码解析

browser.save_screenshot("screenshot.png"):此代码可以对创建的谷歌浏览器进行截图,并保存到本地,图片名称为:“screenshot.png”。因为我用的Spyder编辑器,当保存截图不指定路径时,系统会自动将图片保存到代码文件路径。如指定路径,则会保存到对应文件夹下,如:将screenshot.png修改为D:\宏蜘蛛\screenshot.png,则截图就会保存到D盘的“宏蜘蛛”文件夹下。

2.3、获取验证码元素位置

code_element = browser.find_element(By.XPATH,'//*[@id="phoneCheckCode"]')#通过Xpath方法获取验证码元素
left = code_element.location['x']*1.5#返回一个字典格式,里面有两个参数x和y,代表元素的位置,1.5表示的电脑缩放比例
top = code_element.location['y']*1.5
right = code_element.size['width']*1.5+left#验证码元素右边的点位置
height = code_element.size['height']*1.5+top#验证码元素左上边点位置
  • 代码解析

1)code_element = browser.find_element(By.XPATH,'//*[@id="phoneCheckCode"]')

通过Xpath方法获取验证码节点元素,针对元素的获取方法,大家可参考我此前发布的文章:网络爬虫笔记—Selenium—3、查找节点。

2)left = code_element.location['x']*1.5

a)位置示意

code_element.location会返回一个字典格式的数据,字典的key是x和y。对x和y的理解,大家可结合下图,进行理解。

以截图的左下角作为原点(0,0),截图最下方的边缘作为X轴,截图最左边的边缘作为Y轴。下图中的A点对应的位置坐标就是验证码元素.location方法返回的x和y的值。可以看出.location方法返回的是元素左下角点所对应的位置(图中的A点)。

b)为何后面要乘1.5

.location方法返回的坐标点位置,是基于电脑显示器无缩放的情况的坐标,但我的电脑是以150%缩放显示的,所以后面要乘以1.5,从而将坐标位置调整为我的电脑显示的位置,要不然后面截图的时候,会截取不到验证码图片。

3)right = code_element.size['width']*1.5+left

code_element.size会返回元素节点的宽和高,是一个字典格式,两个key分别为width和height。其目的为了后面截取验证码图片使用。

2.4、读取截图、截取验证码图片和保存验证码图片

im = Image.open("screenshot.png")#读取全屏截图
img = im.crop((left, top, right, height))#截取验证码图片
img.save("mycode.png")#保存验证码图片
  • 代码解析

1)im = Image.open("screenshot.png"):该代码可以读取截取的图片,"screenshot.png"为图片名,如果代码文件和图片不在同一个文件夹下,需要在图片名称前加上图片路径。

2)img = im.crop((left, top, right, height)):该代码可以根据指定位置,对图片进行截图。括号中的参数,就是我们在“2.3、获取验证码元素位置”获取的验证码在图片中的位置。

3)img.save("mycode.png"):该代码可以保存图片到本地,这里是保存获取的验证码图片。同时也可以指定存储位置,默认保存在代码文件夹下。

以上就是验证码获取的方法,获取验证码之后会涉及到验证码识别,针对验证码识别的问题,大家可参考我之前写的这篇文章:网络爬虫笔记—图形验证码识别。

  • 本篇笔记首先在微信公众号“宏蜘蛛”上发布,链接为:网络爬虫笔记—图形验证码获取

—End—

参考资料

1、python实现获取登录验证码图片 - Tester_Jhm - 博客园 (cnblogs.com)

2、问题解决:selenium中定位元素后使用location获取坐标值出现偏差_我敲的贼快的博客-CSDN博客_元素的location获取的不对

网络爬虫笔记—图形验证码获取相关推荐

  1. 网络爬虫笔记—图形验证码识别

    网络爬虫笔记-图形验证码识别 <兄弟们,本文章开启了关注后阅读.大家如不想关注,可直接微信搜索"宏蜘蛛"或文章标题,查看文章.> 1.什么是图形验证码 像知网注册界面的 ...

  2. 网络爬虫笔记—滑动验证码识别

    网络爬虫笔记-滑动验证码识别 一.什么是滑动验证码 点击之前 点击之后 像这种通过滑动图片,补全缺口的方式,就是滑动验证码. 二.识别思路 1)使用selenium库操作谷歌浏览器,打开目标网站:关于 ...

  3. Python 网络爬虫笔记11 -- Scrapy 实战

    Python 网络爬虫笔记11 – Scrapy 实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...

  4. Python 网络爬虫笔记10 -- Scrapy 使用入门

    Python 网络爬虫笔记10 – Scrapy 使用入门 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接: ...

  5. Python 网络爬虫笔记8 -- 股票数据定向爬虫

    Python 网络爬虫笔记8 – 股票数据定向爬虫 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Pyth ...

  6. Python 网络爬虫笔记5 -- Beautiful Soup库实战

    Python 网络爬虫笔记5 – Beautiful Soup库实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. ...

  7. Python 网络爬虫笔记2 -- Requests库实战

    Python 网络爬虫笔记2 – Requests库实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:P ...

  8. Python 网络爬虫笔记1 -- Requests库

    Python 网络爬虫笔记1 – Requests库 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Pyt ...

  9. 网络爬虫中的验证码识别

    网络爬虫遇到的验证码 在写网络,爬虫时,遇到很多网站存在验证码的情形,有其是比较烦的是,爬取数据的每一页都有验证码,如果只有登陆时,存在验证码,这个很好解决,只需将验证码获取后手动输入就行. 但对于每 ...

最新文章

  1. 我用分布式事务干掉了一摞简历
  2. win7多国语的安装说明
  3. Linux内核设计与实现总结。
  4. leetcode算法题--对链表进行插入排序
  5. BIND_MISMATCH导致过多VERSION COUNT的问题
  6. 复调制细化分析matlab,基于复调制的细化全矢谱分析研究
  7. 团队解散,项目被否,我苦修三年终将数据平台落地
  8. java akka_AKKA文档(java版)——什么是AKKA?
  9. flume 一对多hdfs_10PB 规模的 HDFS 数据在 eBay 的迁移实战
  10. T-SQL基础--TOP
  11. 如何在Rancher 2.0上快速部署Datadog
  12. 安装MinGW-W64提示cannot download repository.txt
  13. C++实现Vgg19分类器(四)主函数
  14. 学习笔记/音视频面试
  15. 从零开始学习音视频编程技术(十三) 录屏软件开发之屏幕录像
  16. PB实现URL模式及MIME模式的BASE64加解密
  17. 在edge中使用IE兼容性视图的设置方法|Win10 Win11
  18. SpringMvc标签应用
  19. 计算机的虚拟接口,怎样设置计算机的虚拟目录和虚拟端口
  20. Android 基础篇之环境配置

热门文章

  1. 在自己的电脑上搭建服务器,发布自己的网站
  2. ekf估计电池soc过程推导(一)状态方程列写及离散化
  3. 【丁丁历险记】ESP8266配置microPython
  4. 痛惜!才29岁,年轻博士不幸离世
  5. 如何对付团队中的“害群之马”
  6. web前端H5培训开发设计师好不好
  7. 【科创人独家】远望资本创始人程浩:四旬少年的玩味儿人生,做投资玩王者皆需逆风坚守
  8. English_study 英语骂人话
  9. 佳能Canon imageCLASS MF4012 一体机驱动
  10. Android数据存储安全规范