图形验证码
在爬虫中图形验证码的解决方式有哪些?
1 可以通过算法 以及深度学习
2 selenium来解决
3 打码平台(付费)
4 tesseract(免费的 开源的 光学文字识别库)
tesseract
1 安装
1.1 需要把安装的路径添加到path环境变量里面 E:\Tesseract-OCR
1.2 需要把训练数据添加到 用户变量
TESSDATA_PREFIX=E:\Tesseract-OCR\tessdata
2 安装模块
pip install pytesseract
3 使用
打码平台
超级鹰的打码平台 https://www.chaojiying.com/
1 注册账号(用户)
2 充值(1块钱或者扫码关注微信公众号 1000题分)
3 创建软件id(点击创建软件id 输入名字 提交)
4 下载实例代码(python 点击下载 压缩文件)
5 使用实例代码
12306登录的问题
超级鹰识别
import requests
from hashlib import md5
from PIL import Image
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
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()
driver = webdriver.Chrome()
driver.get('https://kyfw.12306.cn/otn/login/init')
time.sleep(5)
driver.save_screenshot('code.png')
code_img_element = driver.find_element_by_class_name('touclick-image')
lacation = code_img_element.location
size = code_img_element.size
rangle = (int(lacation['x']),int(lacation['y']),int(lacation['x']+size['width']),int(lacation['y']+size['height']))
i = Image.open('./code.png')
code_img_name = './yzm.png'
frame = i.crop(rangle)
frame.save(code_img_name)
chaojiying = Chaojiying_Client('Jerry1234 ', '123456', '914400')
im = open('yzm.png', 'rb').read()
print(chaojiying.PostPic(im, 9004)['pic_str'])
result = chaojiying.PostPic(im, 9004)['pic_str']
all_lst = []
if '|' in result:
lst1 = result.split('|')
count1 = len(lst1)
for i in range(count1):
xy_lst = []
x = int(lst1[i].split(',')[0])
y = int(lst1[i].split(',')[1])
xy_lst.append(x)
xy_lst.append(y)
all_lst.append(xy_lst)
else:
x = int(result.split(',')[0])
y = int(result.split(',')[1])
xy_lst = []
xy_lst.append(x)
xy_lst.append(y)
all_lst.append(xy_lst)
print(all_lst)
for l in all_lst:
x = l[0]
y = l[1]
ActionChains(driver).move_to_element_with_offset(code_img_element,x,y).click().perform()
time.sleep(0.5)
12306图片验证码的实现(selenium(鼠标行为链) + 打码平台)
打码平台
1 注册账号
2 充值
3 创建软件id
4 下载实例代码
5 使用实例代码
12306图片验证码的实现
解决方案: selenium(鼠标行为链) + 打码平台
思路:
通过selenium来加载登录页面,获取验证码图片。我就可以把验证码图片交给超级鹰打码平台进行处理。让其给我返回这张验证码正确的坐标值。拿到正确的坐标值之后去点击图片
实现步骤
第一步 使用selenium加载登录页面
第二步 对页面进行保存
第三步 截取12306图片验证码
第四步 交给超级鹰打码平台进行识别 返回正确的坐标值
第五步 根据正确的坐标值进行点击
# 1 定位图片
code_img_element = driver.find_element_by_class_name('imgCode')
# 2 获取图片的左上角坐标值
location = code_img_element.location # location返回值是个字典 左上角坐标值
# 3 获取图片的宽和高
size = code_img_element.size # size也是一个字典 图片的宽和高
# 4 获取左上角和右下角的坐标值
rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
i = Image.open('code.png')
code_img_name = 'yzm.png'
frame = i.crop(rangle) # crop() 根据指定区域进行裁剪
frame.save(code_img_name)
opencv
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html
行为验证(selenium(鼠标行为链) + 算法)
解决方案: selenium(鼠标行为链) + 算法
原理:完全模拟人的行为,按住滑块,拖动到目标缺口位置
思路:
我们将目标图片和目标缺口的距离分成2部分。前面一部分我们就刷的一下拖过去。后面一部分 我们可以先匀加速然后在匀减速
按住拖动按钮 拖动到目标缺口 松开
后面的一段速度代码需要用算法来实现
拓展 opencv
Qq空间行为验证码案例
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
from selenium.common.exceptions import NoSuchElementException,StaleElementReferenceException
def login():
driver = webdriver.Chrome()
driver.get('https://i.qq.com/')
time.sleep(2)
driver.switch_to.frame(driver.find_element_by_id('login_frame'))
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').send_keys('192149641')
driver.find_element_by_id('p').send_keys('logic12345')
time.sleep(1)
driver.find_element_by_id('login_button').click()
time.sleep(2)
actions = ActionChains(driver)
driver.switch_to.frame(driver.find_element_by_id('tcaptcha_iframe'))
x = 165
flag = True
while flag:
try:
tcaptcha_drag_thumb = driver.find_element_by_id('tcaptcha_drag_thumb')
actions.drag_and_drop_by_offset(tcaptcha_drag_thumb,xoffset=x,yoffset=0).perform()
except NoSuchElementException:
driver.quit()
login()
time.sleep(2)
try:
actions.drag_and_drop_by_offset(tcaptcha_drag_thumb, xoffset=x, yoffset=0).perform()
except StaleElementReferenceException:
pass
x = x + 5
time.sleep(1)
try:
driver.find_element_by_id('feed_tab_my')
break
except NoSuchElementException:
print('未登录到主页')
login()
参考文章
https://www.cnblogs.com/xiao-apple36/p/8878960.html