0


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

1. 脚本介绍

1.1 背景介绍

在这个数字化时代,演唱会、体育赛事和各种活动的门票销售往往在线上进行。由于热门活动的高需求和门票的有限供应,抢票成为了一场激烈的竞争。许多粉丝和爱好者经常因为手速不够快或网络延迟而错失购票机会。为了提高抢票的成功率,自动化抢票脚本应运而生。

以下这个脚本是一个用 Python 编写的自动化抢票程序,利用

  1. Selenium

库来模拟用户在网页上的操作。下面是脚本的详细功能和结构介绍:

1.2 脚本目的:

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

1.3 主要功能:

  1. 登录:自动输入用户名和密码登录票务网站。
  2. 选择票价和数量:自动选择指定的票价,并增加购买数量。
  3. 选择购票人:在购票流程中选择预设的购票人信息。
  4. 提交订单:完成选择后自动提交订单。

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 使用方法:

要使用这个脚本,用户需要安装

  1. Selenium

库和一个对应的

  1. WebDriver(如ChromeDriver

,并设置好相关参数,如抢票链接、用户名和密码。

如未安装

  1. Selenium

库:

  1. pip install Selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

附注: 自动化抢票脚本可能违反了某些网站的服务条款,使用前应确保了解相关法律和规定,不得违反任何法律或规定,本文仅供学习参考!此外,使用此类脚本可能对其他用户不公平,应当谨慎使用!

2. 代码实现

  1. """
  2. 基于python和selenium实现的某麦网自动刷新抢票脚本
  3. 用户要提前添加好个人信息和收货地址
  4. """from selenium import webdriver
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. from selenium.webdriver.common.keys import Keys
  7. from selenium.webdriver.common.by import By
  8. from selenium.webdriver.support import expected_conditions as EC
  9. from selenium.common.exceptions import TimeoutException
  10. import time
  11. # 设置抢票链接和开票时间# URL = "https://piao.damai.cn/146290.html?spm=a2o6e.search.0.0.7e2b4d157EDtjL"# PC页面
  12. URL ='http://m.damai.cn/damai/perform/item.html?projectId=146290'#手机页面# HOUR = 19
  13. MIN =0
  14. USERNAME ="13112390306"
  15. driver = webdriver.Chrome()# 设置等待时间
  16. wait = WebDriverWait(driver,5)
  17. driver.get(URL)"""
  18. PC端网页抢票操作
  19. """defchoose(seletor):try:# 控件可点击时才选定
  20. choice = wait.until(EC.element_to_be_clickable((By.XPATH, seletor)))return choice
  21. except TimeoutException as e:print("Time out!")returnNoneexcept Exception:print("Not found!")returnNonedeflogin():# 点击登录
  22. login = choose('//*[@id="userLoginInfo"]/span/a[1]')
  23. login.click()
  24. username = choose('//*[@id="login_email"]')
  25. username.send_keys(USERNAME)"""
  26. 由于密码框控件被设置为不可见
  27. 先自行输入密码并记住密码
  28. 方便刷新
  29. (也可用cookie实现)
  30. """
  31. password = choose('//*[@id="login_pwd_txt"]')try:
  32. password.click()
  33. password.send_keys("********")except Exception:print(password)print("Password Can't click")defbuy():# 点击价格try:
  34. price =None
  35. plus =None
  36. buybtn =None
  37. submit =None
  38. booker =None
  39. select =None
  40. confirm =None
  41. driver.get(URL)# 选择价格whileNone== price:# 这里选的是580票面的,如果选其他票面,修改最后的li[*]即可
  42. price = choose('//*[@id="priceList"]/div/ul/li[3]')
  43. price.click()# 数量加1whileNone== plus:
  44. plus = choose('//*[@id="cartList"]/div[1]/ul/li/span[3]/a[2]')
  45. plus.click()# 立即抢购whileNone== buybtn:
  46. buybtn = choose('//*[@id="btnBuyNow"]')
  47. driver.execute_script("arguments[0].scrollIntoView();", buybtn)
  48. buybtn.click()# 选择购票人whileNone== booker:
  49. booker = choose('/html/body/div[3]/div[3]/div[2]/div[2]/div/a')
  50. driver.execute_script("arguments[0].scrollIntoView();", booker)
  51. booker.click()# 选择、确定whileNone== select:
  52. select = choose('/html/body/div[3]/div[3]/div[12]/div/div[2]/div/div[2]/div/table/tbody/tr/label/td[1]/input')
  53. driver.execute_script("arguments[0].scrollIntoView();", select)
  54. select.click()whileNone== confirm:
  55. confirm = choose('/html/body/div[3]/div[3]/div[12]/div/div[2]/div/p/div/a')
  56. driver.execute_script("arguments[0].scrollIntoView();", confirm)
  57. confirm.click()# 提交订单whileNone== submit:
  58. submit = choose('//*[@id="orderConfirmSubmit"]')
  59. driver.execute_script("arguments[0].scrollIntoView();", submit)
  60. submit.click()except Exception:print("抢票失败,尝试重新抢票")
  61. buy()deftest():
  62. login()
  63. time.sleep(30)print("开始抢票")
  64. buy()print("抢票成功")"""
  65. 移动端抢票操作
  66. """deflogin_mobile():"""
  67. 点击购买进入登录界面
  68. 自行输入帐号密码
  69. """# 立即购买
  70. buybtn =NonewhileNone== buybtn:
  71. buybtn = choose('/html/body/div[1]/div[2]/div/div[1]/div[2]/div')
  72. driver.execute_script("arguments[0].scrollIntoView();", buybtn)
  73. buybtn.click()# 默认已经选好时间了,再点击立即购买
  74. buy =NonewhileNone== buy:
  75. buy = choose('/html/body/div[1]/div[3]/div[2]/div[1]/div')
  76. driver.execute_script("arguments[0].scrollIntoView();", buy)
  77. buy.click()defbuy_mobile():try:# 立即购买
  78. buybtn =NonewhileNone== buybtn:
  79. buybtn = choose('/html/body/div[1]/div[2]/div/div[1]/div[2]/div')
  80. driver.execute_script("arguments[0].scrollIntoView();", buybtn)
  81. buybtn.click()# 默认已经选好时间了,再点击立即购买
  82. buy =NonewhileNone== buy:
  83. buy = choose('/html/body/div[1]/div[3]/div[2]/div[1]/div')
  84. driver.execute_script("arguments[0].scrollIntoView();", buy)
  85. buy.click()# 580票面
  86. price =NonewhileNone== price:
  87. price = choose('//html/body/div[1]/div/div[2]/ul/li[3]')
  88. driver.execute_script("arguments[0].scrollIntoView();", price)
  89. price.click()# 数量+1
  90. count =NonewhileNone== count:
  91. count = choose('/html/body/div[1]/div/div[3]/ul/li/div/div[3]')
  92. driver.execute_script("arguments[0].scrollIntoView();", count)
  93. count.click()# 选好了
  94. select =NonewhileNone== select:
  95. select = choose('/html/body/div[1]/div/div[4]/div[3]')
  96. driver.execute_script("arguments[0].scrollIntoView();", select)
  97. select.click()# 购票人
  98. booker =NonewhileNone== booker:
  99. booker = choose('/html/body/div[1]/div[1]/div[2]/div[1]/div[2]/div/ul/li/div')
  100. driver.execute_script("arguments[0].scrollIntoView();", booker)
  101. booker.click()# 去付款
  102. pay =NonewhileNone== pay:
  103. pay = choose('/html/body/div[1]/div[2]/div[2]/div[2]/div')
  104. driver.execute_script("arguments[0].scrollIntoView();", pay)
  105. pay.click()except Exception:print("抢票失败,尝试重新抢票")
  106. buy_mobile()deftest_mobile():
  107. login_mobile()
  108. time.sleep(30)print("开始抢票")
  109. buy_mobile()print("抢票成功")defmain():# 默认 PC 网页,手机网页对应修改即可
  110. login()# 30秒等待用户输入密码后再开始刷
  111. time.sleep(30)while1:if MIN == time.localtime().tm_min:print("开始抢票")
  112. buy()print("抢票成功")if __name__ =='__main__':# test()
  113. test_mobile()# main()

本文转载自: https://blog.csdn.net/Young_Pro/article/details/140419315
版权归原作者 Ustinian_310 所有, 如有侵权,请联系我们删除。

“【Python】爬虫实战03:自动化抢票脚本【某麦网】”的评论:

还没有评论