【Python timedelta日期区间+多线程】获取滑雪场雪票预约名额

【Python timedelta日期区间+多线程】获取滑雪场雪票预约名额,第1张

【Python timedelta日期区间+多线程】获取滑雪场雪票预约名额

北京某著名滑雪场在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()

成果展示

不难看出周末的雪票属实供不应求,而周中的供应绰绰有余,而且价格实惠。另外自带学具的雪票数量非常有限,所以有需求的雪友们一定要尽早预定。 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5671127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存