一、12306图片验证码

解决方案: selenium(鼠标行为链) + 打码平台

思路:
通过selenium来加载登录页面,获取验证码图片。我就可以把验证码图片交给超级鹰打码平台进行处理。让其给我返回这张验证码正确的坐标值。拿到正确的坐标值之后去点击图片

实现步骤
第一步 使用selenium加载登录页面
第二步 对页面进行保存

第三步 截取12306图片验证码

第四步 交给超级鹰打码平台进行识别 返回正确的坐标值
第五步 根据正确的坐标值进行点击

其中:
截取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']))

(5)在截图图片上裁剪验证码图片( Image模块的crop功能)

i = Image.open('code.png')       #import Image
frame = i.crop(rangle)         # crop() 根据指定区域进行裁剪
frame.save('yzm.png')

完整代码:

import requests
from hashlib import md5
from selenium import webdriver
from selenium.webdriver import ActionChains
from PIL import Image
import timeclass Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword =  password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.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('Jerry1234', '123456', '914400')   #用户中心>>软件ID 生成一个替换 96001
#     im = open('code2.png', 'rb').read()                                                   #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
#     print(chaojiying.PostPic(im, 9004)['pic_str'])     # 验证码的类型                                           #1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()driver = webdriver.Chrome()
# 加载登录页面
driver.get('https://kyfw.12306.cn/otn/resources/login.html')
time.sleep(3)
# 切换登录方式 千万不要忘记点击
driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()
time.sleep(2)
driver.maximize_window()
# 对加载的页面进行保存
driver.save_screenshot('code.png')# 进行对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')
frame = i.crop(rangle) # crop() 根据指定区域进行裁剪
frame.save('yzm.png')# 将验证码图片交给超级鹰打码平台进行识别(就是超级鹰里被注释掉的最后4行的逻辑)
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)# 使用鼠标行为链来进行正确图片的点击
for i in all_lst:x = i[0]y = i[1]ActionChains(driver).move_to_element_with_offset(code_img_element,x,y).click().perform()time.sleep(0.6)

备注:move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
​补充:
(1)

(2)获取全屏截图中的验证码图片

location返回值是个字典 左上角坐标值**(坐标轴是以屏幕左上角为原点,x轴向右递增,y轴像下递增)**

import requests
from selenium import webdriver
from PIL import Image
import timedriver = webdriver.Chrome(r'C:\Users\01\Desktop\chromedriver.exe')
# 加载页面
driver.get('https://www.baidu.com/')
time.sleep(3)
#最大化窗口
driver.maximize_window()
# 对加载的页面进行保存(全屏截图)
driver.save_screenshot('code.png')# 对页面上的图片进行裁剪
# 1 定位图片
code_img_element = driver.find_element_by_xpath('//*[@id="s_lg_img"]')
# 2 获取图片的左上角坐标值
location = code_img_element.location # location返回值是个字典 左上角坐标值(坐标轴是以屏幕左上角为原点,x轴向右递增,y轴像下递增)
print(location)
# 3 获取图片的高和宽
size = code_img_element.size # size也是一个字典:图片的高和宽
print(size)
# 4 获取左上角和右下角的坐标值
rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
print(rangle)i = Image.open('code.png') #打开图片
frame = i.crop(rangle)  # crop() 根据指定区域进行裁剪
frame.save('yzm.png')   #保存图片

二、行为验证(滑块验证)
1、拓展 :opencv图像处理框架(官网:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html)
1.1特性:
(1)跨平台性(windows mac linux android…)
(2)跨语言(Java C/C++ Python Ruby oc swift…)
(3)支持功能丰富(opencv)
(4)稳定、性能高(1999年-至今 intel发布)
(5)BAT公司用在一些ai领域
1.2安装: pip install opencv-python
1.3案例:

import cv2
# 实现图片美颜效果
# 1 加载图片
image = cv2.imread('pp.jpg')
# 2 实现图片美颜效果value值越大美颜效果越明显 反之越小
value = 25
imgage_dst = cv2.bilateralFilter(image,value,value*2,value/2)# 生成一张图片
cv2.imwrite('pp_new.jpg',imgage_dst)#或者用窗口展示
# # 3 创建一个窗口
# cv2.namedWindow('image')
# # 4 展示窗口
# cv2.imshow('image',imgage_dst)
# # 5 窗口等待
# cv2.waitKey(0)
# # 6 销毁窗口
# cv2.destroyAllWindows()

