栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python -> snap up tickets

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python -> snap up tickets

-------------利用Python语言实现自动snap up tickets的代码及步骤-------------

目录
  • 实验环境
  • 一、软件安装
      • 1、安装Python
      • 2、安装PyCharm
      • 3、测试是否安装成功
  • 二、环境配置
      • 安装第三方库selenium
  • 三、配置msedgedriver
  • 三、安装Anaconda(可无)
  • 四、代码
  • 程序使用注意事项
  • 参考网址


实验环境

操作系统:Windows 10
浏览器:Microsoft Edge
webdriver:msedgedriver
编程环境:PyCharm 社区版 2022.1.2
编程语言:Python 3.9
第三方库:selenium

另使用开源Python平台:Anaconda


一、软件安装 1、安装Python

官网下载链接:link

可以不选择最新版本,因为参考资料较少
64位电脑,对应选择Download Windows installer (64-bit)


具体步骤可参考:link --&-- link

2、安装PyCharm

官网下载链接:link

选择免费的社区版

具体步骤可参考:链接: link

3、测试是否安装成功

正常情况下按步骤直接安装就完成,路径自动加入到:此电脑>高级系统设置>高级>环境变量
可点击电脑左下角开始按钮,输入 cmd 进入windows的命令行模式
在命令行中输入Python,正确显示Python版本则表示Python安装成功

否则手动加入路径

二、环境配置

打开PyCharm,create new project

安装第三方库selenium

打开PyCharm,菜单栏选择 File > Settings > Project:pythonProject > Python interpreter,点击“+”号,搜索selenium并点击 Install Package
安装完成

三、配置msedgedriver

Microsoft Edge浏览器

官方webdriver下载:链接: link

把下载好的msedgedriver.exe文件放入Edge浏览器安装目录以及python安装目录下。
可参考:link

三、安装Anaconda(可无)

官网下载:链接: link

打开PyCharm,菜单栏选择 File > New Project 创建新文件时,选择Conda环境

具体步骤可参考链接: link

验证Anaconda安装是否成功,可选以下方法:
① “开始 → Anaconda3(64-bit)→ Anaconda Navigator”,若可以成功启动Anaconda Navigator则说明安装成功。
② “开始 → Anaconda3(64-bit)→ 右键点击Anaconda Prompt → 以管理员身份运行”,在Anaconda Prompt中输入 conda list ,可以查看已经安装的包名和版本号。若结果可以正常显示,则说明安装成功。

在Anaconda下安装selenium
具体步骤可参考:link
在cmd命令行中执行:

pip install selenium

若报错可尝试更新pip:

python -m pip install --upgrade pip

验证安装是否成功:

pip show selenium

四、代码
import os
import pickle
import time
from time import sleep
from selenium import webdriver

# 大麦网主页
damai_url = "https://www.damai.cn/"
# 登录页
login_url = "https://passport.damai.cn/login?ru=https%3A%2F%2Fwww.damai.cn%2F"
# 抢票目标页
target_url = 'https://detail.damai.cn/item.htm?spm=a2oeg.search_category.0.0.36ff4d15ejgepb&id=674198045955&clicktitle=%E3%80%8A%E6%B5%B7%E4%B8%8A%E9%92%A2%E7%90%B4%E5%B8%88%E3%80%8B%E5%85%A8%E7%90%83%E8%8E%B7%E5%A5%96%E5%BD%B1%E8%A7%86%E9%9F%B3%E4%B9%90%E5%AE%A4%E5%86%85%E4%B9%90%E8%A7%86%E5%90%AC%E9%9F%B3%E4%B9%90%E4%BC%9A%EF%BC%88%E5%90%88%EF%BC%89%E6%AD%A6%E6%B1%89%E7%AB%99'

