在爬取12306之前需要做的工作就是:
1,分析请求过程
2,分析是否需要处理cookie
3,编写代码
4,测试爬取网站是否有访问次数限制
5,部署到正式服务器上
这里重点写 如何分析请求过程:
这是12306上面查询车次的界面,出发地和目的地 是我们需要输入的, 如果要爬取全国的所有的车次 那就需要找到全国所有的出发地到目的地的列表.
找了 很久发现在 车次查询页面https://kyfw.12306.cn/otn/queryTrainInfo/init 有我们需要的
数据 https://kyfw.12306.cn/otn/resources/js/query/train_list.js?scriptVersion=1.0
是以js 文件的形式 加载到页面的 ,文件很大,里面包含了 未来 45天 的车次数据, 但是这里只有出发点到终点,没有 中间站到中间站,我们可以使用这些数据 到上面的 搜索框中搜索我们需要的数据.
下载并 处理这个文件,方便后面使用:
#下载所有的车次数据  保存为 train_list.txt文件
def getTrain_list():requests.adapters.DEFAULT_RETRIES = 5response = requests.get(train_list_url, stream=True,verify=False)status = response.status_codeif status == 200:with open('train_list.txt', 'wb') as of:for chunk in response.iter_content(chunk_size=102400):if chunk:of.write(chunk)#分析train_list.txt文件 得出火车 出发站到终点站的数据
def trainListStartToEnd():global station_start_end_setwith open('train_list.txt','rb') as of:text=of.readline()tt=text.decode("utf-8")ss=tt.replace("},{","}\n{").replace("2017-","\n").replace("[","\n").split("\n")m_list=list()for s in ss:pattern = re.compile(r'\((\w+-\w+)\)')match = pattern.search(s)if match:m_list.append(match.group(1))station_start_end_set=set(m_list)
接下来分析搜索后 会发生什么事 :
先会有一个初始化的过程,初始化过程中使用到了 下面的参数,北京和上海是 我们输入的,但是目前没有站点编码

查看该页面的js时 发现 该链接中包含了 全国所有的站点对应的编码:
https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9002
处理里面的站点和编码 方便后面使用:
查看cookie时 发现 在请求这个链接时 是需要发送 cookie的 ,但是这些cookie怎么来的呢!

但我把cookie清空后再请求,发现请求这个链接就可以收到 cookie
接着就是请求数据接口 :
https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2017-03-27&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT
链接中的 purpose_codes 表示票的类型 这是成人票
请求这个接口需要使用到上面初始化返回回来的cookie:
请求函数:
#利用出发站到终点站 爬取期间的列车数据
def getTrainNoList(back_date,train_date,from_station,from_station_name,to_station,to_station_name):post_data= {'back_train_date':back_date,'_json_att':"",'flag':'dc','leftTicketDTO.from_station':from_station,'leftTicketDTO.to_station':to_station,'leftTicketDTO.from_station_name':from_station_name,'leftTicketDTO.to_station_name':to_station_name,'leftTicketDTO.train_date':train_date,'pre_step_flag':'index','purpose_code':'ADULT'}init_resp=requests.post(init_url,data=post_data,headers=HEADERS,allow_redirects=True,verify=False)cookies=init_resp.cookiescookies.set('_jc_save_fromStation', from_station_name+','+from_station, domain='kyfw.12306.cn', path='/')cookies.set('_jc_save_toStation', to_station_name+','+to_station, domain='kyfw.12306.cn', path='/')cookies.set('_jc_save_fromDate', train_date, domain='kyfw.12306.cn', path='/')cookies.set('_jc_save_toDate', back_date, domain='kyfw.12306.cn', path='/')cookies.set('_jc_save_wfdc_flag', 'dc', domain='kyfw.12306.cn', path='/')url=query_url+"leftTicketDTO.train_date="+train_date+"&leftTicketDTO.from_station="+from_station+"&leftTicketDTO.to_station="+to_station+"&purpose_codes=ADULT"try:response = requests.get(url, headers=HEADERS, allow_redirects=True,cookies=cookies,verify=False,timeout=10)data=""if response.status_code==200:data=response.contentdata=data.decode("UTF-8")return data,cookiesexcept  Exception as err:logger.exception('getTrainNoList error 获取车次列表错误 日期'+train_date+'从'+from_station_name+'到'+to_station_name+' :%s',err)return None,None
之后只要再对 返回的数据进行处理就可以了
技术交流可以发邮件到 zhenpeng_lin@qq.com

