根據關鍵字獲取高德地圖poi信息

根據關鍵字獲取高德地圖poi信息

百度地圖和高德地圖都提供了根據關鍵字獲取相應的poi信息的api,不過它們提供給普通開發者使用的次數有限沒法知足要求。其次百度地圖返回的poi中位置信息不是經緯度,而高德地圖則能夠返回poi的經緯度信息。git

網頁分析

  • 目的
    以關鍵字怡景中心城爲例,咱們須要使用爬蟲獲取到高德地圖返回的全部相關poi信息,本例中主要獲取poi的名稱和經緯度信息。

  • url分析
    經過chrome瀏覽器的監控,最終找到查詢結果是經過json的形式返回,請求連接是
http://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=17&city=440300&geoobj=114.056908%7C22.531457%7C114.062058%7C22.539831&keywords=%E6%80%A1%E6%99%AF%E4%B8%AD%E5%BF%83%E5%9F%8E

url中的keywords就是查詢的關鍵字,pagenum頁面數。此外通過分析發現返回結果包含20個poi信息,基本上覆蓋了關鍵字區域,本篇博客僅爬取第一頁的poi,若是想獲取後續的poi,能夠經過設置pagenum取值來獲得。chrome

poi信息包含在返回的joson數據中的poi_list字段json

  • 請求頭構建

代碼

class CrawlerGaoDe(object):
    main_url = 'http://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1' \
               '&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge' \
               '=true&is_classify=true&zoom=16&city=440300&geoobj=114.044736%7C22.550641%' \
               '7C114.055035%7C22.567386&keywords={0}'
    def __init__(self, zone_name, proxy=None):
        self.__zone_name = zone_name
        if proxy is None:
            self.__proxy = None
        else:
            self.__proxy = {'http': proxy}

    def __init_crawler_args(self):
        '''
        初始化爬蟲參數
        :return: 
        '''
        #   構造請求頭
        User_Agent = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 ' \
                     'Mobile/13B143 Safari/601.1'
        Host = 'ditu.amap.com'
        Accept = '* / *'
        Accept_Encoding = 'gzip, deflate'
        Accept_Language = 'en - US, en;q = 0.8, zh - CN;q = 0.6, zh;q = 0.4'
        amapuuid = 'b51b4430 - 611e-421e - b5f0 - d4c0069ec83a'
        Connection = 'keep - alive'
        cookie = 'guid=62e9-7327-26e6-8630; UM_distinctid=15bf554ac5ce3-07d1fa60bf59d3-24414032-' \
                 'cfcd8-15bf554ac5d163; _uab_collina=149446962066263280256309; passport_log' \
                 'in=ODY0OTIzNTQsYW1hcEF1SUZSNU45MiwyN2ZiY2x4YjJicWN3NGZjb29qYWtuYTY4bjhpdDEzN' \
                 'iwxNTA1Nzg4MDYzLE1XUm1OVE5oTlRRMk5tTmpOVEkwWWpWaU1EZzFNamRqTkdaaU5USmlabVk9; dev' \
                 '_help=A31pORob9CZKI7Sru%2B22%2FGUwNWY0ZTEyMDMwOGZiZWIyMTUyNDg3N2M5NzdiNGY3NzVhNGF' \
                 'iNDg5YzhjNjgzYmM5YjY5OTdmNjkxNjFlY2Y5%2BkDeYKdIYyjlQUymTgzjEbGZZwvhQT7HDehSDAbU71%' \
                 '2BgMgS1RZws1VsgIqQbVPGtHubQVNo3jkPiGQcc4GgNzC%2BXgQLxYhEc7WDMILJBY%2FJWXDmjfTh8Wf8e' \
                 'bkfF3VY%3D; key=bfe31f4e0fb231d29e1d3ce951e2c780; cna=HV1zEVpxFzkCATr4tPxil0OM; isg=At7' \
                 'eZS1TC8m1jV8txoi1zUMNL33gNqN9in7_KohnSiEcq36F8C_yKQRJwY1Y; CNZZDATA1255626299=593' \
                 '918092-1494468489-http%253A%252F%252Fwww.amap.com%252F%7C1505808643'
        header = {}
        header['User-Agent'] = User_Agent
        header['Host'] = Host
        header['Accept'] = Accept
        header['Accept-Encoding'] = Accept_Encoding
        header['Accept-Language'] = Accept_Language
        header['amapuuid'] = amapuuid
        header['Connection'] = Connection
        header['cookie'] = cookie
        self.__header = header
        self.__url = self.main_url.format(self.__zone_name)

    def __get_context_info(self):
        '''
        從高德地圖爬取信息
        :return: 
        '''
        #   獲取爬蟲返回信息
        req = requests.get(self.__url, headers=self.__header, proxies=self.__proxy)
        # print req.json()
        self.__context = req.json()

    def __resolve_context(self):
        '''
        解析查詢到的文本
        :return: 
        '''
        #   信息解析,保存poi名稱和經緯度
        pois = self.__context['data']['poi_list']
        records = list()
        for poi in pois:
            tmp = {'zone_name': self.__zone_name, 'disp_name': poi['disp_name'],
                   'lng': float(poi['longitude']), 'lat': float(poi['latitude'])}
            records.append(tmp)
        return records
    def do(self):
        '''
        執行
        :return: 
        '''
        self.__init_crawler_args()
        self.__get_context_info()
        return self.__resolve_context()


if __name__ == '__main__':
    #   單個關鍵字查詢
    craw_gaode = CrawlerGaoDe('怡景中心城', None)
    records = craw_gaode.do()
    print records
    pd.DataFrame.from_records(records).to_csv('/home/用戶名/Desktop/test.txt', encoding='utf-8', index=False)

上述爬蟲中能夠添加代理ip,輸出結果以下:api

disp_name   lat lng zone_name
怡景中心城   22.535799   114.05976   怡景中心城
怡景中心城停車場(出入口)   22.536416   114.059332  怡景中心城
怡景中心城廣場停車場(出口)  22.536433   114.060231  怡景中心城
怡景中心城小天才專櫃  22.535086   114.059913  怡景中心城
藤蔓慕果(怡景中心城店)    22.5358 114.05976   怡景中心城
中心城廣場停車場(出入口)   22.536676   114.059312  怡景中心城
Miss南(怡景中心城店)   22.53511    114.059967  怡景中心城
麥當勞(怡景中心城店) 22.535774   114.0591    怡景中心城
汕頭外砂烏弟滷鵝(怡景中心城店)    22.535729   114.059093  怡景中心城
家樂福(中心城店)   22.536266   114.059923  怡景中心城
陳鋼串串香(怡景中心城店)   22.535411   114.05912   怡景中心城
指典世家(怡景中心城店)    22.5344 114.059681  怡景中心城
AT.PINK.CO(怡景中心城店)  22.536248   114.059305  怡景中心城
特斯拉充電站(ipower15私駕護理中心怡景中心城店)    22.536396   114.059341  怡景中心城
雜咖(怡景中心城)   22.535469   114.060467  怡景中心城
反斗樂園(怡景中心城) 22.535394   114.059777  怡景中心城
衛生間(怡景中心城)  22.536489   114.059134  怡景中心城
衛生間(怡景中心城)  22.535927   114.059091  怡景中心城
衛生間(怡景中心城)  22.536392   114.060427  怡景中心城
衛生間(怡景中心城)  22.535931   114.06033   怡景中心城
相關文章
相關標籤/搜索