上节分析了获取余票数据的请求,本节开始抓取数据
可以看到,这里的站点名,是拼音码,显然是保存在对应的字典中
在网上下载这个字典
https://pan.baidu.com/s/1i4FTjgD
我是在这里下载的,整理好的py文件,可以直接使用.
现在终于可以开始爬取数据了
class Get_tickets:
def __init__(self,start_station,destination,date):
self.date = date
self.params = {
"leftTicketDTO.train_date": date,
"leftTicketDTO.from_station": stationsInfo.stations2CODE[start_station],
"leftTicketDTO.to_station": stationsInfo.stations2CODE[destination],
"purpose_codes": "ADULT"
}
首先是传递你到底要查什么,就是前面分析所需的三个参数
其实这里要判断一下,输入的站点在不在站点字典里,但是,为了节省篇幅,先把整体流程走出来,那些细枝末节留到后面说.
把三个参数直接保存进params字典中,为什么date要单独保存为实例变量,这个后面会说
base_url = "https://kyfw.12306.cn/otn/leftTicket/query?"
def get_data(self):
# 请求数据获取余票信息
url = base_url + urlencode(self.params) # 拼接请求链接
text = requests.get(url).text # 发送请求,以string方式返回
result = json.loads(text)["data"]["result"] # 提取出余票信息
发现返回数据为字典,其实从请求里的query就可以猜到是返回数据库信息了
用json把字符串转化为字典,再从字典里取出余票信息
json.loads(text)
json.loads(text)[“data”]
json.loads(text)[“data”][“result”]
写慢点,就是通过这三步获得余票信息
这时,result是指向一个列表,列表保存每条列车的余票数据
单独拿出每条数据来看,会发现数据由”|”分割,这时,我们强大的split方法可以直接把这一大串的字符串切分出来,返回列表类型数据
self.tickets_info = []
# 提取余票信息
for r in result:
# 分割数据
r_list = r.split("|")
# 过滤数据
r_dict = {
'train_code': r_list[3],
'train_no': r_list[2],
'start_time': r_list[8],
'end-time': r_list[9],
'arrive_time': r_list[10],
'from_station': r_list[6],
'to_station': r_list[7],
'date': r_list[13],
'business_seat': r_list[-5],
'first_seat': r_list[-6],
'second-seat': r_list[-7],
'gjrw': r_list[-8],
'rw': r_list[-9],
'dw': r_list[-10],
'yw': r_list[-11],
'rz': r_list[-12],
'yz': r_list[-13],
'wz': r_list[-14],
'qt': r_list[-15],
'remark': r_list[1],
'seat_type': r_list[-2],
"from_station_no": r_list[16],
"destinction_no": r_list[17],
}
# 数据重整 如过对应数据为"",因为显示出来得为"--",所以在这把字典所有的""="--"
for key in r_dict:
if r_dict[key] == "":
r_dict[key] = '--'
# 填入数据 把没一条整理好的列车余票字典,保存到实例属性tickets_info列表中
self.tickets_info.append(r_dict)
这里对解析数据对应位置没有做过多的赘述,因为这种解析数据,有耐心就好,做爬虫肯定都得自己解析的
先写到这里,下一节把获取票价贴出来,
import requests, json, threading, stationsInfo
from urllib.parse import urlencode
from get_ticket_price import get_price
base_url = "https://kyfw.12306.cn/otn/leftTicket/query?"
class Get_tickets:
def __init__(self,start_station,destination,date):
self.date = date
self.params = {
"leftTicketDTO.train_date": date,
"leftTicketDTO.from_station": stationsInfo.stations2CODE[start_station],
"leftTicketDTO.to_station": stationsInfo.stations2CODE[destination],
"purpose_codes": "ADULT"
}
self.get_data()
def get_data(self):
# 请求数据获取余票信息
url = base_url + urlencode(self.params) # 拼接请求链接
text = requests.get(url).text # 发送请求,以string方式返回
result = json.loads(text)["data"]["result"] # 提取出余票信息
self.tickets_info = []
# 提取余票信息
for r in result:
# 分割数据
r_list = r.split("|")
# 过滤数据
r_dict = {
'train_code': r_list[3],
'train_no': r_list[2],
'start_time': r_list[8],
'end-time': r_list[9],
'arrive_time': r_list[10],
'from_station': r_list[6],
'to_station': r_list[7],
'date': r_list[13],
'business_seat': r_list[-5],
'first_seat': r_list[-6],
'second-seat': r_list[-7],
'gjrw': r_list[-8],
'rw': r_list[-9],
'dw': r_list[-10],
'yw': r_list[-11],
'rz': r_list[-12],
'yz': r_list[-13],
'wz': r_list[-14],
'qt': r_list[-15],
'remark': r_list[1],
'seat_type': r_list[-2],
"from_station_no": r_list[16],
"destinction_no": r_list[17],
}
# 数据重整
for key in r_dict:
if r_dict[key] == "":
r_dict[key] = '--'
# 填入数据
self.tickets_info.append(r_dict)
这些就是这篇文章,涉及的代码