java中從高德地圖爬取數據

本人csdn博客地址:http://blog.csdn.net/java_wucao/article/details/77800891,也可查看

工具/原料

idea
高德地圖開發者帳號
maven

方法/步驟

最近一個人負責公司的一個app項目開發,需要從高德地圖爬取杭州市全部的超市信息,放入mongodb的資料庫中。做地理位置查詢。(mongodb這部分有時間補上)

首先去高德地圖創建一個開發者帳號,獲取一個開發web服務的高德key.這個是必須要有的,可以用我這個從百度到的key試一下

廢話不說了直接上代碼

import java.io.*;

import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

* Created by cw on 2017/8/29.

*

*/

public class AddressLngLatExchange {

private static final String KEY = "389880a06e3f893ea46036f030c94700";

private static final String OUTPUT = "JSON";

private static final String GET_LNG_LAT_URL = "http://restapi.amap.com/v3/geocode/geo";

private static final String GET_LNG_PIO_URL = "http://restapi.amap.com/v3/place/polygon";

private static final Logger LOGGER = LoggerFactory.getLogger(AddressLngLatExchange.class);

//獲取指定地點經緯度

public static String[] getLngLatFromOneAddr(String address){

if(StringUtils.isBlank(address)) {

LOGGER.error("地址(" + address + ")為null或者空");

return null;

}

Map<String, String> params = new HashMap<String, String>();

params.put("address", address);

params.put("output", OUTPUT);

params.put("key", KEY);

String result = HttpUtils.URLPost(GET_LNG_LAT_URL,params,"");

JSONObject jsonObject = JSONObject.parseObject(result);

String[] lngLatArr = new String[2];

//拿到返回報文的status值,高德的該接口返回值有兩個:0-請求失敗,1-請求成功;

int status = Integer.valueOf(jsonObject.getString("status"));

if(status == 1) {

JSONArray jsonArray = jsonObject.getJSONArray("geocodes");

for(int i = 0; i < jsonArray.size(); i++) {

JSONObject json = jsonArray.getJSONObject(i);

String lngLat = json.getString("location");

lngLatArr = lngLat.split(",");

}

} else {

String errorMsg = jsonObject.getString("info");

LOGGER.error("地址(" + address + ")" + errorMsg);

}

return lngLatArr;

}

public static List<Shop> initialData(String lonLat, String keyword, List<Shop> shopListSon){

if(StringUtils.isBlank(keyword)) {

LOGGER.error("地址(" + keyword + ")為null或者空");

}

Map<String, String> params = new HashMap<String, String>();

try {

Thread.sleep(5000);

} catch (InterruptedException e1) {

e1.printStackTrace();

}

params.put("polygon", lonLat);//"118.21,29.11;120.30,30.33"

params.put("output", OUTPUT);

params.put("keywords", keyword);

params.put("offset", "20");

params.put("page", "1");

params.put("key", KEY);

String result = HttpUtils.URLGet(GET_LNG_PIO_URL,params,"UTF-8");

JSONObject jsonObject = JSONObject.parseObject(result);

int statusOne = Integer.valueOf(jsonObject.getString("status"));

//第一次獲取數據時做的判斷

if(statusOne==1){

int count=Integer.valueOf(jsonObject.getString("count"));

int pageNumber=count/20;

int remainder=count%20;

if(remainder>0)pageNumber=pageNumber+1;

for(int i=1;i<=pageNumber;i++){

params.put("page", String.valueOf(i));

result = HttpUtils.URLGet(GET_LNG_PIO_URL,params,"UTF-8");

JSONObject jsonObject2 = JSONObject.parseObject(result);

System.out.println("+++++++++"+result);

//拿到返回報文的status值,高德的該接口返回值有兩個:0-請求失敗,1-請求成功;

int status = Integer.valueOf(jsonObject2.getString("status"));

if(status == 1) {

JSONArray jsonArray = jsonObject2.getJSONArray("pois");

if(jsonArray.size()>0){

for(int j =0;j<jsonArray.size();j++){

Shop shop =new Shop();

JSONObject jsonObject1 =jsonArray.getJSONObject(j);

shop.setShopName(jsonObject1.getString("name"));

shop.setSpecificAddress(jsonObject1.getString("address"));

shop.setId(jsonObject1.getString("id"));

String [] initLonLat =jsonObject1.getString("location").split(",");

shop.setLongitude(initLonLat[0]);

shop.setLatitude(initLonLat[1]);

shopListSon.add(shop);

//DBObject  doci = new BasicDBObject("shopId", "300"+i).append("shopName", "人生得意"+i).append("shopStatus",0).append("specificAddress","天堂"+i).append("gps", new Point(new Position(lon, lat)));

}

}

} else {

String errorMsg = jsonObject.getString("info");

LOGGER.error("地址(" + keyword + ")" + errorMsg);

}

}

}

return shopListSon;

}

具體代碼請去博客內查看,這裡被字數限制了.

由於高德地圖對他的數據做了保護,我這邊採用的是矩形搜尋。 百度到杭州的經緯度劃分成多個小矩形,然後調用高德地圖的API服務。我這邊將爬取的數據寫入excel表格中,一是為了展示驗證數據是否準確,二是怕直接寫入會不會有內存泄漏問題。我上面的代碼有寫入excel和讀取excel的代碼。不過要注意一下 我用得jar包不同。寫入用的poi,讀取用的是jxl.

這邊調用http請求是客戶端,請去博客內查看,這裡被字數限制了.

maven里的配置

<dependency>

<groupId>commons-httpclient</groupId>

<artifactId>commons-httpclient</artifactId>

<version>3.1</version>

</dependency>

最後給大家看一下我爬取出來的數據.

如果有什麼不對的地方,希望大家指點一二.

相關文章

