返回顶部
首页 > 资讯 > 后端开发 > Python >教你怎么用Python监控愉客行车程
  • 277
分享到

教你怎么用Python监控愉客行车程

2024-04-02 19:04:59 277人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、愉客行车程监控并通知二、目录结构三、完整代码四、config.JSON文件一、愉客行车程监控并通知 大概思路:用户填写指定信息在config.json文件中,通过定时访问网

一、愉客行车程监控并通知

大概思路:用户填写指定信息在config.json文件中,通过定时访问网页,获取指定信息,从而达到对指定车程的监控

1.分析网页

在这里插入图片描述

按下F12,打开开发工具,再刷新一下网页

找到我们需要的信息

在这里插入图片描述

然后再分析一下它的请求方式

在这里插入图片描述

很直观的就看到了几条主要的信息

第一条和第三条是null不重要
第二条是起始站
第四条是终点站
第五条是个数字,经过反复尝试,发现是固定参数
第六条乍一看应该是时间戳,经过验证,的确是车票指定日期零点的时间戳

2.请求头伪装、带参访问指定网页,获取信息:


def get_html(startStation, endStation, timeStamp):
    # 模拟请求
    headers = {
        'Accept': 'application/json, text/javascript, **; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-HK;q=0.6',
        'Connection': 'keep-alive',
        'Content-Length': '124',
        'Content-Type': 'application/json; charset=UTF-8',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
        'sec-ch-ua-mobile': '?0',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'cross-site',
        'Host': 'busserver.cqyukexing.com',
        'Origin': 'https://www.96096kp.com',
        'Referer': 'Https://www.96096kp.com/',
        'User-Agent': 'Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWEBKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36',
    }
    data = {
        'departureName': startStation,
        'destinationId': 'null',
        'destinationName': endStation,
        'opSource': '7',
        # 指定日期时间戳
        'queryDate': timeStamp,
    }
    data = json.dumps(data)
    url = 'https://busserver.cqyukexing.com/busticket/schedule_list_310?channel=7'
    response = requests.post(url, headers=headers, data=data, timeout=5)
    if response.status_code == 200:
        html = response.text
        # print(html)
        return html


def parse_html(html):
    # 解析获取的数据
    items = []
    html = json.loads(html)
    for i in range(len(jsonpath.jsonpath(html, '$..scheduleInfo'))):
        item = {}
        timeStamp = jsonpath.jsonpath(html, '$..scheduleInfo..departureTime')[i]
        item["发车日期"] = time.strftime("%Y-%m-%d", time.localtime(timeStamp))
        # 检测是否过期
        out_data(item["发车日期"])
        item["发车时间"] = jsonpath.jsonpath(html, '$..scheduleInfo..departureTimeDesc')[i]
        item["起始站"] = jsonpath.jsonpath(html, '$..departureStation..name')[i]
        # item["地址"] = jsonpath.jsonpath(html, '$..departureStation..addr')[i]
        item["终点站"] = jsonpath.jsonpath(html, '$..destinationStation..name')[i]
        item["余票"] = jsonpath.jsonpath(html, '$..scheduleInfo..remainSeatCnt')[i]
        item["票价"] = jsonpath.jsonpath(html, '$..scheduleInfo..fullTicketPrice')[i]
        item["车型"] = jsonpath.jsonpath(html, '$..scheduleInfo..busType')[i]
        item["车牌号"] = jsonpath.jsonpath(html, '$..scheduleInfo..scheduleCode')[i]
        item["路线"] = jsonpath.jsonpath(html, '$..scheduleInfo..lineName')[i][3:]
        item["状态"] = '\033[32m' if item["余票"] > 0 else '\033[31m'
        # item["途径"] = jsonpath.jsonpath(html, '$..scheduleInfo..stopStation')[i]
        items.append(item)
    return items


def watch_ticks(bus_list):
    # 检查目前还有票的车次
    fORMat_info(bus_list)
    has_ticks = []
    filename = 'tick_log of ' + bus_list[0]["起始站"] + '-' + bus_list[0]["终点站"] + '.txt'
    # 如果log文件不存在,则新建一个空的文件
    if not os.path.exists('./logs/' + filename):
        f = open('./logs/' + filename, 'w')
        f.close()
    with open('./logs/' + filename, 'r+', encoding='utf-8') as file:
        alreald_send = file.read()
    for bus in bus_list:
        if bus["余票"] != 0 and bus["发车时间"] not in alreald_send or not len(alreald_send):
            has_ticks.append(bus)
            with open('./logs/tick_log of ' + bus["起始站"] + '-' + bus["终点站"] + '.txt', 'a+', encoding='utf-8') as file:
                file.write(bus["发车时间"] + '\n')
    # print(has_ticks)
    return has_ticks


def out_data(date):
    # 检查车票跟踪是否过时
    # 是否过期一天
    tomorrow = datetime.date.today() - datetime.timedelta(days=1)
    if date == tomorrow:
        print("车票跟踪已过时!")
        os.exit(0)