使用python爬取12306上面所有车次数据相关推荐

  1. python爬取12306实现按车次查询余票

    前言 本篇博客想写很久了,以前抢票时不知道你们有没有这种情况,比如你想买郑州到长春k926这个车次的票,但是车票买完了抢不到票,于是我就想多买几站看没有票,其实也贵不了多少.也就是说我想多买几站买这个 ...

  2. python + selenium 爬取12306所有车站车次数据

    python + selenium 驱动谷歌浏览器 实现模拟人工爬取车次数据,特别注意 谷歌版本和驱动器版本. 驱动获取地址:https://blog.csdn.net/weixin_44186072 ...

  3. 2021最新 python爬取12306列车信息自动抢票并自动识别验证码(三)购票篇

    项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否则后果自行 ...

  4. 2021最新python爬取12306列车信息自动抢票并自动识别验证码

    项目描述 项目前言 tiebanggg又来更新了,项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时间进行删除:切忌用于一切非法途径,否 ...

  5. python爬取12306列车信息自动抢票并自动识别验证码(一)列车数据获取篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master].注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一 ...

  6. python爬取12306列车信息自动抢票并自动识别验证码(二)selenium登录验证篇

    项目前言 自学python差不多有一年半载了,这两天利用在甲方公司搬砖空闲之余写了个小项目--[12306-tiebanggg-master]注:本项目仅供学习研究,如若侵犯到贵公司权益请联系我第一时 ...

  7. python爬取火车票网的时刻表数据

    python爬取火车票网的时刻表数据 导包 import re,requests,datetime,time,json from prettytable import PrettyTable from ...

  8. 练习:使用Python爬取COVID-19疫情国内当日数据

    练习:使用Python爬取COVID-19疫情国内当日数据 推荐公众号:数据酷客 (里面有超详细的教程) 代码来源数据酷客公众号教程 URL它是Uniform Resource Locator的缩写, ...

  9. python爬取股票信息_利用Python爬取网易上证所有股票数据(代码

    利用Python爬取网易上证所有股票数据(代码 发布时间:2018-04-14 17:30, 浏览次数:1261 , 标签: Python import urllib.request import r ...

最新文章

  1. 获取app当前可用的剩余内存
  2. 实测:xml与json速度约差4倍
  3. 利用Matlab求解线性规划问题
  4. suList() 和 asList()
  5. select read write
  6. 【转】JPA、Hibernate和Mybatis区别和总结
  7. java最新版怎么安装_Java JDK 最新版本安装与环境配置
  8. 华硕笔记本r414u怎么安装键盘_华硕笔记本键盘灯怎么开
  9. linux环境下的多线程编程(一)
  10. 如何优雅地过滤敏感词
  11. Spring中使用aop操作需要用到的aspectjweaver-1.8.7.jar包
  12. vue 3 开发环境搭建
  13. arduino 土壤温湿度传感器_arduino测量土壤湿度自动浇水提醒 - 全文
  14. CentOS 7 - Securing OpenSSH(一)
  15. 【一、视频处理】FPGA驱动OV7725摄像头模块
  16. 做市商交易策略-期货
  17. idea 设置eplice 前进后退快捷键
  18. 使用windows自带虚拟机---Hyper-V 管理器
  19. 酷狗免费下载歌曲(网易云同样适用)
  20. oracle数据库基本命令使用汇总

热门文章

  1. 1253. 将数字转换为16进制
  2. kubernets eviction策略
  3. gis里创建要素面板怎么打开_简单又高效 —— 用GIS快速完成控规编制
  4. Xilinx FPGA bit文件和MCS下载流程
  5. 抖音爱心c语言程序,抖音上用记事本编写爱心小程序教程
  6. Echarts折线图X轴Y轴图例位置调整
  7. html中的问号有什么作用,html语言中一开始的问号和双斜槓表示什麼意思?
  8. xfs文件系统:格式化以及挂载
  9. Java实现汉字转换拼音功能
  10. 中国激光直接成型LDS级树脂市场发展态势及项目投资建议报告2022-2028年