Python3.7爬虫:实时api(百度ai)检测验证码模拟登录(Selenium)页面

原文转载自「刘悦的技术博客」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

原创文章 35 获赞 4 访问量 1917

猜你喜欢

转载自blog.csdn.net/zcxey2911/article/details/105199588
今日推荐