def format_info(bus_list):
    print(bus_list[0]["发车日期"] + '\t' + bus_list[0]["起始站"] + '-' + bus_list[0]["终点站"])
    print('-' * 120)
    # print("\t发车时间"
    #       "\t\t\t起始站"
    #       "\t\t\t终点站"
    #       "\t\t余票"
    #       "\t\t票价"
    #       "\t\t路线"
    #       "\t\t车型"
    #       "\t\t车牌号")
    for bus in bus_list:
        print(bus["状态"] + "\t" + bus["发车时间"],
              "\t\t" + bus["起始站"],
              "\t\t" + bus["终点站"],
              "\t\t" + str(bus["余票"]),
              "\t\t\t" + str(bus["票价"]),
              "\t\t" + bus["路线"],
              "\t\t" + bus["车型"],
              "\t\t" + bus["车牌号"] + '\033[0m')
    print('-' * 120)


def send_email(sendUser, mail_user, mail_pass, receivers, start, end, tick_date, message):
    """发送邮件"""
    # 第三方 SMTP 服务
    mail_host = 'smtp.qq.com'  # 设置服务器
    sender = mail_user

    # 创建一个带附件的案例
    mail = MIMEMultipart()

    mail['From'] = Header(sendUser, 'utf-8')
    mail['To'] = ";".join(receivers)
    subject = '愉客行有新的票务情况:' + tick_date + '-' + start + '-' + end  # 邮件标题
    mail['Subject'] = Header(subject, 'utf-8')

    # 邮件正文内容
    mail.attach(MIMEText(message, 'plain', 'utf-8'))

    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host, 25)  # 25为端口号
        smtpObj.login(mail_user, mail_pass)
        smtpObj.sendmail(sender, receivers, mail.as_string())
        print(receivers + "\t发送成功")  # 邮件发送成功
    except Exception as e:
        pass
    finally:
        smtpObj.quit()


def main():
    global timer_times
    timer_times = timer_times + 1
    for i in range(len(startStation)):
        html = get_html(startStation[i], endStation[i], timeStamp[i])
        bus_list = parse_html(html)
        # pprint.pprint(bus_list)
        has_ticks = watch_ticks(bus_list)
        json.dump(bus_list,
                  open('./data/bus_list of ' + startStation[i] + '-' + endStation[i] + '.json', 'a+', encoding='utf-8'),
                  ensure_ascii=False)
        if len(has_ticks):
            json.dump(has_ticks, open('./data/has_ticks of ' + startStation[i] + '-' + endStation[i] + '.json', 'w+',
                                      encoding='utf-8'), ensure_ascii=False)
            message = '\n'.join([str(tick).replace(',', '\n') for tick in has_ticks])
            send_email(sendUser[i], mail_user[i], mail_pass[i], receivers[i], startStation[i], endStation[i],
                       ticksDate[i], message)
    # 定时延迟
    now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    log_message = ("\n定时任务已触发至:第%s轮\n当前时间:%s\n" % (timer_times, now))
    with open("./logs/log.txt", 'a+', encoding="utf-8") as file:
        file.write(log_message)
    print(log_message)
    time.sleep(1800)
    timer = threading.Timer(1800, main())
    timer.start()


if __name__ == '__main__':
    with open('config.json', 'r', encoding='utf-8') as file:
        config = json.load(file)
    startStation = config["起始站"]
    endStation = config["终点站"]
    ticksDate = config["车票日期"]
    timeArray = [time.strptime(tick_date + ' 00:00:00', "%Y-%m-%d %H:%M:%S") for tick_date in config["车票日期"]]
    timeStamp = [int(time.mktime(times)) for times in timeArray]
    sendUser = config["发送人"]
    mail_user = config["用户名"]
    mail_pass = config["第三方客户端授权码"]
    receivers = config["接收方"]
    # 定时延迟
    timer_times = 0
    timer = threading.Timer(1800, main())
    timer.start()

四、config.json文件


{
  "车票日期": [
    "2021-4-30",
    "2021-5-5"
  ],
  "起始站": [
    "万州",
    "彭水县"
  ],
  "终点站": [
    "涪陵",
    "万州"
  ],
  "发送人": [
    "愉客行",
    "愉客行"
  ],
  "用户名": [
    "1*******27@qq.com",
    "1*******27@qq.com"
  ],
  "第三方客户端授权码": [
    "oxms********iicj",
    "oxms********iicj"
  ],
  "接收方": [
    "265******8@qq.com",
    "265******8@qq.com"
  ]
}

到此这篇关于教你怎么用python监控愉客行车程的文章就介绍到这了,更多相关Python监控愉客行车程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 教你怎么用Python监控愉客行车程

