前言

目前在学习网络爬虫中的验证码识别,今天做了个有趣的项目,用超级鹰来模拟登陆超级鹰。

超级鹰:验证码服务平台,提供验证码识别服务。

selenium:最广泛使用的开源 Web UI(用户界面)自动化测试套件之一,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到所谓的“可见及爬”,是网络爬虫中的一把利器。

crop()函数: 用于裁剪图片,使用Image中的open(file)方法可返回一个打开的图片,使用crop([x1,y1,x2,y2])可进行裁剪。

基本思路

初始化信息
输入用户信息
获取验证码图片对象
获取验证码位置
获取网页截图
获取验证码图片
登录按钮获取
模拟点击登录
验证积分

模拟登陆的难点之一在于对验证码的识别,识别部分这里交给超级鹰平台来处理,超级鹰的使用方法可以参考:超级鹰:selenium专门用来破解各种验证码_Shaun_X-CSDN博客,这里我们主要进行的是对验证码的定位及截取保存

代码分析

presence_of_element_located:节点加载出来,传入定位元组,如(By.ID, 'p')

定位验证码元素

element = self.wait.until(EC.presence_of_element_located((By.XPATH,'//body/div[3]/div[1]/div[3]/div[1]/form[1]/div[1]/img[1]')))

获取验证码位置

    def captcha_position(self):element = self.captcha_element()time.sleep(2)# 获取对象位置location = element.location# 获取图片大小size = element.size# 291, 291+50, 668, 668+180top, bottom, left, right = location['y'], location['y'] + size['height'], \location['x'], location['x'] + size['width']return top, bottom, left, right

截取此时网页,以便于获取验证码

    def browser_screenshot(self):screenshot = self.browser.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))return screenshot

get_screenshot_as_png():以PNG格式保存截图

BytesIO:类文件对象(file-like object),这种对象在内存中创建,可以像文件一样被操作。StringIO只能存储字符串,遇到从网络下载的图片视频等Bytes类型的内容就不行了,需要用到专门存储Bytes类型的BytesIO对象

获取验证码图片

 def captcha_img(self, name='captcha.png'):top, bottom, left, right = self.captcha_position()print("验证码的位置是:", top, bottom, left, right)screenshot = self.browser_screenshot()captcha = screenshot.crop((left * 1.25, top * 1.25, right * 1.25, bottom * 1.25))captcha.save(name)return captcha

crop()函数: 用于裁剪图片,使用Image中的open(file)方法可返回一个打开的图片,使用crop([x1,y1,x2,y2])可进行裁剪。

我在做这个项目时发现截取到的不是真正的验证码图片,研究测试了半天,发现这里的坐标应该全部乘1.25,因为电脑缩放与布局用的125%为推荐设置,设置→显示,可以将其调为100%或者我这种处理方式。

 源码

最后是整个项目的源代码,欢迎交流指正

# @Author : YJL
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from PIL import Image
from io import BytesIO
from chaojiying import Chaojiying_Client# 这里输入注册超级鹰后的用户名、密码
USER_NAME = ''
PASSWORD = ''
# 这里是要识别的验证码类型
cjy_id = '1902'class ChaojiyingLogin(object):# 1.初始化信息def __init__(self):self.url = 'https://www.chaojiying.com/user/login/'self.user = USER_NAMEself.pwd = PASSWORDself.browser = webdriver.Chrome()self.wait = WebDriverWait(self.browser, 10)self.chaojiying = Chaojiying_Client(USER_NAME, PASSWORD, cjy_id)# 2.输入用户信息def input_info(self):self.browser.get(self.url)username = self.wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login_form"]/form/p[1]/input')))password = self.wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="login_form"]/form/p[2]/input')))username.send_keys(self.user)password.send_keys(self.pwd)# 3.获取验证码图像对象def captcha_element(self):element = self.wait.until(EC.presence_of_element_located((By.XPATH,'//body/div[3]/div[1]/div[3]/div[1]/form[1]/div[1]/img[1]')))return element# 4.获取验证码位置def captcha_position(self):element = self.captcha_element()time.sleep(2)location = element.locationsize = element.size# 291, 291+50, 668, 668+180top, bottom, left, right = location['y'], location['y'] + size['height'], \location['x'], location['x'] + size['width']return top, bottom, left, right# 5.获取网页截图def browser_screenshot(self):screenshot = self.browser.get_screenshot_as_png()screenshot = Image.open(BytesIO(screenshot))return screenshot# 6.获取验证码图片def captcha_img(self, name='captcha.png'):top, bottom, left, right = self.captcha_position()print("验证码的位置是:", top, bottom, left, right)screenshot = self.browser_screenshot()captcha = screenshot.crop((left * 1.25, top * 1.25, right * 1.25, bottom * 1.25))captcha.save(name)return captcha# 7.登录按钮获取def click_button(self):submit = self.wait.until(EC.element_to_be_clickable((By.XPATH,'//body/div[3]/div[1]/div[3]/div[1]/form[1]/p[4]/input[1]')))submit.click()time.sleep(5)print('登录成功')# 8.登录def login(self):self.input_info()# 获取验证码图片image = self.captcha_img()bytes_arr = BytesIO()image.save(bytes_arr, format='PNG')# 识别验证码result = self.chaojiying.PostPic(bytes_arr.getvalue(), cjy_id)print(result)# pic_str是识别出的验证码内容code = result['pic_str']inputcode = self.wait.until(EC.presence_of_element_located((By.XPATH,'//body/div[3]/div[1]/div[3]/div[1]/form[1]/p[3]/input[1]')))inputcode.send_keys(code)time.sleep(1)self.click_button()# 判断是否成功# 打印当前剩余积分jifen = self.wait.until(EC.presence_of_element_located((By.XPATH,'//div[@class="index_box mat8"]/div/span')))print('当前剩余积分为:', jifen.text)if __name__ == '__main__':button = ChaojiyingLogin()button.login()

