python爬虫系列:12306票务信息爬虫

前言

  • 授人以鱼不如授人以渔,这篇文章主要想教大家的是分析过程,以后遇到其他问题时也能从容应付。当然,在文章最后会附上代码,直接点的同学可以跳过前面两节

一、环境配置

  • Python版本:3.7
  • IDE:PyCharm
  • 用到的库:requests

二、分析过程

  1. 确认数据所在的网页。好的,就是它了
    python爬虫系列:12306票务信息爬虫_第1张图片

  2. 一般来说,这种查票肯定是有接口的,只要我们把接口找出来,获得票务信息就只需简单的把参数传进去就行了。所以我们按下 F12 来分析(我用的是 Chrome 浏览器),点击 Network ,刷新一次页面即可获得这个页面用到的资源文件
    python爬虫系列:12306票务信息爬虫_第2张图片

  3. 点击资源文件可以查看详细内容,这里我们选择Response,查看它的响应内容。经过逐一排查后,我们即可发现接口的位置
    python爬虫系列:12306票务信息爬虫_第3张图片

  4. 我们点击Headers查看它的请求URL,接口的参数有四个,分别是leftTicketDTO.train_dateleftTicketDTO.from_stationleftTicketDTO.to_stationpurpose_codes。前三个就是字面意义,分别是出发时间出发站到达站。最后一个purpose_codes我也不知道啥用的,测试了很多次都是固定值ADULT
    python爬虫系列:12306票务信息爬虫_第4张图片

  5. 好了,接口都有了,我们是不是可以开始搞事情了?等等,上面那个出发站和到达站的参数(GZQHBB)是什么鬼?这个东西应该是车站对应的编号,我们再耐心地翻翻Network里的资源文件。我们很容易就能发现station_name.js?station_version=1.9109这个文件。就喜欢这种老实人,光看名字就知道它是干嘛的了
    python爬虫系列:12306票务信息爬虫_第5张图片

  6. 现在我们只需把上面获得的数据处理一下,就能获得各车站的编号了(注:处理代码见最后)。接下来就是处理票务信息接口的信息了

  7. 最后就是调用接口获得数据了,返回的数据如下。数据内容包括但不限于车票代号、车次、首发站、终点站、上车站、下车站、出发时间、到达时间、历时、是否可预订、日期、座位数量(高级软卧、软卧一等卧、软座、无座、硬卧二等卧、硬座、二等座、一等座、商务座特等座、动卧等)
    python爬虫系列:12306票务信息爬虫_第6张图片

三、实现代码

  1. 处理车站编号,车站的名字和编号分别储存在cityNamecityNo
    import requests
    
    url = "https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9109"
    tempList = requests.get(url).text.split('\'')[1].split('|')
    cityName = []
    cityNo = []
    for i in range(len(tempList)):
    if (i % 5 == 1):
        cityName.append(tempList[i])
    elif (i % 5 == 2):
        cityNo.append(tempList[i])
    
  2. 处理票务信息,结果储存在ticketInfoList
    import requests
    import json
    
    url = "https://kyfw.12306.cn/otn/leftTicket/queryT?leftTicketDTO.train_date=2019-09-05&leftTicketDTO.from_station=GZQ&leftTicketDTO.to_station=BJP&purpose_codes=ADULT"
    headers = {
    	'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:68.0) Gecko/20100101 Firefox/68.0',
    	'Referer': 'https://www.12306.cn/index/'
    }
    
    ticketsJson = json.loads(requests.get(url, headers=headers).text)
    ticketsInfo = ticketsJson['data']['result']  # 获得接口中的result
    ticketInfoList = []   # 存储各辆列车的票务信息
    for i in range(len(ticketsInfo)):  # 处理数据
    	temp = ticketsInfo[i].split('|')
    	tempDict = {}
    	tempDict['编号'] = temp[2]
    	tempDict['车次'] = temp[3]
    	tempDict['首发站'] = temp[4]
    	tempDict['终点站'] = temp[5]
    	tempDict['上车站'] = ticketsJson['data']['map'][temp[6]]  # 车站与它对应编号的映射
    	tempDict['下车站'] = ticketsJson['data']['map'][temp[7]]
    	tempDict['出发时间'] = temp[8]
    	tempDict['到达时间'] = temp[9]
    	tempDict['历时'] = temp[10]
    	tempDict['是否可预订'] = temp[11]
    	tempDict['上车站编号'] = temp[16]
    	tempDict['下车站编号'] = temp[17]
    	tempDict['高级软卧'] = temp[21]
    	tempDict['软卧一等卧'] = temp[23]
    	tempDict['软座'] = temp[24]
    	tempDict['无座'] = temp[26]
    	tempDict['硬卧二等卧'] = temp[28]
    	tempDict['硬座'] = temp[29]
    	tempDict['二等座'] = temp[30]
    	tempDict['一等座'] = temp[31]
    	tempDict['商务座特等座'] = temp[32]
    	tempDict['动卧'] = temp[33]
    	tempDict['票价编号'] = temp[35]
    	ticketInfoList.append(tempDict)
    

你可能感兴趣的:(Python,爬虫)