神箭手云爬虫-爬取携程【国际】航班/机票信息-利用python解析返回的json文件将信息存储进Mysql数据库
程序员文章站
2024-01-03 21:42:28
...
最近需要获取从上海出发到国际其他城市的航班信息,在网络上找不到相关爬取国际航班或机票信息的相关资料,即使有也是零零碎碎。
为了节省时间,我就花30买了携程1000次调取机票信息的api。偷偷吐槽一句,这个api接口很粗糙,我没法自己写爬虫程序,只能每次输入【出发城市】【到达城市】【出发日期】,然后点击一次请求测试,成功的话返回一个json,(信息还是蛮全的),失败的话返回【空】。成功话算作一次调用api接口,失败不算次数。
就这样,我根据【国际机场三字码查询表】里提及到的国际城市,一个一个点击,额,确实是个很蠢的操作,但是因为赶时间,我就这样操作了一波。很快,我发现,如果你查询的是比较的国际城市,比如东京、纽约、华盛顿,一般会能够返回航班信息;但是如果查询的是很小众的城市,比如楠迪(斐济的城市)、卡拉瓦里(巴布亚新几内亚的城市),大多时候返回的是空,(实际上,去携程官网查,确实是有当天航班信息,而这个神箭手爬取不到!我猜测可能是因为阿里这个爬虫系统不能检索到这个城市中文,也就是说,一般爬取机票信息时,会输入城市及对应的城市三字码,这样在检索的时候应该会成功率更高)。
好,就是这样,我检索了不到100个城市的航班信息。都把返回的json数据一起整理成json文件。准备利用python解析数据,并存入mysql。下面是正文。
先贴出代码,以及运行结果图。
#-*-coding:utf-8-*-
#可以抽取包含多个json对象的json文件,json文件中包含了一个list类型的data
#但是不可以去注释
import json
import pymysql
import codecs
import re
comment_re = re.compile(
'(^)?[^\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 comment
content = 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)
db.commit()
print(i)
i+=1
if __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文件,很头疼,还要写正则式,匹配注释,然后再解析字段):
先写这么多,下次再来继续。等会我会把相关文件打包上传。
未完待续。