【Python】爬虫实战03:主动化抢票脚本【某麦网】

宁睿  论坛元老 | 2024-10-4 08:37:58 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1083|帖子 1083|积分 3259

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 脚本介绍

1.1 配景介绍

在这个数字化时代,演唱会、体育赛事和各种运动的门票销售往往在线上进行。由于热门运动的高需求和门票的有限供应,抢票成为了一场剧烈的竞争。很多粉丝和爱好者常常因为手速不够快或网络延迟而错失购票机会。为了提高抢票的成功率,主动化抢票脚本应运而生。
以下这个脚本是一个用 Python 编写的主动化抢票程序,使用Selenium库来模拟用户在网页上的利用。下面是脚本的详细功能和布局介绍:
1.2 脚本目的:

脚本的主要目的是在票务网站上主动购买演唱会或运动门票。它可以在指定的时间主动实行购票流程,从而提高抢票成功的概率。
1.3 主要功能:


  • 登录:主动输入用户名和暗码登录票务网站。
  • 选择票价和数量:主动选择指定的票价,并增长购买数量。
  • 选择购票人:在购票流程中选择预设的购票人信息。
  • 提交订单:完成选择后主动提交订单。
1.4 布局和关键函数:



  • 导入库:脚本开始处导入了Selenium相干的库,用于欣赏器控制和元素交互。
  • 设置参数:界说了抢票的URL、开票时间、用户名等参数。
  • 欣赏器初始化:创建了一个Chrome欣赏器的实例。
  • 等候时间设置:设置了一个WebDriverWait实例,用于等候网页元素加载。
1.4.1 PC端抢票利用:



  • choose函数:用于查找并返回网页元素,假如元素不存在或无法点击,则返回None。
  • login函数:用于实行登录利用。
  • buy函数:包罗了抢票的主要步调,如选择票价、数量、购票人,末了提交订单。
  • test函数:用于测试登录和抢票流程。
移动端抢票利用:



  • login_mobile函数:用于移动端的登录利用。
  • buy_mobile函数:包罗了移动端抢票的步调。
  • test_mobile函数:用于测试移动端的登录和抢票流程。
1.4.2 主函数:



  • main函数:是脚本的入口点,默认实行PC端的抢票流程,但可以通过解释切换到移动端或测试模式。
1.5 注意事项:



  • 安全性:脚本中包罗了用户名和暗码,应当妥善保管,制止走漏。
  • 暗码输入:由于暗码输入框大概不可见,脚本中解释提到必要手动输入暗码。
  • 异常处置惩罚:脚本包罗了基本的异常处置惩罚,用于处置惩罚元素找不到或点击失败的情况。
  • 定时抢票:脚本通过一个无限循环和条件判定来实现定时抢票功能。
1.6 使用方法:

要使用这个脚本,用户必要安装Selenium库和一个对应的WebDriver(如ChromeDriver),并设置好相干参数,如抢票链接、用户名和暗码。
如未安装Selenium库:
  1. pip install Selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
