由于疫情原因,今年北京某著名滑雪场采取预约制。由于试营业期间票价非常实惠,可以说是一票难求,所以用python写个小程序自动爬取空余名额,结合crontab执行定时任务以及smtplib这个包可以实现每分钟自动爬取,并在指定日期有空位时立即自动发送邮件,是个抢位置利器 hhh
眼看试营业即将结束,这里分享一下代码。
其实整体也不难,主要通过devtool找到获取预约名额数据的api即可。
import requests import csv import datetime # autoemail是自己写的自动发送邮件的类,后面给源码 from autoemail import AutoEmail # 禁用verify=False时的warning。不禁用的话crontab定时任务会不断在terminal给你发mail requests.packages.urllib3.disable_warnings()
# 数据接口 url = 'https://65235638.12301.cc/co/Index_Product/getCalendarPriceList'
# 请求头,这里大家自行在devtool里复制粘贴就行 headers = { 'Host': '65235638.12301.cc', 'Referer': , 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36', 'cookie': , 'Content-Length': '451', }
# 注意 这里因为试营业时期只有12月,所以暂时注释掉了1 2 月份,以免报错 date_list = [ '2021-12', # '2022-01', # '2022-02' ]
接下来编写获取数据的函数。这里的值都在devtool的payload里获取。
def get_nanshanski_available_spot(date_list): for d in date_list: payload = { 'pid': '', 'aid': '', # 这里将tid变更为新版tid之后即可获得试营业日期的票务信息 'tid': '', 'date': d, 'token': '' } res = requests.post(url,headers=headers,data=payload,verify=False) # # print(res.text) # # print(res.json()) jsdata = res.json()['data'] print(jsdata)
if __name__ == '__main__': get_nanshanski_available_spot(date_list)
成果展示
自动发邮件的代码如下。通过在程序中调用这个类实例化,还可以覆盖标题和内容,直接显示空余的具体数量。大家可以自行研究。
from smtplib import SMTP_SSL from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart # from email.header import Header class AutoEmail(): def __init__(self): self.host = 'smtp.qq.com' self.sender = '[email protected]' self.pwd = '替换你自己的' self.receiver = '[email protected]' self.title = '【重要】南山预约已有空位' self.content = 'test' def auto_send_email(self): msg = MIMEMultipart() msg['Subject'] = self.title msg['From'] = self.sender msg['To'] = self.receiver msg.attach(MIMEText(self.content,'plain','utf-8')) smtp = SMTP_SSL(self.host) smtp.login(self.sender,self.pwd) smtp.sendmail(self.sender,self.receiver,msg.as_string()) smtp.quit()
最后通过crontab可以实现每分钟自动爬取数据,具体实现可以参考上一篇内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)