2、算法(以后遇到类似案例就可以直接调用该方法)
匀速运动公式:
(1) v=v0+at
(2) s=v0t+½at²

#拿到移动轨迹,模仿人的行为,先匀加速后匀减速
def get_tracks(distance):   v = 0   # 初速度t = 0.3    # 以单位时间为0.3s来统计轨迹,即0.3s内的位移tracks = []     # 位置/轨迹列表,列表内的一个元素代表0.3s的位移current = 0     # 当前的位移mid = distance*4/5    # 到达mid值开始减速while current < distance:if current < mid:           a = 2   #加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细else:a = -3v0 = v   # 初速度   s = v0*t+0.5*a*(t**2)    # 0.3秒内的位移current += s    # 当前的位置  tracks.append(round(s))    # 添加轨迹到列表   v = v0 + a*t    # 速度已达到v 该速度作为下次的初速度return tracksprint(get_tracks(27))

3、行为验证(滑块验证)的实现:以登录豆瓣为例
解决方案: selenium(鼠标行为链) + 算法
原理:完全模拟人的行为,按住滑块,拖动到目标缺口位置。

具体思路:
我们将目标图片和目标缺口的距离分成2部分。前面一部分我们就刷的一下拖过去。后面一部分我们可以先匀加速然后在匀减速,这个过程用算法来实现。
按住拖动按钮;拖动到目标缺口 ;松开。

案例:豆瓣登录
(1)切换iframe标签:switch_to.frame()


(2)点击选择登录方式:账号密码登录

(3)我们发现整个滑块验证图片,又是在一个iframe标签中,

所以我们接着切换iframe标签:

(4)定位滑块拖钮,并用鼠标行为链来拖动它:


(5)调用算法来移动剩下的距离

move_to_element_with_offset():鼠标移动到距某个元素(左上角坐标)多少距离的位置
move_by_offset() :鼠标从当前的位置移动多少距离

(6)为了更加自动、循环验证,以致成功,我们也可以编写一个循环(一次验证不成功时,需要点击刷新按钮更新验证图片)。
完整代码:

from selenium import webdriver
from selenium.webdriver import ActionChains
import timedef get_tracks(distance):v = 0t = 0.3tracks = []current = 0mid = distance*4/5while current < distance:if current < mid:a = 2else:a = -3v0 = vs = v0*t+0.5*a*(t**2)current += stracks.append(round(s))v = v0 + a*treturn tracksdriver = webdriver.Chrome(r'C:\Users\Administrator\Desktop\chromedriver_win32\chromedriver.exe')
driver.get('https://www.douban.com/')
# 切换iframe 登录
login_frame = driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
driver.switch_to.frame(login_frame)# 切换登录方式
driver.find_element_by_class_name('account-tab-account').click()
time.sleep(2)
# 定位账号和密码 并输入内容
driver.find_element_by_id('username').send_keys('15989356970')
time.sleep(1)
driver.find_element_by_id('password').send_keys('zq15982197825')
# 点击登录按钮
driver.find_element_by_class_name('btn').click()# 滑块验证图片需要加载
time.sleep(5)
verify_iframe = driver.find_element_by_xpath('//*[@id="tcaptcha_iframe"]')
driver.switch_to.frame(verify_iframe)
time.sleep(2)while True:# 安装开始滑动的按钮 先移动180个像素start_btn = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')ActionChains(driver).click_and_hold(on_element=start_btn).perform()ActionChains(driver).move_to_element_with_offset(to_element=start_btn,xoffset=180,yoffset=0).perform()# 调用工具函数来移动剩下的距离tracks = get_tracks(27)for track in tracks:ActionChains(driver).move_by_offset(xoffset=track,yoffset=0).perform()time.sleep(1)# 释放鼠标ActionChains(driver).release().perform()if driver.title=='登录豆瓣':print('验证失败,再来一次')driver.find_element_by_xpath('//*[@id="reload"]').click()time.sleep(3)else:print('验证成功')break

结果:

爬虫笔记40之反爬系列三:复杂验证码的处理(12306图片验证码、行为验证:selenium鼠标行为链 + 算法)相关推荐

  1. 爬虫笔记41之反爬系列四:字体反爬、JS反爬

    一.字体反爬 1.什么是字体反爬? 开发者创作了一种字体(字体代号):网页中显示的就是这种字体代号. 字体反爬也叫CSS反爬,就是因为这个字体是隐藏在我们css文件当中的一个.ttf文件. ​2.如何 ...

  2. 爬虫笔记38之反爬系列一:ip反爬、

    1.遇到的问题:使用爬虫在爬取数据的时候,如果爬取的频率过快,或者是一些其它的原因,被对方网站识别出来是爬虫程序,这个时候我们的IP就会被面临封杀的危险,一旦IP被封了之后,我们的爬虫程序就无法去爬取 ...

  3. Python爬虫六:字体反爬处理(猫眼+汽车之家)-2018.10

    环境:Windows7 +Python3.6+Pycharm2017 目标:猫眼电影票房.汽车之家字体反爬的处理 ---全部文章: 京东爬虫 .链家爬虫.美团爬虫.微信公众号爬虫.字体反爬.Djang ...

  4. 爬虫之常见的反爬手段和解决思路

    1 服务器反爬的原因 爬虫占总PV(PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv)比例较高,这样浪费钱(尤其是三月份爬虫). 三月份爬虫是个什么概念呢?每年的三月份我们会迎接一次爬虫高 ...

  5. 爬虫中常见的反爬手段和解决方法

    每日分享: 欲成大树,莫与草争:将军有剑,不斩草蝇:遇烂入及时止损,遇烂事及时抽身.格局小的人喜欢诋毁和嫉妒,因为我不好,我也不想让你好.格局大的人都懂得一个道理,强者互帮,弱者互撕.人性最大的愚蠢就 ...

  6. python爬取大众点评_【Python3爬虫】大众点评爬虫(破解CSS反爬)

    本次爬虫的爬取目标是大众点评上的一些店铺的店铺名称.推荐菜和评分信息. 一.页面分析 进入大众点评,然后选择美食(http://www.dianping.com/wuhan/ch10),可以看到一页有 ...

  7. Python爬虫学习第九天---反爬与反反爬

    反爬与反反爬 一.常见反爬手段和解决思路 1.服务器反爬原因 1.爬虫占总PV比例较高,这样浪费钱. 2.三月份爬虫:每年的三月份我们会迎接一次爬虫高峰期,有大量的硕士在写论文的时候会选择爬取一些往网 ...

  8. Python爬虫笔记(3)- 爬取丁香园留言

    Python爬虫笔记(3)- 爬取丁香园留言 爬取丁香园留言:主要用到了模拟登录 爬取丁香园留言:主要用到了模拟登录 import requests, json, re, random,time fr ...

  9. 爬虫-网站地址及反爬机制

    爬虫-网站地址及反爬机制 1.安居客:https://cd.zu.anjuke.com/fangyuan/wuhou/x1/ - requests 2.贝壳找房:https://cd.zu.ke.co ...

最新文章

  1. matlab图像处理命令(一)
  2. 如何在自己开发的日程管理页面插入提醒功能_微信中6个藏得很深但却很有用的功能...
  3. 【css】怎么让Chrome支持小于12px 的文字
  4. 如何提高gps精度_如何在锻炼应用程序中提高GPS跟踪精度
  5. VMM2012应用指南之12- 创建自助服务用户并分配云
  6. 操作系统linux入门,Linux操作系统基础(一)
  7. 取代Win10 消息称Windows 10X将在明年推出
  8. OpenCV实践笔记(1)----图像显示
  9. POJ 1988 Cube Stacking
  10. Android 跟 ios 测试有什么区别
  11. 使用百度地图API在页面添加百度地图应用
  12. 浮点数详解(一篇彻底学通浮点数)
  13. random randint randn
  14. Lucene打分公式详解(TFIDFSimilarity)
  15. JAVA星期健身计划:If语句和Switch语句
  16. 天嵌科技TQ2440的uboot启动流程分析学习笔记
  17. 通过VBA宏合并Excel工作表
  18. 如何使用IP地址链接数据库
  19. [ZT]网站十种常见盈利模式简介
  20. 如何破解迭代评审会七宗罪?

热门文章

  1. NYOJ 304 节能【记忆化搜索】
  2. “中国IT服务管理论坛”2010年全国巡讲拉开帷幕
  3. 计算机软件著作权怎么申请登记
  4. 霍因科技Hi-ETA Hi-SEAHILL加速大数据管理 赋能信创生态建设
  5. 计算机点击右键出现错误,电脑win10,点右键就会出现这个!怎么处理!
  6. 广州工商学院计算机系主任,第二次计算机系教学研讨暨专业自评动员大会
  7. HTML代码学习(上)
  8. 中机云告诉你,云计算有这10大好处|中机智库
  9. python真的好难过张嘉洵_现在好难过怎么办?
  10. 远程协助——帮助你解决电脑问题