本文链接: https://lsjlt.com/news/124948.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 教你怎么用Python监控愉客行车程
    目录一、愉客行车程监控并通知二、目录结构三、完整代码四、config.json文件一、愉客行车程监控并通知 大概思路:用户填写指定信息在config.json文件中,通过定时访问网...
    99+
    2024-04-02
  • 使用SpringCloud-Hystrix-Dashboard怎么客户端服务进行监控
    本篇文章为大家展示了使用SpringCloud-Hystrix-Dashboard怎么客户端服务进行监控,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。服务监控 除了隔离依赖服务的调用以外,...
    99+
    2023-06-07
  • 怎么使用watchPosition()监控访客的活动
    今天小编给大家分享一下怎么使用watchPosition()监控访客的活动的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收...
    99+
    2024-04-02
  • 你知道怎么用Python监控聊天记录吗
    目录关于 pynput实例键盘监控鼠标监控监控并记录到日志文件 关于 pynput     pynput 可以监控我们的键盘和鼠标。目前具有此类功能的库有很多...
    99+
    2024-04-02
  • 怎么用Python写个摸鱼监控进程
    本篇内容主要讲解“怎么用Python写个摸鱼监控进程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python写个摸鱼监控进程”吧!监控键盘如果公司偷偷在我们的电脑上运行了一个后台进程,来...
    99+
    2023-06-29
  • HTML5中WebGL怎么实现民航客机飞行监控系统
    这篇文章给大家分享的是有关HTML5中WebGL怎么实现民航客机飞行监控系统的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前些日子出差,在飞机上看到头顶的监控面板,除了播放电视剧和广告之外,还会时不时的切换到一个...
    99+
    2023-06-09
  • 使用zabbix怎么对mysql进行监控
    今天就跟大家聊聊有关使用zabbix怎么对mysql进行监控,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。zabbix 监控 mysql1、监控规划...
    99+
    2024-04-02
  • 怎么用VBS调用程序并对程序的运行情况进行监控
    这篇文章将为大家详细讲解有关怎么用VBS调用程序并对程序的运行情况进行监控,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。有同时要用一个CAE软件调用外部程序,但是,通过这个CAE软件调用外部程序以后,因为...
    99+
    2023-06-08
  • Python怎么运行_Python运行教程
    1、首先在pycharm中点击【文件】-【打开】,选择py文件并确定。 2、然后在菜单栏中点击【运行】-【运行】,或选择右侧快捷运行按钮,或在文件注释栏选择运行按钮。 3、最后在底部...
    99+
    2024-04-02
  • 怎么用Python监控你的朋友都在浏览哪些网站
    小编给大家分享一下怎么用Python监控你的朋友都在浏览哪些网站,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、需求获取你对象chrome前一天的浏览记录中的所有网址(url)和访问时间,并存在一个txt文件中将这个tx...
    99+
    2023-06-15
  • 怎么对Java 线程池的运行状态进行监控
    怎么对Java 线程池的运行状态进行监控?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。总线程数 = 排队线程数 + 活动线程数 + 执行完成的线程数下面给出一个线程池使用示...
    99+
    2023-06-06
  • 教你如何在Linux SysOps中使用SSH进行系统监控与性能调优
    使用SSH进行系统监控和性能调优是Linux系统运维工作的重要部分。下面是一些使用SSH进行系统监控和性能调优的步骤:1. 连接到远...
    99+
    2023-10-09
    Linux
  • python守护进程监控子进程怎么实现
    在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下: 导入multiproces...
    99+
    2023-10-23
    python
  • Python学习教程:教你用Python通过微信来控制电脑摄像头
    如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证。今天的Python学习教程就来通过itchart库来实现通过微信对电脑的一些操作。...
    99+
    2023-06-02
  • C++怎么实现ETW进行进程变动监控
    本篇内容介绍了“C++怎么实现ETW进行进程变动监控”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!何为EtwETW(Event Tracin...
    99+
    2023-07-02
  • 教你怎么用python绘制dotplot
    目录一、前言二、安装三、模块导入四、数据准备五、画图六、写在篇末一、前言 R语言不少库都可以方便的画dotplot,但是低频使用R这么多年,我依旧觉得R不是一门真正的编程语言。目前,...
    99+
    2024-04-02
  • Python怎么实现多线程的事件监控
    这篇文章主要介绍“Python怎么实现多线程的事件监控”,在日常操作中,相信很多人在Python怎么实现多线程的事件监控问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎么实现多线程的事件监控”的疑...
    99+
    2023-06-15
  • 怎么利用Spring Boot监控SQL运行情况
    本文小编为大家详细介绍“怎么利用Spring Boot监控SQL运行情况”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用Spring Boot监控SQL运行情况”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-07-02
  • Netdata Mysql运行情况监控插件怎么用
    这篇文章给大家分享的是有关Netdata Mysql运行情况监控插件怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一:mysql文件配置/usr/local/netdata/etc/netdata &nbs...
    99+
    2023-06-04
  • 怎么用Shell脚本监控iptables运行状态
    这篇文章主要介绍“怎么用Shell脚本监控iptables运行状态”,在日常操作中,相信很多人在怎么用Shell脚本监控iptables运行状态问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Shell脚...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作