程序笔记   发布时间:2022-07-14  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了京东抢购失败?试试用 python 准时自动抢购 (注释详尽)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

文章目录

    @H_262_11@
      @H_262_11@
        @H_262_11@1. 问题分析@H_262_11@2. 基础情况@H_262_11@3. 安装 SELEnium@H_262_11@4. 下载 Edge 浏览器驱动@H_262_11@5. 登录网页京东@H_262_11@6. 滑动验证登录@H_262_11@7. 自动购买商品@H_262_11@8. 完整实现源码@H_262_11@结 语@H_262_11@参博客

1. 问题分析

    @H_262_11@在京东上抢购商品老是失败࿰c;在提交订单时发现已经没货࿰c;由此确定京东已经抢到的标志是提交订单࿰c;有时好像是付款才算抢到成功。预售商品然可以加入购物车࿰c;但却是不可选的࿰c;因此在自动抢购过程中必须先勾选。@H_262_11@一般京东抢购的过程是:登录账号 → 进入购物车 → 选择抢购商品 → 点击去结算 → 点击提交订单 → 选择付款方式并付款。基于这种情况利用 python 代码实现自动登录京东账号࿰c;自动滑动验证码进行验证࿰c;自动勾选购物车商品并提交订单࿰c;剩下的付款操作手动进行。

京东抢购失败?试试用 python 准时自动抢购 (注释详尽)

2. 基础情况

以下环境满足其一即可:

    @H_262_11@已安装 python 解释器和 Pycharm 软件࿰c;已切换镜像源并绑定。@H_262_11@已安装 Anaconda 软件和 Pycharm 软件并绑定 Anaconda 自带的 python 解释器࿰c;已切换镜像源并绑定。

可以不限于以上两种开发环境配置方式。

3. 安装 SELEnium

SELEnium 是一个 python 自动化测试工具࿰c;利用 SELEnium 工具包可以对浏览器网页进行诸如点击和下载内容等操作࿰c;简单实用。

3.1 对于使用单独 python 解释器的情况࿰c;使用命令行 cd 进入解释器安装路径下的 Scripts 路径下࿰c;运行代码 pip install SELEnium 进行安装。

京东抢购失败?试试用 python 准时自动抢购 (注释详尽)

3.2 对于使用 Anaconda 自带 python 解释器的情况࿰c;打开 Anaconda Prompt࿰c;运行代码 activate root 进入基础环境(有些版本打开时就已经在基础环境 base 下就不用执行这一步)࿰c;接下来再运行代码 pip install SELEnium 进行安装。

京东抢购失败?试试用 python 准时自动抢购 (注释详尽)

3.3 等待安装完成之后运行 python 进入交互式环境࿰c;运行代码 import SELEnium 不报错则表示安装成功。

@H_674_102@

4. 下载 Edge 浏览器驱动

可以不限于使用 Edge 浏览器࿰c;使用 Chrome࿰c;FireFox 等都是可以的࿰c;但需要下载对应的驱动。点击链接 https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/进入 edge 驱动下载界面࿰c;勾选稳定版 x64 开始下载࿰c;此处根据自己电脑系统进行选择。

京东抢购失败?试试用 python 准时自动抢购 (注释详尽)

下载得到一个压缩包࿰c;右键点击解压到当前文件夹࿰c;将其中的 msedgedriver.exe 复制到自己当前的项目工程根路径下。

京东抢购失败?试试用 python 准时自动抢购 (注释详尽)

5. 登录网页京东

5.1 先打开 edge 浏览器并最大化窗口࿰c;进入京东登录界面。

driver @H_772_127@= webdriver.Edge(executable_path@H_772_127@='./msedgedriver.exe')  # 打开 Edge 浏览器
driver.@H_475_128@maximize_window()  # 最大化 Edge 浏览器窗口
driver.get('https://passport.jd.com/new/login.aspx')  # 京东登录界面链接

5.2 选择账户登录选项࿰c;自动输入用户名和密码c;最后点击登录。

driver.find_elemenT_By_link_text("账户登录").click()  # 选择账户登录并点击
driver.implicitly_wait(2)  # 隐式等待 2 秒
driver.find_elemenT_By_id("loginname").send_keys(username)  # 找到用户名输入框并输入用户名
driver.implicitly_wait(2)  # 隐式等待 2 秒
driver.find_elemenT_By_id("nloginpwd").send_keys(password)  # 找到密码输入框输入密码
driver.implicitly_wait(2)  # 隐式等待 2 秒
driver.find_elemenT_By_id("loginsubmit").click()  # 找到登录并点击

