Python算法
基于 Python 和 Selenium 的自动化抢票脚本实现
使用 Python 和 Selenium 库实现自动化抢票的技术方案。核心内容包括模拟人类滑动轨迹以通过滑块验证、处理浏览器指纹特征(如使用 stealth.min.js)、以及执行登录和下单流程。代码展示了匀加速与匀减速的位移计算逻辑,并演示了如何通过 ActionChains 操作浏览器元素完成交互。该方案适用于学习 Web 自动化测试及反爬虫对抗技术。

使用 Python 和 Selenium 库实现自动化抢票的技术方案。核心内容包括模拟人类滑动轨迹以通过滑块验证、处理浏览器指纹特征(如使用 stealth.min.js)、以及执行登录和下单流程。代码展示了匀加速与匀减速的位移计算逻辑,并演示了如何通过 ActionChains 操作浏览器元素完成交互。该方案适用于学习 Web 自动化测试及反爬虫对抗技术。

import time
from info import PHONE, PASSWORD
from selenium import webdriver
拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速。
def get_tracks(distance):
# 初速度
v = 5
# 单位时间为 0.2s 来统计轨迹,轨迹即 0.2s 内的位移
t = 0.2
# 位移/轨迹列表,列表内的一个元素代表 0.2s 的位移
tracks = []
# 当前的位移
current = 0
# 到达 mid 值开始减速
mid = distance * 4 / 5
while current < distance:
if current < mid:
# 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
a = 8
else:
a = -3
# 初速度
v0 = v
# 0.2 秒时间内的位移
s = v0 * t + 0.5 * a * (t ** 2)
# 当前的位置
current += s
# 添加到轨迹列表
tracks.append(round(s))
# 速度已经达到 v,该速度作为下次的初速度
v = v0 + a * t
return tracks
# 1.1 打开浏览器
# TODO: 初始化 options 对象以配置 ChromeOptions
driver = webdriver.Chrome(options=options)
f = open('stealth.min.js', mode='r', encoding='utf-8').read()
# 移除 selenium 当中爬虫的特征
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': f})
# 1.2 打开登录网页
# TODO: 设置 login_url
driver.get(login_url)
# 1.3 输入账号,输入密码,点击登录 (滑块)
try:
# 进入内嵌页面
driver.switch_to.frame(0)
# 账号输入框:#fm-login-id
driver.find_element_by_css_selector('#fm-login-id').send_keys(PHONE)
# 密码输入框:#fm-login-password
driver.find_element_by_css_selector('#fm-login-password').send_keys(PASSWORD)
time.sleep(1)
# 为什么会出现滑块,用 selenium 打开的浏览器,和正常用户打开的浏览器不同
# 过滑块
driver.switch_to.frame(0)
slider = driver.find_element_by_css_selector('#nc_1_n1z')
# 让鼠标执行 点击并且保持按住元素
webdriver.ActionChains(driver).click_and_hold(on_element=slider).perform()
# 横向移动鼠标
webdriver.ActionChains(driver).move_by_offset(xoffset=260, yoffset=0).perform()
# 松开鼠标
webdriver.ActionChains(driver).pause(0.5).release().perform()
driver.switch_to.parent_frame()
except:
print("没有遇到滑块")
# 登录按钮:#login-form > div.fm-btn > button
driver.find_element_by_css_selector('#login-form > div.fm-btn > button').click()
time.sleep(2)
# 2.1 打开抢购页面
# TODO: 设置 target_url
driver.get(target_url)
# 2.2 点击立即购买
driver.find_element_by_css_selector('.buybtn').click()
# 2.3 点击观影人
driver.find_element_by_css_selector('.ticket-buyer-select .next-checkbox-label').click()
# 2.4 点击同意并提交
driver.find_element_by_css_selector('.submit-wrapper .next-btn.next-btn-normal.next-btn-medium').click()
time.sleep(2)
driver.switch_to.frame(0)
slider2 = driver.find_element_by_css_selector('#nc_1_n1z')
tracks = get_tracks(300) # 剩下的 50% 在模拟移动
webdriver.ActionChains(driver).click_and_hold(on_element=slider2).perform()
for x in tracks:
webdriver.ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
else:
webdriver.ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()
webdriver.ActionChains(driver).pause(0.5).release().perform()
注:JS 部分涉及反检测逻辑较长,建议参考相关开源项目自行补充。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online