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>

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

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

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場