6. 滑动验证登录

由于京东的安全限制࿰c;点击登录之后需要进行滑动验证才能完成登录࿰c;滑动验证码本身由两幅图像组成࿰c;一个作为可滑动的小滑块࿰c;一个是缺失滑块结构的背景。

6.1 首先获取滑动验证码的两幅图像࿰c;灰度化处理后保存到本地。

image_big_path @H_772_127@= r'//div/div[@class="JDJRV-bigimg"]/img'  # 滑动验证码大图(大背景)
image_small_path @H_772_127@= r'//div/div[@class="JDJRV-smallimg"]/img'  # 滑动验证码小图(小滑块)

image_big @H_772_127@= driver.find_elemenT_By_xpath(image_big_path).get_attribute("src")  # 验证码背景图的完整路径
image_small @H_772_127@= driver.find_elemenT_By_xpath(image_small_path).get_attribute("src")  # 验证码滑块图的完整路径

request.urlretrieve(image_big, 'BACkground.jpg')  # 下载验证码背景图到本地
request.urlretrieve(image_small, 'slideblock.jpg')  # 下载验证码滑块图到本地

cv2.imwrite('BACkground.jpg', cv2.imread('BACkground.jpg', 0))  # 将验证码背景图读取为灰度图并覆盖原图

slideblock @H_772_127@= cv2.imread('slideblock.jpg', 0)  # 将验证码滑块图读取为灰度图
slideblock @H_772_127@= abs(255 @H_772_127@- slideblock)  # 对验证码滑块图反灰化处理
cv2.imwrite('slideblock.jpg', slideblock)  # 保存处理后的验证码滑块图

BACkground @H_772_127@= cv2.imread('BACkground.jpg')  # 读取验证码背景图(灰度)
slideblock @H_772_127@= cv2.imread('slideblock.jpg')  # 读取验证码滑块图(灰度)

6.2 再利用 opencv 中的模板匹配函数 @H_713_75@matchTemplate 得到滑块图像在背景上的相似度矩阵。

result @H_772_127@= cv2.@H_475_128@matchTemplate(BACkground, slideblock, cv2.TM_CCOEFF_NORMED)  # 模板匹配࿰c;获得滑块在背景上的相似度矩阵

6.3 利用 numpy 中的元素索引函数 unravel_index 获取匹配度最大值在原相似度矩阵中的索引。

_, distance @H_772_127@= np.unravel_index(result.argmax(), result.shape)  # 获得要移动的距离

注意在该函数中索引坐标系与一般理解略有不同。

京东抢购失败?试试用 python 准时自动抢购 (注释详尽)

6.4 模拟人越来越快地移动滑块到指定位置。由于京东的安全管制࿰c;必须采取一定的滑块移动策略才能尽量不被检测出来非手动࿰c;实际实验中滑动验证正确的步数也是不确定的࿰c;大概 1~10 步左右。

dist_finished @H_772_127@= 0  # 已经移动的距离
dist_remaining @H_772_127@= distance  # 剩余的距离
dist_move @H_772_127@= 5  # 每次移动的距离

element @H_772_127@= driver.find_elemenT_By_xpath(button_slide)  # 选取滑动验证码滑块
ActionChains(driver).click_and_hold(element).perform()  # 模拟鼠标在滑块上点击并保持

# 模拟滑动开始和滑动结束时比较慢࿰c;中间阶段比较快
while dist_remaining @H_772_127@> 0:

    dist_move @H_772_127@+= dist_move  # 不断加速地移动滑块

    # 每次移动滑块都带有正负偏差来模拟手动移动时的滑动不稳定
    ActionChains(driver).@H_475_128@move_by_offset(dist_move, random.randint(@H_772_127@-3, 3)).perform()  # 模拟鼠标水平向右拖动滑块

    dist_remaining @H_772_127@-= dist_move  # 剩余距离减去已移动的距离
    dist_finished @H_772_127@+= dist_move  # 已完成距离加上已移动的距离

ActionChains(driver).@H_475_128@move_by_offset(dist_remaining, random.randint(@H_772_127@-3, 3)).perform()  # 模拟鼠标水平回移拖动滑块修正
ActionChains(driver).release(on_element@H_772_127@=element).perform()  # 模拟松开鼠标

