selenium登录 京东滑动验证码

京东的滑动验证码在页面上是没有原图的,所有我是用ps把他们拼成一个的。

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
import time
import random

def if_is_s(img_1, img_2):#判断是不是跟比较的是一张图
    a = 0
    for i in range(1, img_1.size[1]):
        for j in range(1, 3):
            rgb1 = img_1.load()[i, j]
            rgb2 = img_2.load()[i, j]
            res1 = abs(rgb1[0] - rgb2[0])
            res2 = abs(rgb1[1] - rgb2[1])
            res3 = abs(rgb1[2] - rgb2[2])
            if res1 < 10 and res2 < 10 and res3 < 10:
                a += 1
            else:
                a = 0
            if a > 50:
                return True
    return False
def get_distance(image1,image2):#找出需要滑动的距离
    a = 0
    threshold=60
    left=57
    for i in range(left,image1.size[0]):
        for j in range(image1.size[1]):
            rgb1=image1.load()[i,j]
            rgb2=image2.load()[i,j]
            res1=abs(rgb1[0]-rgb2[0])
            res2=abs(rgb1[1]-rgb2[1])
            res3=abs(rgb1[2]-rgb2[2])
            if not (res1 < threshold and res2 < threshold and res3 < threshold):
                a += 1
                return i+20
    return i+20

def get_tracks(distance):#这是滑动轨迹的,京东的滑动轨迹很恶心,这个也是有时可以有时不行
    tracks = []
    current = 0
    mid = distance * 4 / 5
    t = 0.2
    v = 0
    while current < distance:
        if current < mid:
            a = random.uniform(2, 5)
        else:
            a = -(random.uniform(12.5, 13.5))
        v0 = v
        v = v0 + a * t
        x = v0 * t + 1 / 2 * a * (t ** 2)
        current += x
        if 0.6 < current - distance < 1:
            x = x - 0.53
            tracks.append(round(x, 2))
        elif 1 < current - distance < 1.5:
            x = x - 1.4
            tracks.append(round(x, 2))
        elif 1.5 < current - distance < 3:
            x = x - 1.8
            tracks.append(round(x, 2))
        else:
            tracks.append(round(x, 2))
    if sum(tracks) > distance:
        i = sum(tracks) - distance
        tracks[-1] = round(tracks[-1] - i, 2)
    i = random.uniform(1, 3  )
    i = round(i, 2)
    zz = random.uniform(0.1, 0.3)
    tracks[-1] = round(tracks[-1] + i, 2)
    i = round(i - zz, 2)
    tracks.append(-i)
    if sum(tracks) < distance:
        si = distance - sum(tracks)
        tracks.append(round(si, 2))
    print(tracks, sum(tracks))
    return tracks

if __name__==‘__main__‘:
    browser = webdriver.Firefox()
    browser.get(‘https://passport.jd.com/new/login‘)
    butt = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,‘link-login‘)))
    butt.click()
    butt = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.XPATH,‘//a[@clstag="pageclick|keycount|login_pc_201804112|10"]‘)))
    butt.click()
    user = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID,‘loginname‘)))
    password = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.ID,‘nloginpwd‘)))
    user.send_keys(‘xxx‘)
    time.sleep(2)
    password.send_keys(‘xxx‘)
    izsz = 1
    while izsz == 1:#无限循环直到登录成功
        try:
            button = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,‘btn-img.btn-entry‘)))
            time.sleep(2)
            button.click()
            time.sleep(2)
            browser.save_screenshot(‘1.png‘)#截图
            page_snap_obj = Image.open(‘1.png‘)
            img = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,‘JDJRV-bigimg‘)))
            local = img.location
            size = img.size
            top = local[‘y‘]
            bottom = local[‘y‘] + size[‘height‘]
            left = local[‘x‘]
            right = local[‘x‘] + size[‘width‘]
            img_1 = Image.open(‘index2.png‘)
            img_2 = page_snap_obj.crop((left, top, right, bottom))#裁剪图片尺寸
            img_2.save(‘2.png‘)#保存
            i = if_is_s(img_1,img_2)#判断是不是一张图,不是点击换一张
            while not i:
                time.sleep(2)
                butt = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CLASS_NAME,‘JDJRV-img-refresh‘)))
                butt.click()
                time.sleep(2)
                browser.save_screenshot(‘1.png‘)
                page_snap_obj = Image.open(‘1.png‘)
                img = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, ‘JDJRV-bigimg‘)))
                local = img.location
                size = img.size
                top = local[‘y‘]
                bottom = local[‘y‘] + size[‘height‘]
                left = local[‘x‘]
                right = local[‘x‘] + size[‘width‘]
                img_1 = Image.open(‘index2.png‘)
                img_2 = page_snap_obj.crop((left, top, right, bottom))
                img_2.save(‘2.png‘)
                time.sleep(2)
                i = if_is_s(img_1, img_2)
            ji = get_distance(img_1, img_2)
            print(ji)
            tracks = get_tracks(ji)
            ijs = len(tracks)//5*3
            tracks1 = tracks[:ijs]#对滑动轨迹继续改变
            tracks2 = tracks[ijs:]
            z = sum(tracks1)
            tracks2.insert(0,z)
            tracks2.insert(0,0)
            button = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.XPATH, ‘//div[@class="JDJRV-slide-inner JDJRV-slide-btn"]‘)))
            ActionChains(browser).click_and_hold(button).perform()
            for track in tracks:
                ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform()

            time.sleep(0.5)  # 0.5秒后释放鼠标
            ActionChains(browser).release().perform()
            url = browser.current_url
            if ‘https://passport.jd.com/new/login.aspx?‘ in str(url):
                izsz = 1
            else:
                izsz = 0
        except:
            izsz = 1

