持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天, 点击查看活动详情
本文主要介绍如何处理一些网页中简单的验证码问题。(只提供简单的思路,随着技术的发展,一些验证码已经防范的非常好了,一般的解决方法可能过不了验证码这一关🤺关于爬虫相关,欢迎先阅读一下我的前几篇文章😶🌫️😶🌫️😶🌫️:
「Python」爬虫-1.入门知识简介 - 掘金 (juejin.cn)
「Python」爬虫-2.xpath解析和cookie,session - 掘金 (juejin.cn)
「Python」爬虫-3.防盗链处理 - 掘金 (juejin.cn)
「Python」爬虫-4.selenium的使用 - 掘金 (juejin.cn)
我们在网站登录或者注册的时候,或多或少都会遇到要输入验证码的情况,比如下面这种情况:
这时候我们就需要借助外部力量 来破解这种奇怪的东西了。
这里介绍超级鹰平台提供的方法对一般的验证码进行处理,识别出图中的码,直接模拟向编辑框填入东西即可。
验证码--超级鹰
关于如何使用超级鹰,下面给出一段模板代码:
#!/usr/bin/env python
# coding:utf-8
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
if __name__ == '__main__':
chaojiying = Chaojiying_Client('xxxxxx', 'xxxxx', '924155') # 用户中心>>软件ID 生成一个替换 96001
im = open('code.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 1902)) # 1902 验证码类型 官方网站>>价格体系
如果你想要使用超级鹰的接口的话,只需要修改图中的数据即可
Chaojiying_Client
中传入的分别为用户名,用户密码,以及需要到该平台的用户中心找到自己账号对应的软件ID。然后可以随便找一张验证码的图片,调用.PostPic
方法即可,传入的参数见官网验证码类型。
虽然说超级鹰自己是一个提供验证码破解的平台,但是他自己本身网站登录的时候也需要输入验证码。那么?🫠,让他自己处理自己平台的验证码有没有可能呢?!
那必然是可以的,接下来就准备试试~
超级鹰处理超级鹰
我们这里图方便,仍然使用之前提到过的selenium,注意,需要将前面模板提到的Chaojiying_Client先复制过来!
然后找到目标网址http://www.chaojiying.com/user/login
实例化对象
web = Chrome()
web.get("http://www.chaojiying.com/user/login/")
F12
键找找到验证码图片所在的位置
img = web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png
再交给超级鹰去处理
chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '924155')
dic = chaojiying.PostPic(img, 1902)
verify_code = dic['pic_str']
最后就是模拟填入了,相信这个大家一定会了吧~
完整代码如下:
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
import time
from chaojiying import Chaojiying_Client
web = Chrome()
web.get("http://www.chaojiying.com/user/login/")
# 处理验证码
img = web.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img').screenshot_as_png
chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '924155')
dic = chaojiying.PostPic(img, 1902)
verify_code = dic['pic_str']
# 向页面中填入用户名,密码,验证码
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[1]/input').send_keys("xxxx")
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[2]/input').send_keys("xxxx")
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input').send_keys(verify_code)
time.sleep(5)
# 点击登录
web.find_element(By.XPATH,'/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input').click()
处理完简单的验证码,接下来我们上一点难度,先来看看12306的登录吧
处理12306登录
鬼畜的图片识别
12306的登录页面是属于人机交互的感觉,超级鹰仍然集成了这种识别的解决方法。
通过dic = chaojiyiing.PostPic(verify_img,9004)
就可以对该种验证码进行处理了,dic['pic_str']
就可以得到一个及以上的图片位置坐标。返回形式为x1,y1|x2,y2|...
。
通过.split("|")
就可以得到多个符合条件的图片坐标。得到坐标之后,就需要让鼠标移动到对应的坐标位置上去。
这里通过ActionChains(web).move_to_element_with_offset(verify_img,x,y)
方法就可以移动到对应的位置坐标上去。
移动到相对应的位置之后,就需要点击了,这里通过.click().perform()
方法模拟点击。
完整代码如下:
from selenium.webdriver.common.action_chains import ActionChains
# 初始化超级鹰
chaojiying = Chaojiying_Client('2xxxxg', '1xxxxx', '924155')
verify_img = web.find_elelment(By.XPATH,'xxx').screenshot_as_png
# 用超级鹰识别验证码
dic = chaojiyiing.PostPic(verify_img,9004)
result = dic['pic_str'] # 返回格式:x1,y1|x2,y2..
rs_list = result.split("|")
for rs in rs_list: # x1,y1
p_temp = rs.split(",")
x = int(p_temp[0])
y = int(p_temp[1])
# 要让鼠标移动搭配某个位置
ActionChains(web).move_to_element_with_offset(verify_img,x,y).click().perform()
# 以图片为基准点,偏移量x,y
除了超级鹰可以提供验证码识别的接口之外,百度也有相应的API平台,现在多种平台都有对应的免费次数,这里就不在一一介绍了。
本文完。🪄🪄🪄