12306所有车次及时刻表的爬取中
在上一篇博文里,我最后大概写了下第一个小目标实现的思路,下面先展示一下第一个目标实现的成果。
一、成果展示
爬取完之后的结果大概是这个样子的,每一天的数据保存成一个文件夹,我是爬取了近一个月的车次信息,每一个文件夹里面存着若干个txt文件
这是文件夹的内部,txt的命名就是我上一篇博文里提到的爬取的时候的关键字keyword
打开其中一个txt文件,里面存的是这样的数据,这样看着有点乱,把它复制一下,放到 (http://www.json.cn/)
解析完之后是下面这样的,如果搜索的关键字没有返回车次数据,那么data这个list就是空,但是结构和有车次数据的相同,我们要做的就是遍历data这个list,然后取出里面的信息。
处理完每个txt文件之后得到这样的一个表格,这样我们的小目标就基本实现,已经能取到全国所有车次和对应的车次编号啦。
二、小目标部分的代码
我把所需要爬的关键字分成三类,第一种是只需要一次循环的C0-C9这样的,第二种是需要两次循环的,C10-C19这样的,第三类是纯数字的,不带字母的,这种的比较特殊,因为在搜130时,所有字母中含130的也会显示出来,如果看不懂什么意思,建议自己打开12306去试一试,看一看结果。如果你有更好地方法,欢迎沟通交流,我目前只能通过这种笨笨的方法来获取。
- 第一类的代码
import pandas as pd
import requests
import csv
import json
import os
import timeurl = "https://search.12306.cn/search/v1/train/search?keyword={}&date={}" # 先准备基础的url
date_list = ["20201211", "20201212", "20201213", "20201214", "20201215", "20201216","20201217", "20201218", "20201219", "20201220", "20201221", "20201222","20201223", "20201224", "20201225", "20201226", "20201227", "20201228","20201229", "20201230", "20201231", "20210101", "20210102", "20210103","20210104", "20210105", "20210106", "20210107", "20210108"]
# 准备日期列表,因为日期不一样,发车的车次会有变化,建议多选几天,最后再去重,尽量得到完整的车次数据
keyword_list = ["C1", "C9","D0", "D4", "D9","G4", "G9","K2", "K3", "K4", "K5", "K6"]
# 这是第一次就<100条的数据,我估计它再怎么变化也不会增加到200以上,所以这是只需要一个循环的
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}
# 定义请求头,模拟浏览器访问
proxies = {# 格式: 协议:协议://ip地址:端口号"HTTP": "http://182.34.27.89:9999"
} # 使用代理,去无忧代理找一个能用的,反爬措施,或许可以多选几个,放一个列表里,使用random随机取一个,效果更好
if not os.path.exists("爬取的12306车次数据"):os.mkdir("爬取的12306车次数据")
file_name = "爬取的12306车次数据\{}\{}.txt" # 定义文件的命名
pd_file = "爬取的12306车次数据\{}"
for i in range(0, 29): # 注意是左闭右开的if not os.path.exists(pd_file.format(date_list[i])):os.mkdir(pd_file.format(date_list[i])) # 用于判断这个日期的文件夹存在不存在,不存在就新建一个for j in range(0, 12):ful_url = url.format(keyword_list[j], date_list[i]) # 拼接完整的urlresponse = requests.get(url=ful_url, headers=headers, proxies=proxies) # 发起请求,接受响应file_name_ful = file_name.format(date_list[i], keyword_list[j]) # 拼接完整的文件名with open(file_name_ful, "w", encoding="utf-8")as f: # 新建并打开文件,将响应的内容写入txtf.write(response.content.decode("utf-8"))
- 第二类代码
import pandas as pd
import requests
import csv
import json
import os
import timeurl = "https://search.12306.cn/search/v1/train/search?keyword={}&date={}"
date_list = ["20201211", "20201212", "20201213", "20201214", "20201215", "20201216","20201217", "20201218", "20201219", "20201220", "20201221", "20201222","20201223", "20201224", "20201225", "20201226", "20201227", "20201228","20201229", "20201230", "20201231", "20210101", "20210102", "20210103","20210104", "20210105", "20210106", "20210107", "20210108"]
keyword_list = ["C2", "C3", "C5", "C6", "C7", "C8","D1", "D2", "D3", "D5", "D6", "D7", "D8","G1", "G2", "G3", "G5", "G6", "G7", "G8","K1", "K7", "K8", "K9","T", "Z"]
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}proxies = {# 格式: 协议:协议://ip地址:端口号"HTTP": "http://222.189.190.151:9999"
} # 使用代理
if not os.path.exists("爬取的12306车次数据"):os.mkdir("爬取的12306车次数据")
file_name = "爬取的12306车次数据\{}\{}.txt"
pd_file="爬取的12306车次数据\{}"
for i in range(0, 29):if not os.path.exists(pd_file.format(date_list[i])):os.mkdir(pd_file.format(date_list[i]))for j in range(0, 26):for k in range(0, 10):key_word = keyword_list[j] + str(k)ful_url = url.format(key_word, date_list[i])response = requests.get(url=ful_url, headers=headers, proxies=proxies)file_name_ful = file_name.format(date_list[i], key_word)with open(file_name_ful, "w", encoding="utf-8")as f:f.write(response.content.decode("utf-8"))
- 第三类代码
import pandas as pd
import requests
import csv
import json
import os
import timeurl = "https://search.12306.cn/search/v1/train/search?keyword={}&date={}"
date_list = ["20201211", "20201212", "20201213", "20201214", "20201215", "20201216","20201217", "20201218", "20201219", "20201220", "20201221", "20201222","20201223", "20201224", "20201225", "20201226", "20201227", "20201228","20201229", "20201230", "20201231", "20210101", "20210102", "20210103","20210104", "20210105", "20210106", "20210107", "20210108"]headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}proxies = {# 格式: 协议:协议://ip地址:端口号"HTTP": "http://171.12.115.212:9999"
} # 使用代理
if not os.path.exists("爬取的12306车次数据"):os.mkdir("爬取的12306车次数据")
file_name = "爬取的12306车次数据\{}\{}.txt"
pd_file = "爬取的12306车次数据\{}"
for i in range(0, 29):if not os.path.exists(pd_file.format(date_list[i])):os.mkdir(pd_file.format(date_list[i]))for j in range(100, 1000):key_word = str(j)ful_url = url.format(key_word, date_list[i])response = requests.get(url=ful_url, headers=headers, proxies=proxies)file_name_ful = file_name.format(date_list[i], key_word)with open(file_name_ful, "w", encoding="utf-8")as f:f.write(response.content.decode("utf-8"))
将这三个代码块运行一下,你就能得到若干文件夹,文件夹里有若干个txt文本,接下来我们就批量读取这些txt,处理这些txt,得到最后的那个表格。
三、对爬下来的数据进行初步处理
这里我只写第三类的,就是纯数字部分的数据的初步处理,剩下的两类大家照着改吧改吧就行了。
注意,代码块里之所以加了一个flag,是因为刚才那三个代码里,写的txt文件可能有出错的,就是你请求那么多次,总会有那么几个或者几十个请求出错的情况,你一个一个手工实验的时候都会出错,更别说刚才批量请求那么多次了。
这里的处理办法就是遇到写的不对的txt文件,就重新发起请求,将响应写进这个txt文件,再处理,直到读到的文件是正确的,不再发起请求,开始进入下一个txt文件进行处理
import os
import csv
import json
import re
import requests
url = "https://search.12306.cn/search/v1/train/search?keyword={}&date={}"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}
proxies = {# 格式: 协议:协议://ip地址:端口号"HTTP": "http://222.189.190.36:9999"
} # 使用代理date_list = ["20201211", "20201212", "20201213", "20201214", "20201215", "20201216","20201217", "20201218", "20201219", "20201220", "20201221", "20201222","20201223", "20201224", "20201225", "20201226", "20201227", "20201228","20201229", "20201230", "20201231", "20210101", "20210102", "20210103","20210104", "20210105", "20210106", "20210107", "20210108"]if not os.path.exists("12306爬虫原始数据处理"):os.mkdir("12306爬虫原始数据处理")file_name = "爬取的12306车次数据\{}\{}.txt"with open(f"12306爬虫原始数据处理/所有车次信息3.csv", 'w', newline="", encoding="utf-8")as f:
# with open(f"12306爬虫原始数据处理/所有车次信息5.csv", 'a', newline="", encoding="utf-8")as f:writer = csv.writer(f)# writer.writerow(["车次", "编号", "出发站", "终点站", "经停站站总数"])for i in range(0, 29):for j in range(100, 1000):flag = 1key_word = str(j)file_name_ful = file_name.format(date_list[i], key_word)while (flag == 1):try:with open(file_name_ful, "r", encoding="utf-8")as f1:content = f1.read()data_dic = json.loads(content)data_list = data_dic["data"]if date_list is not None:# print(len(data_list))for data in data_list:# station_train_code 车次station_train_code = data["station_train_code"]# train_no 编号train_no = "#" + data["train_no"] + "#"# from_station 出发站from_station = data["from_station"]# to_station 终点站to_station = data["to_station"]# total_num 经停站总数total_num = data["total_num"]# print(station_train_code, date_list[i], key_word)writer.writerow([station_train_code, train_no, from_station, to_station, total_num])flag = 0else:flag = 0continueexcept Exception as e:表格 ful_url = url.format(key_word, date_list[i])response = requests.get(url=ful_url, headers=headers, proxies=proxies)with open(file_name_ful, "w", encoding="utf-8")as f3:f3.write(response.content.decode("utf-8"))print("{}文件夹下{}txt有误,进行重新请求".format(date_list[i], key_word))
这下处理完成后,你能得到三个csv文件,分别对这三个csv文件去重,然后整合成一个最终版,包含全国所有车次及其编号的车次信息就出来啦。
最后一步就是根据得到的这个最终版,处理这个表格,发起请求,得到每一个车次经停站的详情信息。这就留到下写吧!
下的链接:
https://blog.csdn.net/weixin_43316129/article/details/111473027
12306所有车次及时刻表的爬取中相关推荐
- 12306所有车次及时刻表的爬取上
首先先介绍我最终的目标:爬取全国所有车次的经停站信息,就是图1的红色框出来的部分.那么我们所需要的是什么呢?对,就是全国所有的车次,这就是我们的第一个小目标 图1: 接着我就在XHR里抓包,结果见图2 ...
- 12306所有车次及时刻表的爬取下
终于来到下啦!!马上就要完结了,先展示一下最终的成品吧! 下面就是我们对上次那个最终版的处理,当然,不要在意我的命名,这个就是处理中篇最后的那个csv,如果我的文件名字对不上大家也不要care了,存了 ...
- 多线程爬取中超全部2018赛季职业球员
本文旨在得到全部中超职业球员信息,之后可以用于数据分析(如多维度聚类球员类型)或者利用球员名列表对体育新闻分词,找出曝光度最高或者最低调的球员,亦或者用于开发体育游戏等等 首先: 继续爬虫球探网,该网 ...
- 使用python进行股票数据爬取中的时间限制和策略
股票数据爬取中的时间限制和策略 在进行股票数据爬取时,时间限制和策略是非常重要的考虑因素.本文将介绍两个与此相关的函数:is_trade_day()和stock_work_day(). is_trad ...
- 【考公人的福利】Python爬取中公官网资料
[考公人的福利]Python爬取中公官网资料 一.简述 二.代码 三.运行结果 一.简述 写这个代码的目的是能够高效率提取中公官网的资料,例如:申论.行测.面试热点.公安基础知识等.大家可以根据个人需 ...
- (6)Python爬虫——爬取中新网新闻
工欲善其事,必先利其器.我们要进行数据挖掘,就必须先获取数据,获取数据的方法有很多种,其中一种就是爬虫.下面我们利用Python2.7,写一个爬虫,专门爬取中新网http://www.chinanew ...
- 【Python爬虫学习】八、股票数据定向爬虫(2020年1月31日成功爬取中财网,百度股市通web版404了)
功能描述: 目标:获取股票的名称和交易信息 输出:保存到文件中 程序结构设计: 步骤1:从中财网http://quote.cfi.cn/stockList.aspx获取股票列表 步骤2:根据股票列表获 ...
- python爬取率_[新手]python爬虫爬取中证指数官网数据
想用python爬虫获取中证指数官网上的几个主要指数的每日估值更新,但是下载下来的页面内容却没有想要的数据.想要的数据前面有个JavaScript标签,是不是光靠python没办法获取这个数据?求大神 ...
- python爬取javascript变量数据_javascript - [新手]python爬虫爬取中证指数官网数据
问 题 想用python爬虫获取中证指数官网上的几个主要指数的每日估值更新,但是下载下来的页面内容却没有想要的数据.想要的数据前面有个JavaScript标签,是不是光靠python没办法获取这个数据 ...
最新文章
- 女朋友为我写了一个防猝死插件...
- 基于WebForm的Front Controller模式框架
- leetcode算法题--分裂二叉树的最大乘积
- android数据存放map_go语言学习笔记(18)-二维数组和map
- SAP CRM WebClient UI Selenium UiElementHandler的实现
- Qt文档阅读笔记-Qt 3D: Simple C++ Example解析
- springboot + vue项目跨域请求解决方案
- layui引入jQuery
- 【车间调度】基于matlab粒子群算法求解车间生产调度问题【含Matlab源码 245期】
- msvcrtd.lib(crtexew.obj):error LNK2019:无法解析的外部符号WinMain@16,该符号在函数___tmainCRTStartup中被引用
- 系统集成项目管理工程师中高级一次通过经验之谈
- 计算机中的查找快捷键,Excel搜索快捷键如何在excel中快速找到所需信息
- Java实现通过证书访问Https请求
- 取消php网站验证码,如何取消网站后台的登陆验证码
- 淘宝特价版推出省心版,为什么难“钉“老人心?
- CAD梦想画图中的“绘图工具——椭圆弧”
- 第四章 DirectX 渲染流水线(上)
- HTML插入空格 HTML多个空格 HTML实体
- Java哈希表及其应用
- 仿UC视频播放(iOS源代码)
热门文章
- 推荐《天才在左,疯子在右》
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法...
- 基本粒子结构以及宇宙现象的徦说
- python kivy 控件(小部件)的属性集合
- 开发笔记-内表指针赋值
- Win7从文件服务器复制文件速度慢问题处理
- win10电脑计算机内存不足,win10系统电脑总是提示“计算机的内存不足”的恢复方案...
- 顶点法线计算的几种方式
- Camera ISO、快门、光圈、曝光这几个概念
- EXCEL排名一样大的不重复