1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 神箭手云爬虫-爬取携程【国际】航班/机票信息-利用python解析返回的json文件将信息存

神箭手云爬虫-爬取携程【国际】航班/机票信息-利用python解析返回的json文件将信息存

时间:2018-10-28 03:25:37

相关推荐

神箭手云爬虫-爬取携程【国际】航班/机票信息-利用python解析返回的json文件将信息存

最近需要获取从上海出发到国际其他城市的航班信息,在网络上找不到相关爬取国际航班或机票信息的相关资料,即使有也是零零碎碎。

为了节省时间,我就花30买了携程1000次调取机票信息的api。偷偷吐槽一句,这个api接口很粗糙,我没法自己写爬虫程序,只能每次输入【出发城市】【到达城市】【出发日期】,然后点击一次请求测试,成功的话返回一个json,(信息还是蛮全的),失败的话返回【空】。成功话算作一次调用api接口,失败不算次数。

就这样,我根据【国际机场三字码查询表】里提及到的国际城市,一个一个点击,额,确实是个很蠢的操作,但是因为赶时间,我就这样操作了一波。很快,我发现,如果你查询的是比较的国际城市,比如东京、纽约、华盛顿,一般会能够返回航班信息;但是如果查询的是很小众的城市,比如楠迪(斐济的城市)、卡拉瓦里(巴布亚新几内亚的城市),大多时候返回的是空,(实际上,去携程官网查,确实是有当天航班信息,而这个神箭手爬取不到!我猜测可能是因为阿里这个爬虫系统不能检索到这个城市中文,也就是说,一般爬取机票信息时,会输入城市及对应的城市三字码,这样在检索的时候应该会成功率更高)。

好,就是这样,我检索了不到100个城市的航班信息。都把返回的json数据一起整理成json文件。准备利用python解析数据,并存入mysql。下面是正文。

先贴出代码,以及运行结果图。

#-*-coding:utf-8-*-#可以抽取包含多个json对象的json文件,json文件中包含了一个list类型的data#但是不可以去注释import jsonimport pymysqlimport codecsimport recomment_re = pile('(^)?[^\S\n]*/(?:\*(.*?)\*/[^\S\n]*|/[^\n]*)($)?',re.DOTALL | re.MULTILINE)def reviewdata_insert(db):with open('E:/workplace/python-workplace/json_to_mysql/data_src/ouzhou4.json', encoding='utf-8') as f:json_data = f.read()content = ''.join(json_data)match = comment_re.search(content)while match:# single line commentcontent = content[:match.start()] + content[match.end():]match = comment_re.search(content)#print(type(content))settings = json.loads(content)i=1#print(type(settings))for setting in settings:#setting2 = json.dumps(settings)#for setting in settings:#print(type(setting))#setting = json.dumps(setting2)#print(type(setting))data_items=setting["data"]#print(type(data_items))for item in data_items:flight_number = item["flight_number"]dep_time=item["dep_time"]dep_airport=item["dep_airport"]arv_time=item["arv_time"]arv_airport=item["arv_airport"]#error = setting["error"]result=[]result.append((flight_number,dep_time,dep_airport,arv_time,arv_airport))insert_re = "insert into sha_int(flight_number,dep_time,dep_airport,arv_time,arv_airport) values (%s, %s, %s, %s,%s)"cursor = db.cursor()cursor.executemany(insert_re, result)mit()print(i)i+=1if __name__ == "__main__": # 起到一个初始化或者调用函数的作用db = pymysql.connect("localhost", "root", "123456", "xiecheng", charset='utf8')cursor = db.cursor()reviewdata_insert(db)cursor.close()

mysql建表sql语句:

CREATE TABLE `sha_int2` (`index` int(11) NOT NULL AUTO_INCREMENT,`airline` varchar(20) DEFAULT NULL,`model` varchar(20) DEFAULT NULL,`flight_number` varchar(100) DEFAULT NULL,`dep_time` varchar(20) DEFAULT NULL,`dep_airport` varchar(20) DEFAULT NULL,`arv_time` varchar(20) DEFAULT NULL,`arv_airport` varchar(20) DEFAULT NULL,PRIMARY KEY (`index`)) ENGINE=InnoDB AUTO_INCREMENT=2551 DEFAULT CHARSET=utf8

mysql存储数据结果图:

解析的json文件格式如下(即从神箭手api返回的json数据格式,对了,就是有注释的json文件,很头疼,还要写正则式,匹配注释,然后再解析字段):

先写这么多,下次再来继续。等会我会把相关文件打包上传。

未完待续。

神箭手云爬虫-爬取携程【国际】航班/机票信息-利用python解析返回的json文件将信息存储进Mysql数据库

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。