Python列车信息爬虫

Python爬虫我已经写过很多了,其实很大部分都是在重复。所以这篇或者是以后的博客都不会从头到尾讲爬虫,只是会将之前没有遇到的问题给重点列出来。

1.任务分析

这是我们要爬取的网站,我们要做的就是输入出发地和目的地 然后点击提交按钮。例如输入上海,北京,点击提交即会出现这个如下页面。

这是有直达的情况,当然也有非直达的情况,例如大连和东莞。

所以我们在获取数据的时候要分析这两种情况。还有我们发现这是一个POST请求,我们打开开发者工具,查看请求参数。像这样的请求参数多半是因为中文引起的,而根据我以往的经验我猜测from,to是我输入的出发地和目的地。Submit是提交。

2.构造POST请求

post_data = {'from': '大连',#自己设置A城市'to': '上海','Submit': '提交','act': '3',}
post_url = 'http://qq.ip138.com/train/search138.asp'
response = requests.post(post_url, data=post_data, headers=headers, )
response.encoding = 'gb2312'  # 设置字符编码
html = response.text

按照我们以往的方法就是这样构造POST请求,但这次构造出来的请求却发现每次都获取不到数据,经过检验发现我们传入的POST请求也必须是gb2312编码。所以代码修改如下。

post_data = {'from': '大连',#自己设置A城市'to': '上海','Submit': '提交','act': '3',}
post_data = urlencode(post_data, encoding='gb2312')
post_url = 'http://qq.ip138.com/train/search138.asp'
response = requests.post(post_url, data=post_data, headers=headers, )
response.encoding = 'gb2312'  # 设置字符编码
html = response.text

3.数据获取

刚刚提到了数据获取有两种情况,一种是直达,一种是转乘的。

直达的数据很好获取,转乘的就需要考虑一些逻辑问题了,这里不属于什么技术难点我就不再赘述。

def parse_html(url, post_data):html = get_html(url, post_data)info_pattern = re.compile('<td bgcolor="#CCE6CD">.*?<b>(.*?)</b>'#G1251'.*?<td>(.*?)</td>'#大连'<td>(.*?)</td>'#上海虹桥'<td>(.*?)</td>'#高速'.*?<td>(.*?)</td>'#大连'.*?<td>(.*?)</td>'#08:41'.*?<td>(.*?)</td>'#上海虹桥'.*?<td>(.*?)</td>'#20:00'.*?<td>(.*?)</td>'#时长'.*?<td>(.*?)</td>',re.S)#多少公里info_list = re.findall(info_pattern,html)with open('info.csv','a',newline='',encoding='utf-8-sig') as f:for info in info_list:writer = csv.writer(f)writer.writerow(info)if len(info_list) == 0:counts_pattern = re.compile('table cellpadding="3"(.*?)ble>',re.S)counts = re.findall(counts_pattern,html)way_list = []first_title = []second_title = []first_detail_info_list = []second_detail_info_list = []for count in counts:# print(count)way_pattern = re.compile('<th colspan="5">(.*?)</td>',re.S)way = re.findall(way_pattern,count)title_pattern = re.compile('bgcolor="#CCE6CD"><td>(.*?)</td>'  # 出发车次'<td width="120">(.*?)</td>'  # 大连北发车'<td width="120">(.*?)</td>'  # 到达葫芦岛北'<td width="120">(.*?)</td>'  # 旅行时间'<td width="80">(.*?)</td>'  # 旅行距离, re.S)title = re.findall(title_pattern, count)first_info_pattern = re.compile('旅行距离(.*?)td width="80">',re.S)first_info = re.findall(first_info_pattern,count)first_detail_info_pattern = re.compile('onmouseover=.*?blank">(.*?)</a>'  # D35(大连北-北京)'.*?<td>(.*?)</td>'  # 10:34'.*?<td>(.*?)</td>'  # 13:22'.*?<td>(.*?)</td>'  # 2小时29分钟'.*?<td>(.*?)</td>'  # 436, re.S)first_detail_info = re.findall(first_detail_info_pattern, first_info[0])second_info_pattern = re.compile('旅行距离.*?旅行距离(.*?)</ta',re.S)second_info = re.findall(second_info_pattern,count)second_detail_info_pattern = re.compile('onmouseover=.*?blank">(.*?)</a>'  # D35(大连北-北京)'.*?<td>(.*?)</td>'  # 10:34'.*?<td>(.*?)</td>'  # 13:22'.*?<td>(.*?)</td>'  # 2小时29分钟'.*?<td>(.*?)</td>'  # 436, re.S)second_detail_info = re.findall(second_detail_info_pattern,second_info[0])way_list.append(way)first_title.append(title[0])second_title.append(title[1])first_detail_info_list.append(first_detail_info)second_detail_info_list.append(second_detail_info)with open('info.csv', 'a', newline='', encoding='utf-8-sig') as f:writer = csv.writer(f)for i in range(len(way_list)):writer.writerow(way_list[i])writer.writerow(first_title[i])for j in range(len(first_detail_info_list[i])):writer.writerow(first_detail_info_list[i][j])writer.writerow(second_title[i])for j in range(len(second_detail_info_list[i])):writer.writerow(second_detail_info_list[i][j])

4.数据展示

Python列车信息爬虫相关推荐

  1. Python实现信息自动配对爬虫排版程序(附下载)

    授权自AI科技大本营(ID:rgznai100) 本文约2800字,建议阅读7分钟. 本文为你介绍Python实现信息自动配对爬虫排版程序. 公众号(DatapiTHU)后台回复"20200 ...

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

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

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

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

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

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

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

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

  6. python爬虫教程:Scrapy框架爬取Boss直聘网Python职位信息的源码

    今天小编就为大家分享一篇关于Scrapy框架爬取Boss直聘网Python职位信息的源码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 分析 使用Crawl ...

  7. 用python 通过12306api抓取列车信息

    参考: 12306官方火车票api 12306火车票查询 PS:本文为学习参考实例.代码与上述大体相同. 首先了解这些查询接口是怎么来的 chrome是个好东西,特别是它的控制台能看到很多细节. 12 ...

  8. 【python实现网络爬虫(5)】第一个Scrapy爬虫实例项目(Scrapy原理及Scrapy爬取名言名句网站信息)

    Scrapy介绍 总共有五部分组成的:具体的流程可看图示 引擎.调度器.下载器.蜘蛛和项目管道 爬取流程 针对于每个URL, Scheduler -> Downloader -> Spid ...

  9. Python学习之爬虫(一)--获取论坛中学生获得offer信息

    Python学习之爬虫(一)–获取论坛中学生获得offer信息 目的:爬取帖子中每个学生的offer信息,并保存在Excel文档中. 爬取结果 过程 1. 爬取每个帖子中学生offer信息 1.1 查 ...

最新文章

  1. GoogleFusionTablesAPI初探地图与云计算
  2. 17日南土所蒋瑀霁报告:红壤团聚体尺度养分转化的生物学过程(线虫-微生物互作机制)...
  3. 电脑常见问题_电脑知识,每日一课,计算机常用维修小技巧
  4. 《CSS揭秘》-背景与边框
  5. 4.Eclipse的安装和使用
  6. js前台编码,asp.net后台解码 防止前台传值到后台为乱码
  7. WebRTC 音频模块单独编译 --【转载】
  8. 10.27模拟 总结
  9. CSS3 outline-offset 属性 项目中input会遇到
  10. html css考试题选择题,html_JavaScript_css试题
  11. 查找目录下的及子目录下的 所有的给定后缀名的文件并将其路径打印到一个文件中。
  12. OpenShift 4之唤醒休眠的OpenShift应用
  13. 企业千人千面管理模式_一汽解放青岛汽车有限公司荣获“2020(第十六届)中国企业教育先进单位百强”...
  14. Redis基础(一)——NoSQL
  15. 链表和数组的区别在哪里?
  16. 动画效果之时间轴对象构造器(即逐个执行动画)
  17. JavaScript 原型精髓 #一篇就够系列
  18. kali linux 安装中文输入法
  19. 医院his系统机房服务器,医院信息中心机房如何建设
  20. 汽车车载电子设备可靠性标准及项目汇总

热门文章

  1. IDEA使用JDBC连接MySQL数据库详细教程
  2. UE4 获取系统时间方法
  3. 解决联想电脑右键文件卡顿问题
  4. java callable接口_Java Callable接口实现细节详解
  5. 重启php软重启_重启PHP命令
  6. 百度发布2021高考十大热搜专业!最火爆的专业竟然是 ....
  7. linux 修改无损分区大小,CentOS 7.6无损调整分区大小
  8. 北理工计算机学院梁玮,梁玮 - 北京理工大学 - 计算机学院
  9. matlab非齐次泊松过程,非齐次泊松过程和复合Poisson过程.ppt
  10. JS处理高德地图API返回的省市区数据