北京某著名滑雪场在12/17就会迎来正式营业, 正式营业后的雪票种类可以说是多种多样,那么为了快捷获取各种雪票的价格及预约名额,这里用datetime获取日期区间+多线程来实现。
import requests
import csv
import datetime
import threading
url = 'https://65235638.12301.cc/co/Index_Product/getPriceAndStorageForManyDate/'
通过验证发现cookie并不需要
headers = {
'Host': '65235638.12301.cc',
'Referer': '替换你的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': cookie,
# 'Content-Length': '451',
}
因为请求是post,并且携带参数之一就是格式化日期eg2021-12-15,所以这里利用datetime模块的timedelta通过for循环遍历,将格式化日期放入列表
# 遍历日历并以格式化输出
d = datetime.datetime.now()
# print(d.strftime('%Y-%m-%d'))
datelist = []
# 因为正式营业是17号,编程当天是15号,所以这里range起始是2
for i in range(2,74):
end_d = d + datetime.timedelta(days=i)
end_d = end_d.strftime('%Y-%m-%d')
datelist.append(end_d)
这里写表头
f = open('nanshan_store_price.csv','w')
writer = csv.writer(f)
writer.writerow(['日期','ticket_type','price','storage'])
因为返回的数据中,雪票是以数字代码表示的,所以要替换成中文对应名字,这里用zip的方式实现,方便后续遍历时一个代码通用。
【注意】因为是多线程实现,所以在调用csv文件时要加锁,不然写出来的数据可能会乱。
def get_nanshanski_available_spot(date):
ticket_list = ['1210476','1210497','1210411','1210491']
name_list = ['日场全天','日场全天自带雪具','日场4小时','日场4小时自带雪具']
pair = list(zip(ticket_list,name_list))
payload = {
'pids': '1210476-1247816-1210497-1210411-1210491-1210500-1210504-1210506-1210507-1227916-1227923',
'tids': '1213124-1250464-1213145-1213059-1213139-1213148-1213152-1213154-1213155-1230564-1230571',
'aid': '替换自己的',
'date': date,
'time_share': '1',
'token': 'token是必须的,替换自己的token'
}
res = requests.post(url,headers=headers,data=payload,verify=False)
jsdata = res.json()['data']
for k,v in jsdata.items():
for k,v in v.items():
for p in pair:
if k == p[0]:
k = p[1]
print(date,k,v['price']/100,v['store'])
lock.acquire()
writer.writerow([date,k,v['price']/100,v['store']])
lock.release()
if __name__ == '__main__':
lock = threading.Lock()
ts = []
for date in datelist:
t = threading.Thread(target=get_nanshanski_available_spot,args=(date,))
t.start()
ts.append(t)
for t in ts:
t.join()
f.close()
成果展示
不难看出周末的雪票属实供不应求,而周中的供应绰绰有余,而且价格实惠。另外自带学具的雪票数量非常有限,所以有需求的雪友们一定要尽早预定。