最近看了一些爬虫的资料,试着自己写了一个小爬虫,爬取12306的余票信息。
代码很少,也没做什么优化,仅记录一下第一个爬虫。
思路分析:
查询余票的正常步骤肯定是打开12306,输入出发地,目的地,出发时间,点击查询。根据这个步骤,一步一步开始:
1.首先来到https://kyfw.12306.cn/otn/leftTicket,输入出发地等信息,点击查询,通过浏览器F12抓包分析可以发现,车站信息是从https://kyfw.12306.cn/otn/resources/js/framework/station_name.js获取到的,而余票信息通过https://kyfw.12306.cn/otn/leftTicket/queryX?leftTicketDTO.train_date=2019-02-21&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT获取(这里查询的是北京到上海2月21号的票)。
2.开始撸代码,先获取所有站点的信息,并把对应的车站和代号存起来以后使用。
import requests
dict_station = {
}
def station_name():
url = 'https://kyfw.12306.cn/otn/resources/js/framework/station_name.js'
resp = requests.get(url)
if resp.status_code == 200:
print('获取站点信息成功!')
for each in resp.text.split('=')[1].split('@')[1:]:
station = each.split('|')
dict_station[station[1]] = station[2]
else:
print('获取站点信息失败!')
3.接下来查询余票,查询其实很简单,只需把对应的信息放到url中get就好了,主要是要从获取到的数据中分析出我们需要的数据,如有无余票,余票多少等。
def left_ticket(from_s, to_s, date):
global dict_station
url = 'https://kyfw.12306.cn/otn/leftTicket/queryX'
dict1 = {
'leftTicketDTO.train_date':date,
'leftTicketDTO.from_station':dict_station[from_s],
'leftTicketDTO.to_station':dict_station[to_s],
'purpose_co