IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 爬取12306火车票信息 -> 正文阅读

[网络协议]爬取12306火车票信息

1. 模拟游览器,防止被发现是爬虫;因为12306的反爬虫做得很严,以常规的爬虫方式无法爬取到所需信息,因此需要模拟成浏览器来对其进行访问,使用一个浏览器打开12306的官方网站,然后从控制台将COOKIE复制出来作为本项目的header

headers = {

??? "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36",

??? 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',

??? 'Accept-Encoding': 'gzip, deflate, br',

??? 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',

??? 'Cache-Control': 'max-age=0',

??? 'Connection': 'keep-alive',

??? 'Host': 'kyfw.12306.cn',

? ??'Referer': 'https://www.12306.cn/',

??? 'Sec-Fetch-Dest': 'document',

??? 'Sec-Fetch-Mode': 'navigate',

??? 'Sec-Fetch-Site': 'same-site',

??? 'Sec-Fetch-User': '?1',

??? 'Upgrade-Insecure-Requests': '1',

??? "Cookie": "_uab_collina=161396635873945822102574; JSESSIONID=631FB91746707366DCBBA5BE2C7453A1; BIGipServerotn=1106248202.24610.0000; RAIL_EXPIRATION=1614230065687; RAIL_DEVICEID=io7zYXeM-Gz8YUk5ZnOn0GjmqcUoFTj4kauIJForuflzNbyVp0X8kMyAxmqJYYJAhD8NCH3XBPNqdP3i225ICWhEvFl8Rr854pgCzjRbeBru9zok8pfJayROxlXHA4KMD4zV5AlBd8SqAbVVZbCvtviysCtLN_CH; BIGipServerpool_passport=165937674.50215.0000; route=c5c62a339e7744272a54643b3be5bf64; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2021-02-22; _jc_save_toDate=2021-02-22; _jc_save_wfdc_flag=dc",

}

2. 条件输入查询

创建一个空白的车站列表便于运行爬虫后进行搜索和展示结果

def getcode(t):

??? while True:

??????? s1 = input("%s站:" % t)

??????? r1 = []

??????? for id, station in stations.items():

??????????? if s1 in station.values():

??????????????? r1.append((id, station))

??????? if r1:

??????????? break

??????? print("没有这个车站。")

??????? print("请重新输入。")

??? if len(r1) == 1:

??????? sid = r1[0][0]

??? else:

??????? print("你需要在以下车站里选择:")

??????? for i in range(len(r1)):

??????????? print(i + 1, r1[i][1]["cn"])#i代表所在元组,1代表元组后1位所对应的具体选项

??????? sel = int(input("你的选择是:")) - 1

??????? sid = r1[sel][0]

??? return sid

3.构造请求网址,上面输入的参数传入

qurl = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(

??? chufatime, fromstation, tostation)

答:第一部分
Json数据的解析以及遍历储存及输出
通过对请求过后返回的result,对json文件进行分析,发现是嵌套的字典,车次的所有详细信息存储在"result"中

我们选择其一条数据然后对其进行分析,找到自己想要的数据(例如车次在的位置,出发站、到达站、座位的种类等等),把"|"替换为"\r",这样就方便自己找到想要的数据对应的位置

我们通过分析,我们所需要的信息依次存在列表的4、6、7、8、9、10等行数,但实际的输出行数要依次减1,因此我们可以通过以下代码对json数据进行解析:
# json文件存储当前从出发站到目的站的所有车次的详细信息
ainf = requests.get(qurl, headers=headers).json()["data"]["result"]

