IT评测·应用市场-qidao123.com

标题: 【Python】爬虫实战03:主动化抢票脚本【某麦网】 [打印本页]

作者: 宁睿    时间: 2024-10-4 08:37
标题: 【Python】爬虫实战03:主动化抢票脚本【某麦网】
1. 脚本介绍

1.1 配景介绍

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

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

1.4 布局和关键函数:


1.4.1 PC端抢票利用:


移动端抢票利用:


1.4.2 主函数:


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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4