一、主题式网络爬虫设计方案(15分)
利用Python爬取12306车票信息
2.主题式网络爬虫爬取的内容与数据特征分析1.从哪一站出发
2.终点站是哪里
3.选定乘车日期
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
1.在程序中我们如何获取站点.不妨想一下,选择的站点是全都保存到一个文件中,还是分开的?
2.乘车日期是不是不能小于当前系统时间而且也不能大于铁路局规定的预售期(一般是30天左右)
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
https://www.12306.cn/index/
2.Htmls页面解析
3.节点(标签)查找方法与遍历方法
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集 2.对数据进行清洗和处理 爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。 3.文本分析
思路:
1.火车票信息查询是基于车站信息查询,先完成车站信息查询,然后根据车站信息查询生成的url地址去查询当前已知出发站和目的站的所有车次车票信息
2.json文件存储当前从出发站到目的站的所有车次的详细信息
3.对json文件进行分析
4.分类查询车票(高铁、火车)
1.json文件:在12306页面选择"车票"》"单程",打开"开发人员工具",然后输入出发地、目的地
对json文件进行分析,发现是嵌套的字典,车次的所有详细信息存储在"result"中
选择一条数据然后对其进行分析,找到自己想要的数据(例如车次在的位置,出发站、到达站、座位的种类等等)
这里用的是notepad++软件,把"|"替换为"\r",这样就方便自己找到想要的数据对应的位置
分类查询车票
import requests from prettytable import PrettyTable url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090" txt=requests.get(url1).text inf=txt[:-2].split("@")[1:] #print(inf) stations={} for record in inf: rlist=record.split("|") stations[rlist[2]]={"cn":rlist[1],"qp":rlist[3],"jp":rlist[4]} #把车站编码当作key #print(stations) 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"]) sel=int(input("你的选择是:"))-1 sid=r1[sel][0] return sid fromstation=getcode("出发") tostation=getcode("到达") chufatime=input("出发日期(格式2019-01-01):").strip() qurl="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(chufatime,fromstation,tostation) print(qurl) print("你输入的查询条件是:出发站=%s,到达站=%s"%(stations[fromstation]["cn"],stations[tostation]["cn"])) ainf=requests.get(qurl).json()["data"]["result"] #json文件存储当前从出发站到目的站的所有车次的详细信息 #print(ainf,type(ainf)) 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]) #print(result) 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) elif show==3: table=PrettyTable(["车次","出发站","目的站","发车时间","到达时间","硬座","硬卧","软卧","无座"]) for i in huoche: table.add_row([i[0],i[1],i[2],i[3],i[4],i[5],i[6],i[7],i[8]]) print(table) elif show==4: print("查询结束!") break else: print("输入错误请重新输入!")
运行效果如下:
总代码
#python 火车票信息的查询 import requests url1="https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9090" txt=requests.get(url1).text inf=txt[:-2].split("@")[1:] #print(inf) stations={} for record in inf: rlist=record.split("|") stations[rlist[2]]={"cn":rlist[1],"qp":rlist[3],"jp":rlist[4]} #把车站编码当作key #print(stations) 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"]) sel=int(input("你的选择是:"))-1 sid=r1[sel][0] return sid fromstation=getcode("出发") tostation=getcode("到达") chufatime=input("出发日期(格式2019-01-01):").strip() qurl="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT".format(chufatime,fromstation,tostation) print(qurl) print("你输入的查询条件是:出发站=%s,到达站=%s"%(stations[fromstation]["cn"],stations[tostation]["cn"])) ainf=requests.get(qurl).json()["data"]["result"] #json文件存储当前从出发站到目的站的所有车次的详细信息 #print(ainf,type(ainf)) result=[] 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)) #print(result) print("车次\t出发站\t到达站 出发时间 到达时间 商务座 一等座 二等座 硬座 硬卧 软卧 无座 ") for i in result: for n in range(len(i)): print(i[n],end="\t") print()
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
结论:(1)通过这次数据的分析与可视化可以很清晰的发现
发现硬卧都有位置,但是大部分人都还是选择高铁出行,所以高铁部分位置没有。
2.对本次程序设计任务完成的情况做一个简单的小结。
对于这次的网络爬虫,我选择了一个12306高铁网爬虫,在爬取的过程中发现了很多问题,比如某个 车次太少,导致车次信息太少,无法对其进行数据可视化分析。但是通过爬取数据内容的分析,使我对车次有了更深的了解,在做这个课程遇到许多问题,但是都迎难而解,让我收获颇多。