class Concert:
    def __init__(self):
        self.status = 0         # 状态,表示如今进行到何种程度
        self.login_method = 1   # {0:模拟登录,1:Cookie登录}自行选择登录方式
        self.driver = webdriver.Edge("C:Program Files (x86)MicrosoftEdgeApplicationmsedgedriver.exe")        # 使用Microsoft Edge浏览器

    def set_cookie(self):
        self.driver.get(damai_url)
        print("###请点击登录###")
        while self.driver.title.find('大麦网-全球演出赛事官方购票平台') != -1:
            sleep(1)
        print('###请扫码登录###')

        while self.driver.title != '大麦网-全球演出赛事官方购票平台-100%正品、先付先抢、在线选座!':
            sleep(1)
        print("###扫码成功###")
        pickle.dump(self.driver.get_cookies(), open("cookies.pkl", "wb"))
        print("###Cookie保存成功###")
        self.driver.get(target_url)

    def get_cookie(self):
        try:
            cookies = pickle.load(open("cookies.pkl", "rb"))  # 载入cookie
            for cookie in cookies:
                cookie_dict = {
                    'domain': '.damai.cn',  # 必须有,不然就是假登录
                    'name': cookie.get('name'),
                    'value': cookie.get('value')
                }
                self.driver.add_cookie(cookie_dict)
            print('###载入Cookie###')
        except Exception as e:
            print(e)

    def login(self):
        if self.login_method == 0:
            self.driver.get(login_url)
            # 载入登录界面
            print('###开始登录###')

        elif self.login_method == 1:
            if not os.path.exists('cookies.pkl'):
                # 如果不存在cookie.pkl,就获取一下
                self.set_cookie()
            else:
                self.driver.get(target_url)
                self.get_cookie()

    def enter_concert(self):
        """打开浏览器"""
        print('###打开浏览器,进入大麦网###')
        self.driver.maximize_window()           # 最大化窗口
        # 调用登陆
        self.login()  # 先登录再说
        self.driver.refresh()  # 刷新页面
        self.status = 2  # 登录成功标识
        print("###登录成功###")
        if self.isElementExist('/html/body/div[2]/div[2]/div/div/div[3]/div[2]'):
            self.driver.find_element_by_xpath('/html/body/div[2]/div[2]/div/div/div[3]/div[2]').click()

    def isElementExist(self, element):
        flag = True
        browser = self.driver
        try:
            browser.find_element_by_xpath(element)
            return flag

        except:
            flag = False
            return flag

    def choose_ticket(self):
        if self.status == 2:  # 登录成功入口
            print("=" * 30)
            print("###开始进行日期及票价选择###")
            while self.driver.title.find('确认订单') == -1:  # 如果跳转到了订单结算界面就算这步成功了,否则继续执行此步
                try:
                    buybutton = self.driver.find_element_by_class_name('buybtn').text
                    if buybutton == "提交缺货登记":
                        # 改变现有状态
                        self.status = 2
                        self.driver.get(target_url)
                        print('###抢票未开始,刷新等待开始###')
                        continue
                    elif buybutton == "立即预定":
                        self.driver.find_element_by_class_name('buybtn').click()
                        # 改变现有状态
                        self.status = 3
                    elif buybutton == "立即购买":
                        self.driver.find_element_by_class_name('buybtn').click()
                        # 改变现有状态
                        self.status = 4
                    # 选座购买暂时无法完成自动化
                    elif buybutton == "选座购买":
                        self.driver.find_element_by_class_name('buybtn').click()
                        self.status = 5
                except:
                    print('###未跳转到订单结算界面###')
                title = self.driver.title
                if title == '选座购买':
                    # 实现选座位购买的逻辑
                    self.choice_seats()
                elif title == '确认订单':
                    while True:
                        # 如果标题为确认订单
                        print('waiting ......')
                        if self.isElementExist('//*[@id="container"]/div/div[9]/button'):
                            self.check_order()
                            break

    def choice_seats(self):
        while self.driver.title == '选座购买':
            while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img'):
                # 座位手动选择 选中座位之后//*[@id="app"]/div[2]/div[2]/div[1]/div[2]/img 就会消失
                print('请快速的选择您的座位!!!')
            # 消失之后就会出现 //*[@id="app"]/div[2]/div[2]/div[2]/div
            while self.isElementExist('//*[@id="app"]/div[2]/div[2]/div[2]/div'):
                # 找到之后进行点击确认选座
                self.driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/button').click()

    def check_order(self):
        if self.status in [3, 4, 5]:
            print('###开始确认订单###')
            try:
                # 默认选第一个购票人信息
                self.driver.find_element_by_xpath('//*[@id="container"]/div/div[2]/div[2]/div[1]/div/label').click()
            except Exception as e:
                print("###购票人信息选中失败,自行查看元素位置###")
                print(e)
            # 最后一步提交订单
            time.sleep(0.5)  # 太快会影响加载,导致按钮点击无效
            self.driver.find_element_by_xpath('//div[@class = "w1200"]//div[2]//div//div[9]//button[1]').click()

    def finish(self):
        self.driver.quit()

if __name__ == '__main__':
    try:
        con = Concert() # 具体如果填写请查看类中的初始化函数
        con.enter_concert()         # 打开浏览器
        con.choose_ticket()         # 开始抢票

    except Exception as e:
        con = Concert()
        print(e)
        con.finish()
程序使用注意事项

运行程序后,首次需要扫码登陆大麦网,再运行时则可以免登录。

参考网址

1、Python原始代码
链接: link
2、部分代码解释
链接: link
3、Python+Pycharm安装教程
链接: link

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983398.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号