潭州课堂25班:Ph201805201 爬虫基础 第十课 图像处理- 极验验证码 (课堂笔记)
用 python 的 selenium 访问 https://www.huxiu.com/
自动通过验证码
# -*- coding: utf-8 -*-
# 斌彬电脑
# @Time : 2018/9/11 0011 4:38
'''
滑动验证码之 极验 验证码
https://www.huxiu.com/
''' from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains # 动作链
import requests,re
from PIL import Image
from io import BytesIO # 不写入磁盘,显示图片文件
import time, random class JiYan():
def __init__(self):
# 浏览器参数
options = Options()
options.add_argument('--window-size=1366,768')
self.dri = webdriver.Chrome(chrome_options=options)
self.btn = WebDriverWait(self.dri, 10)\ # 访问页面
def to_request(self):
self.dri.get('https://www.huxiu.com/')
# 找到登录按钮
self.btn.until(EC.presence_of_element_located((By.XPATH, '//a[@class="js-login"]'))).click()
# 找到输入框
f = self.btn.until(EC.presence_of_element_located((By.XPATH, '//input[@id="sms_username"]')))
# 输入内容
f.send_keys('13605838837') # 获取验证码图片
def get_img(self):
#
# 没有缺陷的图片
g_img = self.dri.find_elements_by_xpath( '//div[@class="gt_cut_fullbg gt_show"]/div')
# print(len(g_img))
# 拿到图片的 url 和 偏移量
style_list = [i.get_attribute('style') for i in g_img]
# print(style_list)
# 匹配到连接 因为每个连接是一样的,所以只要匹配到一个就行
# 验证码的图片连接
img_url = re.search(r'url\("(.*?)"\);',style_list[0]).group(1)
# print(img_url)
# 图片二进制的值
img_con = requests.get(img_url).content
# 得到完整的验证码
get_po = self.get_img2(style_list, img_con)
# get_po.show() # 显示出来 # 有缺陷的图片
bg_g_img = self.dri.find_elements_by_xpath( '//div[@class="gt_cut_bg gt_show"]/div')
# 拿到图片的 url 和 偏移量
style_list = [i.get_attribute('style') for i in bg_g_img]
# 匹配到连接 因为每个连接是一样的,所以只要匹配到一个就行
# 验证码的图片连接
img_url2 = re.search(r'url\("(.*?)"\);',style_list[0]).group(1)
# print(img_url)
# 图片二进制的值
img_con = requests.get(img_url2).content
# 得到完整的验证码
bg_get_po = self.get_img2(style_list, img_con)
# bg_get_po.show()
# 调用比较函数
return self.contrast(get_po, bg_get_po) # 拼接验证码
def get_img2(self,style_list,image):
# 拿到偏移量
# ?可能有的时候没有
po_list = [re.findall(r'background-position: -(.*?)px -?(.*?)px;', i) for i in style_list]
# print(po_list)
# 新建图片
im_new = Image.new('RGB',(260,116))
im = Image.open(BytesIO(image))
up = 0
dn = 0
for i in po_list[:26]: # 前26个,上半部分
# print(i)
# 左上角x, y 右上角 x, y
cro = im.crop((int(i[0][0]),58, int(i[0][0])+10,116)) # 拿到偏移量,进行裁剪
# up 为粘贴位置
im_new.paste(cro,(up,0)) # 把裁剪下的图片粘贴到新建空白图片上,得到张新图
up += 10 # 每张小图的宽度是10px, for i in po_list[26:]: # 后26个,下半部分
# print(i)
# 左上角x, y 右上角 x, y
cro = im.crop((int(i[0][0]),0, int(i[0][0])+10,58)) # 拿到偏移量,进行裁剪
# up 为粘贴位置
im_new.paste(cro,(dn,58)) # 把裁剪下的图片粘贴到新建空白图片上,得到张新图
dn += 10 # 每张小图的宽度是10px, return im_new # 有缺陷的图片与无缺陷的图片对比,得到距离值
def contrast(self,cut,no_cut):
def contrast_pi(px1,px2):
for i in range(3): # 像素点的差达到指定值(RGB),
if abs(px1[i] - px2[i]) > 50:
return False for i in range(260): # 宽度像素点
for j in range(116): # 高度像素点
px1 = cut.getpixel((i,j)) # 取得第一张每个像素点的值
px2 = no_cut.getpixel((i,j)) # 取得第二张每个像素点的值
if contrast_pi(px1,px2) is False : # 比较两张图片同一位置的像素点的值
# 如果找到两张图片的像素差值达到要求,就返回 i ,得到滑动的距离
return i # 控制浏览器滑动
def slide(self, distance):
# 可见滑动
dis = self.btn.until(EC.visibility_of_element_located((By.XPATH, '//div[@class="gt_slider_knob gt_show"]')))
# 点出不放
ActionChains(self.dri).click_and_hold(dis).perform()
time.sleep(0.5)
# 移动 传入距离的值,X,Y
# ActionChains(self.dri).move_by_offset(distance-5, 0).perform()
for i in self.track(distance-5):
ActionChains(self.dri).move_by_offset(i, 0).perform()
time.sleep(0.6)
# 释放-
ActionChains(self.dri).release(dis).perform() # 模拟人拖动
def track(self,distance):
t = 0.2 # 时间
current = 0 # 当前
mid = distance * 3/5
speed = 0 # 速度
move_distance_list = []
while current < distance: # 当前小于距离时,
if current < mid: # 如果当前小于中间距离
a = 2 # 加速度
else:a = -5
move_distance = speed*t+0.5*a*t*t
move_distance_list.append(round( move_distance )) # 整数添加进列表
speed += (a*t)
current += move_distance offset = sum(move_distance_list) - distance
if offset > 0:
move_distance_list.extend([-1]*offset)
elif offset < 0:
move_distance_list.extend( [1]*abs(offset) )
# - 左移, 0 停止 右移
move_distance_list.extend([-1,-1,-1,-1,-1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,-1.-1.-1.])
return move_distance_list # 让类可以像函数一样调用 h() 执行类
#def __call__(self, *args, **kwargs): h = JiYan()
h.to_request()
time.sleep(2)
distance = h.get_img()
h.slide(distance)

