欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

神箭手云爬虫-爬取携程【国际】航班/机票信息-利用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存储数据结果图:

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

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

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

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

未完待续。

上一篇:

下一篇: