用 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. ansible报错Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this

    安装和配置好ansible,执行命令时报错如下 [root@test01 ansible-install]# ansible test -m shell -a 'w' >> Using a ...

  2. 常用的4个eclipse插件安装过程及使用方法

    最近整合了4个常用eclipse插件安装过程,分别是PMD.checkstyle.findbugs.sourcemonitor插件.因为我这里没有外网,所以所有的插件不是最新版,建议有网的童鞋自行在外 ...

  3. 006_nginx动态upstream和安全检查模块

    一.参考Tengine   http://tengine.taobao.org/document_cn/http_dyups_cn.html ngx_http_dyups_module Descrip ...

  4. Android网络通信(7):NFC

    Android网络通信之 NFC NFC:近场通信,是一种超近距离的无线通信技术.Android从2.3版本的SDK开始支持基于NFC通信.基于NFC的识别和通信可分为三个步骤:1.Android通过 ...

  5. 【前端】三个bug

    目录 一.Array对象的indexOf() 二.使用jquery,clone()下拉框问题 三.jquery获取获取html5的data-*属性 一.Array对象的indexOf() 1.inde ...

  6. echarts饼图不显示数据为0的数据

    首先阐述下为什么会有这个需求,这个和echarts自身的显示效果有关. 如果你选择的展示图形为饼图,然后你的数据里有一条数据为0,那么展示的数据就为一条直线,看上去效果并不好, 会很突兀. 当然如果你 ...

  7. 【mysql】一个很小但很影响速度的地方

    如果要插入一大批数据,千万不要一条一条的execute, commit.而应该是先全部execute,最后统一commit!!! 千万注意,时间差距还是很大的!! 正确示范:快 ): sql = &q ...

  8. linux 下 eclipse 安装

    下载: 官网选择相应安装包下载,我这里下了tar.gz包 安装: tar xzvf eclipse-inst-linux64.tar.gz 设置环境变量 export JAVA_HOME=/usr/l ...

  9. hdu2642二维树状数组单点更新

    碰到这种题一定要注意坐标是不是有序的,也要注意坐标是不是有0的,有的话需要+1处理 #include<bits/stdc++.h> using namespace std; #define ...

  10. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...