复制代码
附注: 主动化抢票脚本大概违背了某些网站的服务条款,使用前应确保了解相干法律和规定,不得违背任何法律或规定,本文仅供学习参考!此外,使用此类脚本大概对其他用户不公平,应当谨慎使用!
2. 代码实现

  1. """
  2. 基于python和selenium实现的某麦网自动刷新抢票脚本
  3. 用户要提前添加好个人信息和收货地址
  4. """
  5. from selenium import webdriver
  6. from selenium.webdriver.support.ui import WebDriverWait
  7. from selenium.webdriver.common.keys import Keys
  8. from selenium.webdriver.common.by import By
  9. from selenium.webdriver.support import expected_conditions as EC
  10. from selenium.common.exceptions import TimeoutException
  11. import time
  12. # 设置抢票链接和开票时间
  13. # URL = "https://piao.damai.cn/146290.html?spm=a2o6e.search.0.0.7e2b4d157EDtjL"# PC页面
  14. URL = 'http://m.damai.cn/damai/perform/item.html?projectId=146290'#手机页面
  15. # HOUR = 19
  16. MIN  = 0
  17. USERNAME = "13112390306"
  18. driver = webdriver.Chrome()
  19. # 设置等待时间
  20. wait = WebDriverWait(driver, 5)
  21. driver.get(URL)
  22. """
  23. PC端网页抢票操作
  24. """
  25. def choose(seletor):
  26.     try:
  27.         # 控件可点击时才选定
  28.         choice = wait.until(EC.element_to_be_clickable((By.XPATH, seletor)))
  29.         return choice
  30.     except TimeoutException as e:
  31.         print("Time out!")
  32.         return None
  33.     except Exception:
  34.         print("Not found!")
  35.         return None
  36. def login():
  37.     # 点击登录
  38.     login = choose('//*[@id="userLoginInfo"]/span/a[1]')
  39.     login.click()
  40.     username = choose('//*[@id="login_email"]')
  41.     username.send_keys(USERNAME)
  42.     """
  43.     由于密码框控件被设置为不可见
  44.     先自行输入密码并记住密码
  45.     方便刷新
  46.     (也可用cookie实现)
  47.     """
  48.     password = choose('//*[@id="login_pwd_txt"]')
  49.     try:
  50.         password.click()
  51.         password.send_keys("********")
  52.     except Exception:
  53.         print(password)
  54.         print("Password Can't click")
  55. def buy():
  56.     # 点击价格
  57.     try:
  58.         price = None
  59.         plus = None
  60.         buybtn = None
  61.         submit = None
  62.         booker = None
  63.         select = None
  64.         confirm = None
  65.         driver.get(URL)
  66.         # 选择价格
  67.         while None == price:
  68.             # 这里选的是580票面的,如果选其他票面,修改最后的li[*]即可
  69.             price = choose('//*[@id="priceList"]/div/ul/li[3]')
  70.         price.click()
  71.         # 数量加1
  72.         while None == plus:
  73.             plus = choose('//*[@id="cartList"]/div[1]/ul/li/span[3]/a[2]')
  74.         plus.click()
  75.         # 立即抢购
  76.         while None == buybtn:
  77.             buybtn = choose('//*[@id="btnBuyNow"]')
  78.         driver.execute_script("arguments[0].scrollIntoView();", buybtn)
  79.         buybtn.click()
  80.         # 选择购票人
  81.         while None == booker:
  82.             booker = choose('/html/body/div[3]/div[3]/div[2]/div[2]/div/a')
  83.         driver.execute_script("arguments[0].scrollIntoView();", booker)
  84.         booker.click()
  85.         # 选择、确定
  86.         while None == select:
  87.             select = choose('/html/body/div[3]/div[3]/div[12]/div/div[2]/div/div[2]/div/table/tbody/tr/label/td[1]/input')
  88.         driver.execute_script("arguments[0].scrollIntoView();", select)
  89.         select.click()
  90.         while None == confirm:
  91.             confirm = choose('/html/body/div[3]/div[3]/div[12]/div/div[2]/div/p/div/a')
  92.         driver.execute_script("arguments[0].scrollIntoView();", confirm)
  93.         confirm.click()
  94.         # 提交订单
  95.         while None == submit:
  96.             submit = choose('//*[@id="orderConfirmSubmit"]')
  97.         driver.execute_script("arguments[0].scrollIntoView();", submit)
  98.         submit.click()
  99.     except Exception:
  100.         print("抢票失败,尝试重新抢票")
  101.         buy()
  102. def test():
  103.     login()
  104.     time.sleep(30)
  105.     print("开始抢票")
  106.     buy()
  107.     print("抢票成功")
  108. """
  109. 移动端抢票操作
  110. """
  111. def login_mobile():
  112.     """
  113.     点击购买进入登录界面
  114.     自行输入帐号密码
  115.     """
  116.     # 立即购买
  117.     buybtn = None
  118.     while None == buybtn:
  119.         buybtn = choose('/html/body/div[1]/div[2]/div/div[1]/div[2]/div')
  120.     driver.execute_script("arguments[0].scrollIntoView();", buybtn)
  121.     buybtn.click()
  122.     # 默认已经选好时间了,再点击立即购买
  123.     buy = None
  124.     while None == buy:
  125.         buy = choose('/html/body/div[1]/div[3]/div[2]/div[1]/div')
  126.     driver.execute_script("arguments[0].scrollIntoView();", buy)
  127.     buy.click()
  128. def buy_mobile():
  129.     try:
  130.         # 立即购买
  131.         buybtn = None
  132.         while None == buybtn:
  133.             buybtn = choose('/html/body/div[1]/div[2]/div/div[1]/div[2]/div')
  134.         driver.execute_script("arguments[0].scrollIntoView();", buybtn)
  135.         buybtn.click()
  136.         # 默认已经选好时间了,再点击立即购买
  137.         buy = None
  138.         while None == buy:
  139.             buy = choose('/html/body/div[1]/div[3]/div[2]/div[1]/div')
  140.         driver.execute_script("arguments[0].scrollIntoView();", buy)
  141.         buy.click()
  142.         # 580票面
  143.         price = None
  144.         while None == price:
  145.             price = choose('//html/body/div[1]/div/div[2]/ul/li[3]')
  146.         driver.execute_script("arguments[0].scrollIntoView();", price)
  147.         price.click()
  148.         # 数量+1
  149.         count = None
  150.         while None == count:
  151.             count = choose('/html/body/div[1]/div/div[3]/ul/li/div/div[3]')
  152.         driver.execute_script("arguments[0].scrollIntoView();", count)
  153.         count.click()
  154.         # 选好了
  155.         select = None
  156.         while None == select:
  157.             select = choose('/html/body/div[1]/div/div[4]/div[3]')
  158.         driver.execute_script("arguments[0].scrollIntoView();", select)
  159.         select.click()
  160.         # 购票人
  161.         booker = None
  162.         while None == booker:
  163.             booker = choose('/html/body/div[1]/div[1]/div[2]/div[1]/div[2]/div/ul/li/div')
  164.         driver.execute_script("arguments[0].scrollIntoView();", booker)
  165.         booker.click()
  166.         # 去付款
  167.         pay = None
  168.         while None == pay:
  169.             pay = choose('/html/body/div[1]/div[2]/div[2]/div[2]/div')
  170.         driver.execute_script("arguments[0].scrollIntoView();", pay)
  171.         pay.click()
  172.     except Exception:
  173.         print("抢票失败,尝试重新抢票")
  174.         buy_mobile()
  175. def test_mobile():
  176.     login_mobile()
  177.     time.sleep(30)
  178.     print("开始抢票")
  179.     buy_mobile()
  180.     print("抢票成功")
  181. def main():
  182.     # 默认 PC 网页,手机网页对应修改即可
  183.     login()
  184.     # 30秒等待用户输入密码后再开始刷
  185.     time.sleep(30)
  186.     while 1:
  187.         if MIN == time.localtime().tm_min:
  188.             print("开始抢票")
  189.             buy()
  190.             print("抢票成功")
  191. if __name__ == '__main__':
  192.     # test()
  193.     test_mobile()
  194.     # main()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表