7. 自动购买商品

7.1 登录成功后点击我的购物车打开另一个浏览器页面。

driver.implicitly_wait(2)  # 隐式等待 2 秒
driver.find_elemenT_By_link_text("我的购物车").click()  # 找到我的购物车并点击

7.2 全选购物车中的商品࿰c;点击结算并提交订单。

driver.implicitly_wait(2)  # 隐式等待 2 秒
driver.find_elemenT_By_name('SELEct-all').click()  # 购物车全选
time.sleep(0.5)  # 等待 0.5 秒
driver.find_elemenT_By_link_text("去结算").click()  # 找到去结算并点击
driver.implicitly_wait(2)  # 隐式等待 2 秒
driver.find_elemenT_By_id("order-submit").click()  # 找到提交订单并点击

8. 完整实现源码

import cv2
import time
import random
import datetiR_762_11845@e
import numpy as np
from urllib import request
from SELEnium import webdriver
from SELEnium.webdriver.common.action_chains import ActionChains


# 移动滑动验证码中的滑块
def checkMove(button_slide, distance):
    dist_finished @H_772_127@= 0  # 已经移动的距离
    dist_remaining @H_772_127@= distance  # 剩余的距离
    dist_move @H_772_127@= 5  # 每次移动的距离

    element @H_772_127@= driver.find_elemenT_By_xpath(button_slide)  # 选取滑动验证码滑块
    ActionChains(driver).click_and_hold(element).perform()  # 模拟鼠标在滑块上点击并保持

    # 模拟滑动开始和滑动结束时比较慢࿰c;中间阶段比较快
    while dist_remaining @H_772_127@> 0:

        dist_move @H_772_127@+= dist_move  # 不断 加速移动滑块

        # 每次移动滑块都带有正负偏差来模拟手动移动时的滑动不稳定
        ActionChains(driver).@H_475_128@move_by_offset(dist_move, random.randint(@H_772_127@-3, 3)).perform()  # 模拟鼠标水平向右拖动滑块

        dist_remaining @H_772_127@-= dist_move  # 剩余距离减去已移动的距离
        dist_finished @H_772_127@+= dist_move  # 已完成距离加上已移动的距离

    ActionChains(driver).@H_475_128@move_by_offset(dist_remaining, random.randint(@H_772_127@-3, 3)).perform()  # 模拟鼠标水平回移拖动滑块修正
    ActionChains(driver).release(on_element@H_772_127@=element).perform()  # 模拟松开鼠标


# 获取滑动验证码构成的两张图片并计算应移动的距离
def getcheckImage():
    image_big_path @H_772_127@= r'//div/div[@class="JDJRV-bigimg"]/img'  # 滑动验证码大图(大背景)
    image_small_path @H_772_127@= r'//div/div[@class="JDJRV-smallimg"]/img'  # 滑动验证码小图(小滑块)
    button_slide @H_772_127@= '//div[@class="JDJRV-slide-inner JDJRV-slide-btn"]'  # 滑动验证码滑块按钮

    image_big @H_772_127@= driver.find_elemenT_By_xpath(image_big_path).get_attribute("src")  # 验证码背景图的完整路径
    image_small @H_772_127@= driver.find_elemenT_By_xpath(image_small_path).get_attribute("src")  # 验证码滑块图的完整路径

    request.urlretrieve(image_big, 'BACkground.jpg')  # 下载验证码背景图到本地
    request.urlretrieve(image_small, 'slideblock.jpg')  # 下载验证码滑块图到本地

    cv2.imwrite('BACkground.jpg', cv2.imread('BACkground.jpg', 0))  # 将验证码背景图读取为灰度图并覆盖原图

    slideblock @H_772_127@= cv2.imread('slideblock.jpg', 0)  # 将验证码滑块图读取为灰度图
    slideblock @H_772_127@= abs(255 @H_772_127@- slideblock)  # 对验证码滑块图反灰化处理
    cv2.imwrite('slideblock.jpg', slideblock)  # 保存处理后的验证码滑块图

    BACkground @H_772_127@= cv2.imread('BACkground.jpg')  # 读取验证码背景图(灰度)
    slideblock @H_772_127@= cv2.imread('slideblock.jpg')  # 读取验证码滑块图(灰度)

    result @H_772_127@= cv2.@H_475_128@matchTemplate(BACkground, slideblock, cv2.TM_CCOEFF_NORMED)  # 模板匹配࿰c;获得滑块在背景上的相似度矩阵
    _, distance @H_772_127@= np.unravel_index(result.argmax(), result.shape)  # 获得要移动的距离

    return button_slide, distance


