原文转载自「刘悦的技术博客」https://v3u.cn/a_id_134

今天有同学提出了一个需求,老板让自动登录这个页面:https://www.dianxiaomi.com/index.htm,毫无疑问登录页面基本都会有在线验证码,要破解这个验证码当然不是啥难事,诚然可以自己去训练模型,然而大量的训练集测试数据还得自己去打码,说白了,不值当,有现成的接口可以用,何乐而不为,于是我们向万恶的百度伸出了魔爪。

首先申请百度api开发平台:https://cloud.baidu.com/

随后在人工智能-》文字识别 模块里建立一个应用

建立成功后,会分配给你一个key和secret

只不过这个接口免费版的每秒最多只能请求两次,一天有500次的请求机会

这里推荐使用高精度的接口,普通的识别率太差了

第一步,获取access_token

res = requests.get("https://aip.baidubce.com/oauth/2.0/token?grant\_type=client\_credentials&client\_id=你的key&client\_secret=你的秘钥")

res = json.loads(str(res.text))
token = res\['access\_token'\]

然后请求高精度识别接口,需要注意一点,这里图片需要转换成base64编码

temp\_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate\_basic?access\_token=' + token
temp\_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
temp\_file = open('./test.png', 'rb')
temp\_image = temp\_file.read()
temp\_file.close()
temp\_data = {'image': base64.b64encode(temp\_image)}
temp\_data = urllib.parse.urlencode(temp\_data)
temp\_res = requests.post(url=temp\_url, data=temp\_data, headers=temp\_headers) res = json.loads(str(temp\_res.text))
code = res\['words\_result'\]\[0\]\['words'\]

百度接口会将识别出的验证码文字返回给你,当然了有一定误差是在所难免的

现在验证码识别已经搞定,问题的关键是,每次打开页面的时候,怎么将图片传给百度接口

其实很简单,我们可以考虑使用selenium自动化工具来截图,selenium是可以根据选择器做局部截图的

nodes = driver.find\_element\_by\_id('loginImgVcode')
nodes.screenshot('test.png')

虽然可以截图,但是其实发现有东西干扰了验证码图片

原来是旁边讨厌的广告挡住了验证码,这样的干扰会让识别产生误差

其实这些html标签是可以移除的,使用selenium运行js代码来删除这些干扰元素

#删除元素
js = "var elem = document.getElementsByClassName('dnf');elem\[0\].parentNode.removeChild(elem\[0\]);"
driver.execute\_script(js) js = "var elem = document.getElementsByClassName('qqshow');elem\[0\].parentNode.removeChild(elem\[0\]);"
driver.execute\_script(js) js = "var elem = document.getElementsByClassName('QR');elem\[0\].parentNode.removeChild(elem\[0\]);"
driver.execute\_script(js)

再截图一次,看到已经干净了很多

剩下的就很简单了,直接利用selenium输入账号密码以及验证码就可以自动登录,非常轻松,完整代码如下:

import requests
import json
import base64
import urllib
from selenium import webdriver
import time #selenium 截图
driver = webdriver.Chrome()
driver.get('https://www.dianxiaomi.com/index.htm')
time.sleep(1) #删除元素
js = "var elem = document.getElementsByClassName('dnf');elem\[0\].parentNode.removeChild(elem\[0\]);"
driver.execute\_script(js) js = "var elem = document.getElementsByClassName('qqshow');elem\[0\].parentNode.removeChild(elem\[0\]);"
driver.execute\_script(js) js = "var elem = document.getElementsByClassName('QR');elem\[0\].parentNode.removeChild(elem\[0\]);"
driver.execute\_script(js) nodes = driver.find\_element\_by\_id('loginImgVcode')
nodes.screenshot('test.png') #用户名 exampleInputName exampleInputPassword driver.find\_element\_by\_id('exampleInputName').send\_keys('18231327142') driver.find\_element\_by\_id('exampleInputPassword').send\_keys('Xw1995410') #请求百度api接口 res = requests.get("https://aip.baidubce.com/oauth/2.0/token?grant\_type=client\_credentials&client\_id=你的key&client\_secret=你的秘钥") res = json.loads(str(res.text))
token = res\['access\_token'\] temp\_url = 'https://aip.baidubce.com/rest/2.0/ocr/v1/accurate\_basic?access\_token=' + token
temp\_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
temp\_file = open('./test.png', 'rb')
temp\_image = temp\_file.read()
temp\_file.close()
temp\_data = {'image': base64.b64encode(temp\_image)}
temp\_data = urllib.parse.urlencode(temp\_data)
temp\_res = requests.post(url=temp\_url, data=temp\_data, headers=temp\_headers) res = json.loads(str(temp\_res.text))
print(res)
code = res\['words\_result'\]\[0\]\['words'\] driver.find\_element\_by\_id('loginVerifyCode').send\_keys(code.strip().replace(' ','')) #登录按钮
driver.find\_element\_by\_id('loginBtn').click() time.sleep(10) driver.close()

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_134

