百度地圖和高德地圖都提供了根據關鍵字獲取相應的poi信息的api,不過它們提供給普通開發者使用的次數有限沒法知足要求。其次百度地圖返回的poi中位置信息不是經緯度,而高德地圖則能夠返回poi的經緯度信息。git
怡景中心城
爲例,咱們須要使用爬蟲獲取到高德地圖返回的全部相關poi信息,本例中主要獲取poi的名稱和經緯度信息。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 怡景中心城