  1. 如何採集高德地圖美食地址數據

    本文介紹使用採集器採集高德地圖數據(以美食地址為例)的方法. 採集的內容包括:店鋪名,分類,地址,聯繫號碼 工具/原料 使用功能點:  創建循環翻頁  分頁列表信息採集  Ajax設置 方法/步 ...
  2. 如何使用scrapy shell 爬取數據

    如何使用scrapy shell 爬取數據 工具/原料 電腦 cmd命令行 方法/步驟 第一步:我們首先切到命令行窗口,找到我們scrapy項目目錄. 第二步:我們直接在項目目錄中輸入scrapy s ...
  3. java中如何查看一維向量的數據個數

    java中在進行向量的操作時,往往需要讀取向量的長度,比如當我們要遍歷數組的每一個數據的時候,往往會用到for語句,此時要我們知道數組的長度才可以,不然我們無法確定合適退出循環. 在c語言中,我們往往 ...
  4. 如何利用python爬取數據並保存為word文檔

    如何利用python爬取數據並保存為word文檔?請看下面的經驗吧! 方法/步驟 在做爬取數據之前,你需要下載安裝兩個東西,一個是urllib,另外一個是python-docx. 然後在python的 ...
  5. java數據展示軟體中如何設置簡單通用查詢取數

    簡單通用查詢,即類似SQL語句一樣,從某張表中讀取出某些列,並列數據滿足一些條件,不同於SQL語句的是,簡單通用查詢並不是全部用語句實現,讀取表跟列是可視化界面選擇,需要滿足的條件是通過語句open ...
  6. Java開發中如何實現高效對網頁數據抓取 Jsoup

    Java開發中如何實現高效對網頁數據抓取 Jsoup 工具/原料 Eclipss jsoup.jar 方法/步驟 本次經驗是通過導入外部Jar進行對網頁數據進行抓取,以下是我工程的分布圖. 本例子中是 ...
  7. 商戶在高德地圖中新增標註自己的商鋪信息

    告訴商家如何自行將自己的商鋪添加到高德地圖,或如果認領已經被高德收錄的商鋪以便於自己後續更新維護商鋪信息 工具/原料 電腦 營業執照照片.門臉照片 方法/步驟 打開高德地圖首頁,點擊地圖首頁左下角的& ...
  8. 如何在ppt中巧用地圖展現數據