Python3.7爬虫:实时api(百度ai)检测验证码模拟登录(Selenium)页面的更多相关文章

  1. 爬虫03 /代理、cookie处理、模拟登录、提升爬虫效率

    爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 目录 爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 1. 代理 2. cookie处理 3. 模拟登录 4. 如何提升爬取数据 ...

  2. selenium跳过webdriver检测并模拟登录淘宝

    目录 简介 编写思路 使用教程 演示图片 源代码 @(文章目录) 简介 模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网 ...

  3. python3.7爬虫:使用Selenium带Cookie登录并且模拟进行表单上传文件

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_142 前文再续,书接上一回,之前一篇文章我们尝试用百度api智能识别在线验证码进行模拟登录:Python3.7爬虫:实时api(百 ...

  4. 百度收录检测并主动推送API(实时 mip推送通用)

    简要描述: 百度收录检测并主动推送API(实时) 请求URL: api.bigjiji.com/baiduCheck_123456 调用方式: img标签 参数: 参数名 必选 类型 说明 site ...

  5. 百度AI开放平台- API实战调用

    百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-1 ...

  6. c# 利用AForge和百度AI开发实时人脸识别

    baiduAIFaceIdentify项目是C#语言,集成百度AI的SDK利用AForge开发的实时人脸识别的小demo,里边包含了人脸检测识别,人脸注册,人脸登录等功能 人脸实时检测识别功能 思路是 ...

  7. 什么?小程序实时语音识别你还在痛苦的对接科大讯飞?百度Ai识别?

    前言 微信小程序,说不上大火,但是需求还是不少的.各大企业都想插一足 于是前端同学就有事情做了. 需求 我需要录音 我边说话边识别,我要同声传译,我要文字转语音,还要萝莉音 我:??? 正文 一开始, ...

  8. 百度AI文本审核API使用说明

    虽然,虽然,虽然,今天: 百度发布了2019年第一季度未经审计的财务报告.本季度百度营收241亿元人民币(约合35.9亿美元),同比增长15%,移除业务拆分收入影响,同比增长21%.低于市场预期242 ...

  9. scrapy爬虫框架调用百度地图api数据存入数据库

    scrapy安装配置不在本文 提及, 1.在开始爬取之前,必须创建一个新的Scrapy项目.进入自定义的项目目录中,运行下列命令 scrapy startproject mySpider 其中, my ...

随机推荐

  1. 【数据库】MYSQL如何添加索引

    1.使用ALTER TABLE语句创建索性 应用于表创建完毕之后再添加. 1.1语法 ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,inde ...

  2. TinyMCE简介

    TinyMCE是一款开源.易用.UI时新的富文本编辑器. 插件丰富,自带插件基本满足要求 可扩展性强,可自定义功能 界面好看,符合现代审美 提供经典.内联.沉浸无干扰三种模式 官网:https://w ...

  3. 110. Balanced Binary Tree - LeetCode

    Question 110. Balanced Binary Tree Solution 题目大意:判断一个二叉树是不是平衡二叉树 思路:定义个boolean来记录每个子节点是否平衡 Java实现: p ...

  4. 以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone

    学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone 代码示例: import java.util.Scanner; class Point4{ private dou ...

  5. 如何在 pyqt 中自定义工具提示 ToolTip

    前言 Qt 自带的工具提示样式不太好看,就算加了样式表也时不时会失效,同时工具提示没有阴影,看起来就更难受了.所以本篇博客将会介绍自定义工具提示的方法,效果如下图所示: 实现过程 工具提示其实就是一个 ...

  6. vue3常见问题及解决方案(四)父组件切换行,然后子组件切换tab,子组件内的数据不刷新

    问题描述 父组件切换行,然后子组件切换tab,子组件内的数据不刷新. 例如父组件为订单,子组件为订单相关商品和相关客户,商品和客户使用tab选项卡组织. 当tab显示商品页时,切换订单,商品页内容跟着 ...

  7. JavaSE_多线程入门 线程安全 死锁 状态 通讯 线程池

    1 多线程入门 1.1 多线程相关的概念 并发与并行 并行:在同一时刻,有多个任务在多个CPU上同时执行. 并发:在同一时刻,有多个任务在单个CPU上交替执行. 进程与线程 进程:就是操作系统中正在运 ...

  8. CentOS搭建BWAPP靶场并安装docker

    为了不触碰国家安全网络红线作为技术人员我们尽可能的要在自己本机在上面创建自己的靶场: 在centos上面搭建靶场看似非常简单短短几行代码,需要注意以下几个点:(1.在docker上搭建   2.端口号 ...

  9. JUnit 5 - Nested Test 内嵌测试

    本文地址:https://www.cnblogs.com/hchengmx/p/15158658.html 1. Nested用来解决什么问题 简单地说,Nested用来解决,随着Case越来越多,C ...

  10. numpy学习笔记02

    简介 numpy.array() 数组对象,可以表示普通的一维数组,或者二维矩阵,或者任意数据:并且它可以对数组中的数据进行非常高效的运算,如:数据统计.图像处理.线性代数等 numpy 之所以能运行 ...