大佬教程收集整理的这篇文章主要介绍了京东抢购失败?试试用 python 准时自动抢购 (注释详尽),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
以下环境满足其一即可:
可以不限于以上两种开发环境配置方式。
SELEnium 是一个 python 自动化测试工具c;利用 SELEnium 工具包可以对浏览器网页进行诸如点击和下载内容等操作c;简单实用。
3.1 对于使用单独 python 解释器的情况c;使用命令行 cd 进入解释器安装路径下的 Scripts 路径下c;运行代码 pip install SELEnium
进行安装。
activate root
进入基础环境(有些版本打开时就已经在基础环境 base
下就不用执行这一步)c;接下来再运行代码 pip install SELEnium
进行安装。
3.3 等待安装完成之后运行 python 进入交互式环境c;运行代码 import SELEnium
不报错则表示安装成功。
@H_674_102@
可以不限于使用 Edge 浏览器c;使用 Chromec;FireFox 等都是可以的c;但需要下载对应的驱动。点击链接 https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/进入 edge 驱动下载界面c;勾选稳定版 x64 开始下载c;此处根据自己电脑系统进行选择。
下载得到一个压缩包c;右键点击解压到当前文件夹c;将其中的 msedgedriver.exe 复制到自己当前的项目工程根路径下。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() # 找到登录并点击
由于京东的安全限制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) # 获得要移动的距离
注意在该函数中索引坐标系与一般理解略有不同。
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.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() # 找到提交订单并点击
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 准时自动抢购 (注释详尽)全部内容,希望文章能够帮你解决京东抢购失败?试试用 python 准时自动抢购 (注释详尽)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。