运行结果

selenium+crop+chaojiying 之模拟登录超级鹰相关推荐

  1. python—简单数据抓取四(利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站、利用百度云的ocr识别自如租房网价格图片获取到自如网的价格)

    学习目标: python学习二十四 -简单数据抓取四 学习内容: 1.利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站 2.利用百度云的ocr识别自如租房网的价格图片,获取到自如网的价格数据 1.利 ...

  2. Python+Selenium+phantomjs实现网页模拟登录和截图

    Python+Selenium+phantomjs实现网页模拟登录和截图 本文全部操作均在windows环境下 安装 Python Python是一种跨平台的计算机程序设计语言,它可以运行在Windo ...

  3. selenium与python自动化测试模拟登录百度

    将一些必须必要条件准备好 1,安装chorme浏览器 1,安装依赖 sudo apt-get install libxss1 libappindicator1 libindicator7 2,下载go ...

  4. 12-基于selenium实现12306模拟登录,及京东登录滑动缺口验证模拟登录

    流程分析: 使用selenium打开登录页面 对当前selenium打开的这张页面进行截图 对当前图片的局部区域(验证码图片区域)进行截图 这样验证码图片和模拟登录进行所显示的图片一一对应(如果我们对 ...

  5. Python + selenium自动化工具 + 滑块验证码+点选验证码,实现模拟登录“中国铁路网12306”

    文章目录 一.模拟登录"中国铁路网12306 1.引入库 2.初始化 3.将点选验证码图片,通过人工打码,返回目标像素位置(json格式). 4.点选验证码位置得到后,需要鼠标左击进行模拟人 ...

  6. Selenium之模拟登录铁路12306

    最近接触了一些selenium模块的相关知识,觉得还挺有意思的,于是决定亲自尝试写一些爬虫程序来强化selenium模块(一定要多尝试.多动手.多总结).本文主要使用python爬虫来模拟登录铁路12 ...

  7. 用selenium模拟登录魅族官网(针对于点触点选验证码的识别)

    博主是爬虫菜鸡,对于验证码的识别这一块内容是十分的无力,最近按照崔庆才老师的<python3网络爬虫开发实战进行学习>,由于操作系统与老师的不同,技术更新快等多种因素,光是对老师书中的代码 ...

  8. 爬虫学习笔记(十八)—— 点触验证码:超级鹰、12306自动登录

    一.打码平台 点触验证码是一种常见的反爬手段. 解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间 ...

  9. 第三方打码平台超级鹰图文识别,md5算法加密

    文章目录 一.注册超级鹰账户 二.利用超级鹰模拟登录古诗文网 网页分析 代码实现解析 为什么要使用session 三.总结 **感谢观看,给个三连支持一下吧** 一.注册超级鹰账户 超级鹰链接:htt ...

  10. 手把手教你用Python模拟登录淘宝

    作者 | 猪哥66 来源 | 裸睡的猪(ID:IT--Pig) 最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章! 看了下网上有很多关于模拟 ...

最新文章

  1. Chrome开发者工具面板功能
  2. 2020 我的C++学习之路 C++PrimerPlus第四章课后习题
  3. [转载]c#中 uint--byte[]--char[]--string相互转换汇总
  4. linux网络管理技术,linux网络管理 一
  5. java多个按钮监听,如何改成监听多个按钮啊用e.getsource()
  6. php微信支付分取消订单,微信支付PHP开发教程五关闭订单
  7. 返回一个不确定的对象_我有一个Android必备知识点,你确定不了解一下?
  8. ireport学习笔记
  9. 基于Faster R-CNN的安全帽目标检测
  10. BERT4GCN:利用BERT中间层特征增强GCN进行基于方面的情感分类
  11. 用PLC和触摸屏设计用户可编程的控制项目
  12. SaltStack源码分析之Redis Returner
  13. linux菜鸟入门之系统启动流程
  14. 头哥 (Educoder)数据结构与算法实验:实验11 TYJ动态规划
  15. 《沈剑架构师训练营》第8章 - 架构分层
  16. ios 运行 release 版本
  17. 华擎主板bios设置图解_【华擎Z170评测】BIOS设置及超频方法简介_华擎 Z170 超频方程式_主板评测-中关村在线...
  18. php filter_sanitize_number_int,PHP中的FILTER_SANITIZE_NUMBER_FLOAT常量
  19. [Nikon D80]月季
  20. 如果家庭中一台台式计算机,中国家用电脑调查分析报告

热门文章

  1. 24点游戏(C++)
  2. html5 拾色器原理,HTML_html5 学习简单的拾色器 ,下面是源码 需要浏览器支持htm - phpStudy...
  3. DAX计算月末一次加权平均出库金额
  4. 五子棋c语言程序人人对战,C语言 AI智能,五子棋 人机对战,人人对战
  5. 社群营销:微信群二维码裂变
  6. 普通用户sudo echo权限依旧写入不了文件
  7. 第十节 直流变直流电路(DCDC)芯片选型
  8. HFSS - 半波偶极子天线的设计与仿真
  9. 在哪里能找到各行业的分析研究报告?
  10. 高等数学张宇18讲 第七讲 一元函数积分学的概念与计算