ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python高级应用程序设计任务

2019-12-20 11:51:26  阅读:272  来源: 互联网

标签:cn stations Python list 高级 station print 程序设计 r1


一、主题式网络爬虫设计方案(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高铁网爬虫,在爬取的过程中发现了很多问题,比如某个 车次太少,导致车次信息太少,无法对其进行数据可视化分析。但是通过爬取数据内容的分析,使我对车次有了更深的了解,在做这个课程遇到许多问题,但是都迎难而解,让我收获颇多。

标签:cn,stations,Python,list,高级,station,print,程序设计,r1
来源: https://www.cnblogs.com/jinchihao/p/12072313.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有