    如果你想在年終匯報PPT中用地圖來動態展示企業這一年各地區銷售情況.競爭對手對比情況.訂單增長情況.客戶分布情況等,可以通過地圖慧統計地圖來實現哦!將地圖慧製作的地圖嵌入PPT,可以放大.縮小.點擊顯 ...
  9. java圖表報表中如何設置簡單通用查詢取數

    簡單通用查詢,即類似SQL語句一樣,從某張表中讀取出某些列,並列數據滿足一些條件,不同於SQL語句的是,簡單通用查詢並不是全部用語句實現,讀取表跟列是可視化界面選擇,需要滿足的條件是通過語句open ...
  10. java如何利用javaScript API繪製高德地圖

    如何利用javaScript API繪製高德地圖?接下來看: 工具/原料 MyEclipse10. JDK1.7 Tomcat7.x. 高德地圖核心js 方法/步驟 這裡,我用的是HTML5頁面進行設 ...
  11. Java 如何爬取網頁

    百度搜尋引擎的原理其中之一就是定期的派出網絡爬蟲到網際網路上去爬取網頁.我這裡用java寫了一個最簡單的小程序來實現這一功能. 工具/原料 Eclipse JDK 1.6 EditPlus 方法/步驟 ...
  12. 如何使用電腦在高德地圖中查看各城市地鐵運行圖

    許多朋友在出門的時候喜歡看一下路線,然後規劃一下怎麼坐地鐵.在利用電腦查看地圖時卻看不到地鐵運行圖.在這裡我將告訴大家如何查看地圖中的地鐵運行圖 工具/原料 電腦 高德地圖 方法/步驟 打開百度,輸入 ...
  13. java報表生成器中如何設置簡單通用查詢取數

    簡單通用查詢,即類似SQL語句一樣,從某張表中讀取出某些列,並列數據滿足一些條件,不同於SQL語句的是,簡單通用查詢並不是全部用語句實現,讀取表跟列是可視化界面選擇,需要滿足的條件是通過語句open ...
  14. java報表組件中如何設置簡單通用查詢取數

    簡單通用查詢,即類似SQL語句一樣,從某張表中讀取出某些列,並列數據滿足一些條件,不同於SQL語句的是,簡單通用查詢並不是全部用語句實現,讀取表跟列是可視化界面選擇,需要滿足的條件是通過語句open ...
  15. 怎樣查看java中整形數據的範圍

    在對整形數據進行處理的時候,我們往往會遇到查看整形數據大小範圍的時候,因為這往往對我們的算法要求極高,那麼怎麼查看自己java編輯器中對應的相應的數據範圍的大小呢,下面給出一種方法. 工具/原料 ec ...
  16. JAVA中的數據類型轉換

    /** * 通信格式轉換 * * Java和一些windows程式語言如c.c++.delphi所寫的網絡程序進行通訊時,需要進行相應的轉換 * 高.低字節之間的轉換 * windows的字節序為低字 ...
  17. 高德地圖地圖數據安裝方法(iPhone版)

    安卓軟體高德地圖--國內首款免費的在線導航產品AMAP,今天就和大家分享一下高德地圖地圖數據安裝方法(iPhone版),希望能夠對大家有所幫助和借鑑. 工具/原料 高德地圖 步驟/方法 通過網站下載對 ...
  18. 如何爬取網頁數據

    Python是進行網頁爬蟲和網頁數據抓取的一個不錯語言.其中python也提供了不少模塊用於數據抓取.urllib是用於打開網頁連結的模塊,urlopen()函數用於打開網頁,bs4(Beautifu ...
  19. 高德地圖地圖數據安裝方法(Android 2D版)

    高德地圖是一款不錯的地圖軟體,今天就和大家分享一下高德地圖地圖數據安裝方法(Android 2D版),希望對大家能有所幫助和借鑑. 工具/原料 高德地圖Android 2D版 安卓手機一部 電腦一台 ...
  20. Java中堆和棧是怎麼存儲數據的

    程式設計師了解堆和棧機制問題,對程序開發有很大的幫助. 工具/原料 Java IDE 方法/步驟 1.所有的基本數據類型全部是存儲在棧裡面,速度快.2.一個對象,它的實體是存儲在堆裡面的,而它的引用是存儲 ...