在 linux 下
python 的文字识别库(视觉系统)

进行安装

(视觉系统)要与 pyghon 交互,所以还要安装pytesseract
d
潭州课堂25班:Ph201805201 爬虫基础 第十课 图像处理- 极验验证码 (课堂笔记)的更多相关文章
- 潭州课堂25班:Ph201805201 爬虫基础 第八课 selenium (课堂笔记)
Selenium笔记(1)安装和简单使用 简介 Selenium是一个用于Web应用程序测试的工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, ...
- 潭州课堂25班:Ph201805201 爬虫基础 第三课 urllib (课堂笔记)
Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了url ...
- 潭州课堂25班:Ph201805201 爬虫基础 第十五课 js破解 二 (课堂笔记)
PyExecJs使用 PyExecJS是Ruby的ExecJS移植到Python的一个执行JS代码的库. 安装 pip install PyExecJS 例子 >>> import ...
- 潭州课堂25班:Ph201805201 爬虫基础 第十二课 点触验证码二 (课堂笔记)
为上次代码添加 模拟人操作 的鼠标的移动轨迹 # -*- coding:utf-8 -*- # 斌彬电脑 # @Time : 2018/9/14 0014 上午 8:08 from selenium ...
- 潭州课堂25班:Ph201805201 爬虫基础 第六课 选择器 (课堂笔记)
HTML解析库BeautifulSoup4 BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间 ...
- 潭州课堂25班:Ph201805201 爬虫基础 第十四课 js破解 (课堂笔记)
打断点 找要的数据 鼠标的点击事件 新浪微博登录 表单提交分析 : 先佃输入错误密码开始调式 f10 往下走, f11 进入函数 sh + f11 跳出函数 # -*- coding: utf-8 - ...
- 潭州课堂25班:Ph201805201 爬虫基础 第十三课 cookie (课堂笔记)
# -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/9/15 0015 4:52 #cookie 是服务器发给浏览器的特殊信息 # 可以理解为一个临时通行证 # ...
- 潭州课堂25班:Ph201805201 爬虫基础 第十一课 点触验证码 (课堂笔记)
打开 网易盾 http://dun.163.com/trial/picture-click ——在线体验——图中点选 打码平台 ——超级鹰 http://www.chaojiying.com/ ...
- 潭州课堂25班:Ph201805201 爬虫基础 第七课 Python与常见加密方式 (课堂笔记)
打开图形界面 18版 Python与常见加密方式 前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时 ...
随机推荐
- 数据库的连接使用——使用ADO.NET连接数据库
一.ADO.NET简介 ADO.NET是由很多类组成的一个类库,这些类库提供了很多对象,用来完成数据的连接.查询.插入.更新和删除等操作.其中主要包括以下对象: 1.Connection对象:用来连接 ...
- centos 6.5环境下分布式文件系统MogileFS工作原理及分布式部署实现过程
MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上 MogileFS由3个部分组成: 第1个部分:是server端, ...
- tomcat参数调优
在做java开发时尤其是大型软件开发时经常会遇到内存溢出的问题,比如说OutOfMemoryError等.这是个让开发人员很痛苦.也很纠结的问题,因为我们有时不知道什么样的操作导致了这种问题的发生.所 ...
- Java上传文件FTP服务器代码
1. 在实际的应用重,通常是通过程序来进行文件的上传. 2. 实现java上传文件到ftp服务器中 新建maven项目 添加依赖 <dependency> <groupId>c ...
- vue系列之webstrom开发vue,无法热更新
用vue-cli构建了项目之后在webstorm开发,用npm run dev跑本地服务,经常修改之后在浏览器刷新没反应,偶尔才会有刷新,需要重新跑一遍npm run dev才会更新,这是怎么回事呢? ...
- 并发之AQS原理(一) 原理介绍简单使用
并发之AQS原理(一) 如果说每一个同步的工具各有各的强大,那么这个强大背后是一个相同的动力,它就是AQS. AQS是什么 AQS是指java.util.concurrent.locks包里的Abst ...
- Laravel Cache 缓存钉钉微应用的 Access Token
钉钉微应用的 Access token 如何获取? Access_Token 是企业访问钉钉开放平台全局接口的唯一凭证,即调用接口时需携带Access_Token.从接口列表看,所有接口都需要携带 a ...
- python 全栈开发,Day132(玩具管理页面,控制玩具通讯录,基于请求的好友关系建立)
先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.5.zip 注意:由于涉及到 ...
- 《Java程序性能优化》之程序优化
这一部分主要介绍代码层的优化.了解如何编写高效而精炼的代码,正确的使用函数方法.1.字符串优化处理Java语言中,String对象可以认为是对char数组的眼神和进一步封装.它主要由3部分组成:cha ...
- BZOJ1588 [HNOI2002]营业额统计 set
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1588 题意概括 给出数列,求 ∑F[i],其中F[1] = a[1] , F[i] = min( ...