result = []
gaotie = []
huoche = []
for i in ainf:
??? list = i.split("|")
??? checi = list[3]
??? chufa = stations[list[6]]["cn"]
??? mudi = stations[list[7]]["cn"]
??? ftime = list[8]
??? dtime = list[9]
??? sw = list[32]
??? yd = list[31]
??? rw = list[23]
??? yw = list[26]
??? wuzuo = list[28]
??? ed = list[30]
??? yz = list[29]
??? result.append((checi, chufa, mudi, ftime, dtime, sw, yd, ed, yz, yw, rw, wuzuo))
??? if checi[0] in ["G", "D"]:
??????? gaotie.append([checi, chufa, mudi, ftime, dtime, sw, yd, ed])
??? else:
??????? huoche.append([checi, chufa, mudi, ftime, dtime, yz, yw, rw, wuzuo])
在对json数据解析的结果输出中,包含以下几种情况:一、包含所有列车的情况;二、只含有动车高铁等;三、只含有普通列车的情况。
因此我们在对结果返回的时候,分成了三部分,对所有的车次情况直接返回结果result(包含所有的车次信息);对于部分查询,有一个条件判断;如果车次中对第一位字符进行判断,如果含有g、d的字符,则输出结果为gaotie;否则输出结果为huoche。
第二部分:条件查询及输出等部分(包含控制台输出及Excel输入两种方式)
查询等结果的第一种查询是控制台查询1全部 2仅查询高铁动车。3是只查询火车;在查询等同时,程序同时会将查询等结果存入到Excel? 以下是选择输出等代码和Excel存储等代码
while True:
??? print("请输入查看信息:1、全部??? 2、高铁、动车?? 3、火车??? 4、退出")
??? show = int(input("请选择:"))
??? if show == 1:
??????? table = PrettyTable(["车次", "出发站", "目的站", "发车时间", "到达时间", "商务座", "一等座", "二等座", "硬座", "硬卧", "软卧", "无座"])
??????? for i in result:
??????????? table.add_row([i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9], i[10], i[11]])
??????? print(table)
??? elif show == 2:
??????? table = PrettyTable(["车次", "出发站", "目的站", "发车时间", "到达时间", "商务座", "一等座", "二等座"])
??????? for i in gaotie:
??????????? table.add_row([i[0], i[1], i[2], i[3], i[4], i[5], i[6], i[7]])
??????? print(table)
这是excel的存储,依次获取车次信息,循环填入Excel
#f=xlwt.Workbook(encoding='utf-8')
??? #sheet01.write(0,0,'车次') #第一行第一列
??? #sheet01.write(0,1,'出发站')
??? #sheet01.write(0,2,'目的站')
??? #sheet01.write(0,3,'发车时间')
??? #sheet01.write(0,4,'到达时间') ?
??? #sheet01.write(0,5,'商务座')
??? #sheet01.write(0,6,'一等座')
??? #sheet01.write(0,7,'二等座')
??? #sheet01.write(0,8,'硬座')
??? #sheet01.write(0,9,'硬卧')
??? #sheet01.write(0,10,'软卧')
??? #sheet01.write(0,11,'无座')
??? #写内容
#for i in range(len(DATA)):
??? #sheet01.write(i+1,0,table[i]['车次'])
??? #sheet01.write(i+1,1,table[i]['出发站'])
??? #sheet01.write(i+1,2,table[i]['目的站'])
??? #sheet01.write(i+1,3,table[i]['发车时间'])
??? #sheet01.write(i+1,4,table[i]['到达时间'])
??? #sheet01.write(i+1,5,table[i]['商务座'])
??? #sheet01.write(i+1,6,table[i]['一等座'])
??? #sheet01.write(i+1,7,table[i]['二等座'])
??? #sheet01.write(i+1,8,table[i]['硬座'])
??? #sheet01.write(i+1,9,table[i]['硬卧'])
??? #sheet01.write(i+1,10,table[i]['软卧'])
??? #sheet01.write(i+1,11,table[i]['无座'])
??? #print('$',end='')?????? ?
#f.save(u'C:\\期末\\车次信息.xls')
运行效果如下

?

?

?

?

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:52:13  更:2021-12-24 18:53:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:57:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码