# 滑动验证
def slidEIDentify():
    slideButton, distance @H_772_127@= getcheckImage()  # 获取滑块和滑块需要移动的距离
    print(f'本次滑块需要移动的距离为: {distance}')  # 打印滑块需要移动的距离
    checkMove(slideButton, distance @H_772_127@/ 1.3)  # 移动滑块࿰c;1.3 是一个实验修正值


# 登录京东网页版
def login(username, password):

    driver.get('https://passport.jd.com/new/login.aspx')  # 京东登录界面链接

    driver.implicitly_wait(2)  # 隐式等待 2 秒
    driver.find_elemenT_By_link_text("账户登录").click()  # 找到账户登录并点击

    driver.implicitly_wait(2)  # 隐式等待 2 秒
    driver.find_elemenT_By_id("loginname").send_keys(username)  # 找到用户名输入框并输入用户名

    driver.implicitly_wait(2)  # 隐式等待 2 秒
    driver.find_elemenT_By_id("nloginpwd").send_keys(password)  # 找到密码输入框输入密码

    driver.implicitly_wait(2)  # 隐式等待 2 秒
    driver.find_elemenT_By_id("loginsubmit").click()  # 找到登录并点击

    while True:
        try:
            slidEIDentify()  # 进行滑动验证
            time.sleep(2)  # 等待 3 秒
        except:
            print("登录成功")
            break


# 定时购买东西
def buy(buy_time):
    driver.implicitly_wait(2)  # 隐式等待 2 秒
    driver.find_elemenT_By_link_text("我的购物车").click()  # 找到我的购物车并点击

    @R_462_10586@l_windows @H_772_127@= driver.window_handles  # 所有打开的窗口
    driver.switch_to.window(@R_462_10586@l_windows[1])  # 句柄迁移到第二个窗口

    while True:
        current_time @H_772_127@= datetiR_762_11845@e.datetiR_762_11845@e.now()  # 获取当前日期时间
        if current_time.strftime('%Y-%m-%d %H:%M:%S') @H_772_127@== buy_time:  # 如果当前时间等于指定购买时间
            driver.implicitly_wait(2)  # 隐式等待 2 秒
            driver.find_elemenT_By_name('SELEct-all').click()  # 购物车全选
            time.sleep(0.5)  # 等待 0.5 秒
            driver.find_elemenT_By_link_text("去结算").click()  # 找到去结算并点击
            driver.implicitly_wait(2)  # 隐式等待 2 秒
            driver.find_elemenT_By_id("order-submit").click()  # 找到提交订单并点击
            driver.implicitly_wait(2)  # 隐式等待 2 秒
            print('current time : ' @H_772_127@+ current_time.strftime('%Y-%m-%d %H:%M:%S'))  # 打印当前时间
            print('购买成功 !')  # 购买成功


if __name__ @H_772_127@== '__main__':
    driver @H_772_127@= webdriver.Edge(executable_path@H_772_127@='./msedgedriver.exe')  # 打开 Edge 浏览器
    driver.@H_475_128@maximize_window()  # 最大化 Edge 浏览器窗口
    login('你的用户名', '你的密码')  # 登录京东
    buy('2021-08-14 12:00:00')  # 定时购买

结 语

网页自动化操作确实可以实现抢购商品࿰c;相比手动操作会更快࿰c;但仅靠上述代码想与某些专业抢购的服务器进行比较还是相去甚远。如果有需要可以尝试一下࿰c;就当是一个 python 实战项目学习。

京东抢购失败?试试用 python 准时自动抢购 (注释详尽)

博客

    @H_262_11@https://blog.csdn.net/netuser1937/article/details/111594315@H_262_11@https://blog.csdn.net/jolly10/article/details/109516130@H_611_1717@

大佬总结

以上是大佬教程为你收集整理的京东抢购失败?试试用 python 准时自动抢购 (注释详尽)全部内容,希望文章能够帮你解决京东抢购失败?试试用 python 准时自动抢购 (注释详尽)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。