Python 爬虫-爬取阿里旅行特价机票信息(3)——完结

上接(1)、(2)

之前已经做到了可以查询这段时间里的特价机票消息,鉴于自己是个地理盲,有时候又想图个便宜出去溜达溜达,但目的地可能没有直接的航班,可能需要换成一下,于是有了现在的这个小功能。
现在补充上之前留下的那个功能:查询在中国的本省附近几个城市的特价机票信息。


一、获取省市信息

之前我的想法是从某一个网站进行在线查询,然后根据返回的结果获取,结果并没有合适的网站,最多也是需要在不停的在不同的网站之间转跳才可以查询得到。
于是就在网上搜关于省市信息的xml信息,最后找到了。

下面是的作用是输入城市信息,会反向输出对应的省份信息,后面主要根据这个进行查询。xml格式如下,可见这个层次区分还是很明显的:

<?xml version="1.0" encoding="UTF-8"?>
<root name="中国">
  <province name="北京市">
    <city name="北京市" index="1">
      <area name="东城区" index="1" />
      <area name="西城区" index="2" />
      <area name="崇文区" index="3" />
      <area name="宣武区" index="4" />
      <area name="朝阳区" index="5" />
      <area name="丰台区" index="6" />
      <area name="石景山区" index="7" />
      <area name="海淀区" index="8" />
      <area name="门头沟区" index="9" />
      <area name="房山区" index="10" />
      <area name="通州区" index="11" />
      <area name="顺义区" index="12" />
      <area name="昌平区" index="13" />
      <area name="大兴区" index="14" />
      <area name="平谷区" index="15" />
      <area name="怀柔区" index="16" />
      <area name="密云县" index="17" />
      <area name="延庆县" index="18" />
    </city>
  </province>
  ...
 </root>

下面函数,dig 的主要作用是找出这个县市的上级,直到省份,方便以后需要进行县级查询时的扩展。

# 获取目的地的省份
def get_Target(cityname):
    tree = ET.ElementTree(file='province_city.xml')
    root = tree.getroot()

    name = dig(root, cityname)
    for item in name:
        for province in name[item]:
            return province


def dig(tree, cityname):
    findedname = {}
    key = tree.attrib['name']

    value = []
    for elem in tree:
        if cityname in elem.attrib['name']:
            value.append(elem.attrib['name'])
            findedname[key] = value

        currentname = dig(elem, cityname)
        if currentname != {}:
            findedname[key] = currentname
    return findedname

二、航班信息规整

在第二篇中已经获取了航班信息,现在为了方便出行,我现在对航班进行按照省份的排序,将同一个省的特价航班放在一起,方便进行比较。

# 将特价航班按照省份归类
# 输入所有特价航班,将查询出来一样的省份放到同一个字典里
def flights_sort(flights):
    names = {}
    for f in flights:
        value = []
        province = get_Target(f['arrName'])
        if not names.has_key(province):
            value.append(f)
            names[province] = value
        else:
            value = names[province]
            value.append(f)
            names[province] = value
    return names

排序后的效果图

看了之后,我感觉还是很直观的。


三、查询后的航班信息输出

# 输出目的地及其附近的航班信息
def printTargetInfo(sorted_flights, targetName):
    print
    print '*****************targetInfo*****************'
    currentName = set(targetName)
    for province in sorted_flights:
        for targetProvince in currentName:
            if targetProvince == province:
                print_trip(sorted_flights[province], province)


# 输出目的地航班信息
def print_trip(flight, province):
        print '===============Province:%s===============' % province
        for f in flight:
            source = '从:%s-' % f['depName']
            dest = '到:%s\t' % f['arrName']
            price = '\t价格:%s%s(折扣:%s)\t' % ((f['price']), f['priceDesc'], f['discount'])
            depart_date = '\t日期:%s' % f['depDate']
            print source + dest + price + depart_date

最终的查询效果如下图:
查询输出效果图

完整代码见:我的Github地址


感慨一句:偷懒是生产力的来源啊!

猜你喜欢

转载自blog.csdn.net/VVBBBBB/article/details/52403823