用 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 爬虫基础 第十课 图像处理- 极验验证码 (课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 爬虫基础 第八课 selenium (课堂笔记)

    Selenium笔记(1)安装和简单使用 简介 Selenium是一个用于Web应用程序测试的工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, ...

  2. 潭州课堂25班:Ph201805201 爬虫基础 第三课 urllib (课堂笔记)

    Python网络请求urllib和urllib3详解   urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了url ...

  3. 潭州课堂25班:Ph201805201 爬虫基础 第十五课 js破解 二 (课堂笔记)

    PyExecJs使用 PyExecJS是Ruby的ExecJS移植到Python的一个执行JS代码的库. 安装 pip install PyExecJS 例子 >>> import ...

  4. 潭州课堂25班:Ph201805201 爬虫基础 第十二课 点触验证码二 (课堂笔记)

    为上次代码添加 模拟人操作 的鼠标的移动轨迹 # -*- coding:utf-8 -*- # 斌彬电脑 # @Time : 2018/9/14 0014 上午 8:08 from selenium ...

  5. 潭州课堂25班:Ph201805201 爬虫基础 第六课 选择器 (课堂笔记)

    HTML解析库BeautifulSoup4 BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间 ...

  6. 潭州课堂25班:Ph201805201 爬虫基础 第十四课 js破解 (课堂笔记)

    打断点 找要的数据 鼠标的点击事件 新浪微博登录 表单提交分析 : 先佃输入错误密码开始调式 f10 往下走, f11 进入函数 sh + f11 跳出函数 # -*- coding: utf-8 - ...

  7. 潭州课堂25班:Ph201805201 爬虫基础 第十三课 cookie (课堂笔记)

    # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/9/15 0015 4:52 #cookie 是服务器发给浏览器的特殊信息 # 可以理解为一个临时通行证 # ...

  8. 潭州课堂25班:Ph201805201 爬虫基础 第十一课 点触验证码 (课堂笔记)

    打开 网易盾 http://dun.163.com/trial/picture-click  ——在线体验——图中点选 打码平台 ——超级鹰    http://www.chaojiying.com/ ...

  9. 潭州课堂25班:Ph201805201 爬虫基础 第七课 Python与常见加密方式 (课堂笔记)

    打开图形界面  18版 Python与常见加密方式 前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时 ...

随机推荐

  1. freeRTOS中文实用教程4--资源管理互斥

    1.前言 访问一个被多任务共享,或是被任务与中断共享的资源时,需要采用”互斥”技术以保证数据在任何时候都保持一致性.这样做的目的是要确保任务从开始访问资源就具有排它性,直至这个资源又恢复到完整状态 F ...

  2. UML和模式应用4:初始阶段(4)--需求制品之用例模型模板示例

    1. 前言 UP开发包括四个阶段:初始阶段.细化阶段.构建阶段.移交阶段: UP每个阶段包括 业务建模.需求.设计等科目: 其中需求科目对应的需求制品包括:设想.业务规则.用例模型.补充性规格说明.词 ...

  3. jQuery 实现添加表格行,删除行,调用日期控件

    $(function () { getdatepicker(); getdatetimepicker(); }); $(document).on('click','#addTable',addTr); ...

  4. Python3学习笔记11-循环语句

    条件判断使用if,需要加上冒号,当条件判断为True时,执行if下的代码块,为false就什么也不做 只要var1不是0,非空字符串,非空list等,就判断为True.否则为False var1 = ...

  5. 【实践】Yalmip使用Knitro的一些总结

    Yalmip使用Knitro的一些总结 1.软件 Knitro 11.0.1 Win64(包含安装包和确定机器ID的软件):链接:https://pan.baidu.com/s/14IfxlAdo3m ...

  6. C++经典面试题(最全,面中率最高)

    C++经典面试题(最全,面中率最高) 1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与fre ...

  7. oracle 存储过程 clob 字段 调试

    clob 没法直接赋值调试,可以新建一个存储过程,赋值给clob字段,然后调试

  8. haproxy配置基于ssl证书的https负载均衡

    本实验全部在haproxy1.5.19版本进行测试通过,经过测试1.7.X及haproxy1.3版本以下haproxy配置参数可能不适用,需要注意版本号. 一.业务要求现在根据业务的实际需要,有以下几 ...

  9. elasticsearch5.0集群大数据量迁移方法及注意事项

    当es集群的数据量较小的情况下elasticdump这个工具比较方便,但是当数据量达到一定级别比如上百G的时候,elasticdump速度就很慢了,此时我们可以使用快照的方法进行备份 elasticd ...

  10. LinkedList源码分析笔记(jdk1.8)

    1.特点 LinkedList的底层实现是由一个双向链表实现的,可以从两端作为头节点遍历链表. 允许元素为null 线程不安全 增删相对ArrayList快,改查相对ArrayList慢(curd都会 ...