潭州课堂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中进行加密操作的时 ...
随机推荐
- memcmp与strncmp函数【转】
c中strncmp与memcmp的区别 函数:int memcmp (const void *a1, const void *a2, size_t size) 函数memcmp用于比较字 ...
- HTML学习笔记01-HTML简介
主要是为了做接口测试,试着自己写爬虫,所以学习一下HTML一些基础的东西,方便用来解析网页.学习内容主要来自菜鸟教程的HTML教程,W3school的HTML 超文本标记语言(英语:HyperText ...
- dubbo 一个接口多个实现
<dubbo:service ref="dubboGroupService1" interface="com.yncp.dubbo.service.IDubboGr ...
- S5PV210初始化系统时钟
S5PV210初始化系统时钟 S5PV210时钟体系S5PV210中包含3大类时钟domain,分别是主系统时钟domain (简称MSYS,下面将使用简称来进行相关讲解).显示相关的时钟domain ...
- pyspark遇到报错:_PYSPARK_DRIVER_CONN_INFO_PATH
1. 环境 : centos,启动pyspark,执行如下python命令: import pyspark from pyspark import SparkContext from pyspark ...
- Eclipse开发环境配置
1. java环境 安装 本系统使用java6开发,老师使用1.6.0 _45版本开发,如下图所示: "开发工具"目录提供了1.6.0 _45版本32位和64位两个安装程序,大家根 ...
- 性能测试二十五:redis-cli 命令总结
常用命令dbsize:查看redis中的kv数量 keys *:查看redis中所有的keyset key_1 v_1:新增一个key_1,包含v_1get key_1:查看key_1中的内容del ...
- 主机可以ping通虚拟机,但是虚拟机ping不通主机的方法(转)
https://blog.csdn.net/hskw444273663/article/details/81301470
- 2018-2019-2 网络对抗技术 20165333 Exp2 后门原理与实践
实验内容 1.使用netcat获取主机操作Shell,cron启动 2.使用socat获取主机操作Shell, 任务计划启动 3.使用MSF meterpreter(或其他软件)生成可执行文件,利用n ...
- VMware虚拟机 Ubuntu 16.04 安装
第一步:VMware虚拟机 Ubuntu 16.04 安装 第二步: 解决窗口全屏问题 linux下给root用户设置密码 修改root用户的密码 $ sudo passwd root 密码会要求重复 ...