难点就在滑动的轨迹太容易被抓,而且一种用多了也会被识别。

git https://github.com/18370652038/jd.git

原文地址:https://www.cnblogs.com/dayouzi/p/10091102.html

时间: 2024-08-30 08:08:55

selenium登录 京东滑动验证码的相关文章

selenium处理极验滑动验证码

要爬取一个网站遇到了极验的验证码,这周都在想着怎么破解这个,网上搜了好多知乎上看到有人问了这问题https://www.zhihu.com/question/28833985,我按照这思路去大概实现了一下. 1.使用htmlunit(这种方式我没成功,模拟鼠标拖拽后轨迹没生成,可以跳过) 我用的是java,我首先先想到了用直接用htmlunit,我做了点初始化 private void initWebClient() { if (webClient != null) { return; } we

【Mac + Python + Selenium】之获取验证码图片code并进行登录

初稿代码,可以忽略不计(自己留着看) #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2020/01/15 13:27 # @Author : zc # @File : 115test.py from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep from PIL import Image,Im

破解极验滑动验证码

阅读目录 一 介绍 二 实现 三 说明 一 介绍 一些网站会在正常的账号密码认证之外加一些验证码,以此来明确地区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定,如下 但一些网站加入了滑动验证码,最典型的要属于极验滑动认证了,极验官网:http://www.geetest.com/,下图是极验的登录界面 现在极验验证码已经更新到了 3.0 版本,截至 2017 年 7 月全球已有十六万家企业正在使用极验,每天服务响应超过四亿次,广泛应用于直播视频.金融服务.

python爬虫21 | 对于b站这样的滑动验证码,不好意思,照样自动识别

今天 要来说说滑动验证码了 大家应该都很熟悉 点击滑块然后移动到图片缺口进行验证 现在越来越多的网站使用这样的验证方式 为的是增加验证码识别的难度 那么 对于这种验证码 应该怎么破呢 接下来就是 学习 python 的正确姿势 打开 b 站的登录页面 https://passport.bilibili.com/login 可以看到登录的时候需要进行滑块验证 按下 F12 进入 Network 看下我们将滑块移到缺口松开之后做了什么提交 可以看到是一个 GET 请求 但是 这请求链接也太特么长了吧

淘宝滑动验证码研究

引言 悠闲的时候,总会去找些事做做.前些天在登录淘宝的时候,发现了滑动验证码,虽然已经不是什么新事物,但还是产生了很大的兴趣. 传统的字符输入验证码,变为了滑动验证码,这一看就是产品大师的手笔啊,不知道申请专利没有. 这种“情感化”的验证码设计,可破解度高不高呢?如果是可破解度高,那就真是验证码的一次革命变新了.还是让我先了解一下滑动验证码的资料吧! 没有Google就百度,搜一搜,让我很震惊,一般搜技术的东西,大多数来源于csdn,blogs.cn,更牛批一点的是来源于stackoverflo

selenium高效刷新图验证码

使用场景:项目中用selenium驱动chrome在网页中登录,但是登录有图形验证码,想刷新验证码时,模拟点击图片刷新,但是由于点击后图片是异步加载,所以无法得知新图片什么时候加载完成,就用wait等待3s后,再截返回图验证码图片.但是这样刷新验证码很慢,体验不好. 解决思路:打开一个新标签页,然后get请求图片验证码url.再截返回图验证码图片.由于get是阻塞的,所以不用判断图片加载状态问题. 编码设置: /** * 刷新图形验证码,通过在新标签get方式(同步)获取图形验证码,达到实时响应

1 如何引用第三方滑动验证码

参考:极验科技:https://docs.geetest.com/install/deploy/server/python 1 安装requests pip install requests 2 拷贝你在网站上下载好的软件包下面的sdk下面的geetest文件到你的项目utils目录下面 3 拷贝代码到views.py from utils.geetest import GeetestLib # 导入滑动验证码的模块 #请在官网申请ID使用,示例ID不可使用 pc_geetest_id = "b

VUE中使用geetest滑动验证码

一,准备工作:服务端部署 下载文件gt.gs: https://github.com/GeeTeam/gt3-python-sdk 需要说明的是这里的gt.js文件,它用于加载对应的验证JS库. 1.引入初始化函数 main.js import '../static/global/gt.js' 2.调用初始化函数进行初始化 api.js // 滑动验证码api export const getGeetest = ()=> { return Axios.get('captcha_check/')

滑动验证码验证

selenium +chrome+ firefox + webdriver 遇到的坑 lunix中启动webdriver时报错一: 测试代码为: #!/usr/bin/python   # -*- coding: utf-8 -*-       from selenium import webdriver     driver = webdriver.Firefox()   driver.get("https://www.baidu.com") 运行报错信息如下: Traceback