弱鸡代码,不喜轻喷。。。
# 爬取12306车次信息
# 浏览器发送请求(请求的url,请求的方式get/post,请求数据)
# 服务器作出响应(响应状态码)
# 服务器响应状态码:418,被发现是爬虫了哦
# 爬虫:模拟浏览器向服务器发送请求并处理响应结果
# 安装一个第三方模块 requests
import requests
import re
# 使用正则表达式(根据规则提取想要的数据),
# 需要引入re这个python自带的模块
# 定义一个函数,模拟浏览器向服务器发送请求,获得返回的数据
# 成功发送请求,使用requests.get(),但是服务器发现是
# 爬虫了,所以响应回来的数据不是想要的数据,解决方案:
# 1.添加一个header(# user-agent和cookie,f12,找query)
# 2.还需要添加一个cookie
# 这样就成功骗过了服务器,拿到了数据
def send_requests():
# 由于该url请求方式为get,所以使用requests中的get方法
url='https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=********************'
# 添加请求头,避免被识别为爬虫(useragent+cookie)
headers={'User-Agent':'**********',
'Cookie':'***************'}
resp=requests.get(url,headers=headers) # 请求的结果为响应
# 设置响应的编码格式,否则乱码
resp.encoding='utf-8'
return resp
# 解析数据,系统返回的数据要先转为json格式的数据(json数据在线解析):
# 转为json后发现,这是字典中套了一个字典,把想要的数据转为列表提取出来,直接
# 定义一个列表=字典【key】【key】
def parse_json(resp,city): # 提取数据
json_ticket=resp.json() # 将响应结果转为json
data_list=json_ticket['data']['result']
# 提取车次的列表:从json格式中
# 提取车次的列表,
# 先提取键为data的值,
# 再提取键为result的值
# 遍历每一个车次的信息
# 定义一个空列表,用来存放打印出来的数据
lst = []
for item in data_list:
d=item.split('|')
# 根据竖线把列表中的信息进行分隔,
# 因为给到的数据就是用|进行分隔的
lst.append([d[3],city[d[6]],city[d[7]],d[31],d[30],d[13]])
return lst
# 打印出来的数据
# 从列表中获取索引为3的表示车次,
# 索引6为查询起始站
# 索引7查询到达站
# 索引为31表示一等座
# 索引为30表示二等座
# 索引为13表示出行时间
def start():
lst=parse_json(send_requests(),get_city())
# 筛选最后输出的列表中的数据,去掉没有票的车次
for i in lst:
if i[3] != '无' and i[3] != '':
print(i)
# 获取station_name的信息(f12找station name.js,拿到url和user-agent)的方法
def get_city():
url='https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9172'
headers={'User-Agent':'***********'}
resp=requests.get(url,headers=headers)
resp.encoding='utf-8'
stations=re.findall('([\u4e00-\u9fa5]+)\|([A-Z]+)',resp.text)
# 正则表达式,提取想要的内容
stations_data=dict(stations)
# 将上面的城市列表转成字典
station_d={}
# 空字典,用于将key和value的位置进行交换
for item in stations_data:
station_d[stations_data[item]]=item
return station_d
if __name__ == '__main__':
start()
Look, if you had one shot, one opportunity To seize everything you ever wanted,one moment ,Would you capture it or just let it slip?