潭州课堂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中进行加密操作的时 ...
随机推荐
- 关于出现Not an editor command: Bundle '**/*.vim'的解决方案【转】
转自:https://blog.csdn.net/YHM07/article/details/49717933 操作系统: $ uname -r 2.6.32-573.7.1.el6.x86_64 $ ...
- OpenWrt启动过程分析+添加自启动脚本【转】
一.OpenWrt启动过程分析 转自: http://www.eehello.com/?post=107 总结一下OpenWrt的启动流程:1.CFE->2.linux->3./etc/p ...
- mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)
一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...
- WPF 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项
1.检查代码不存在问题,最后找到问题,Nut管理包没有安装CefSharp.wpf. 2.安装对应的版本即可.
- PYTHON-模块 logging hashlib
'''import logging # 1. 控制日志级别# 2. 控制日志格式# 3. 控制输出的目标为文件logging.basicConfig(filename='access.log', fo ...
- for循环输出数组中的分数
示例 var scores = [24, 32, 17]; // A数组 var arrayLength = scores.length;// 数组的长度 //当i<arrayLength时,可 ...
- ERP完善合同起草(二十八)
前端的代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CRMCont ...
- Pycharm里面使用PIL库之后,为什么调用Image的方法不能弹出代码提示,怎样能让代码提示弹出?
之前也碰到了这个问题,安装了pillow后没有代码提示,最后查了半天,发现问题原来非常简单,解决方法也很无厘头. 之所以没有代码提示,仅仅是因为Pycharm没法判断Image.open()返回的对象 ...
- python全栈开发day45-DOM操作、对象、定时器
一.昨日内容回顾 1.内置对象 Array String Date Math 2.DOM事件三要素:事件源.事件.事件驱动程序 事件源,事件,事件驱动程序 3.获取事件源的三种方式 var oDiv ...
- python全栈开发day33-进程间的通信、进程间的数据共享,进程池
一.昨日内容回顾: 1. 守护进程 1).p.saemon, 2 ).p.terminate 3 ).p.join 2. 同步控制 1).锁,Lock 互斥锁,解决数据安全.进程之间资源抢占问题. ...