高德地图商场数据爬虫工作流程说明
1. 请求流程
当我们在代码中调用searchMalls("北京", "商场")时,发生了以下过程:
-
构建请求 URL
String url = String.format("%s?key=%s&keywords=%s&city=%s&types=060100&offset=20&page=1&extensions=all", AMAP_API_URL, AMAP_API_KEY, keywords, city);- 基础 URL:
https://restapi.amap.com/v3/place/text - 参数说明:
key:高德地图 API 密钥keywords:搜索关键词("商场")city:城市名称("北京")types:POI 类型(060100 表示商场)offset:每页记录数(20 条)page:当前页码extensions:返回结果控制(all 表示返回详细信息)
- 基础 URL:
-
发送 HTTP 请求
HttpGet request = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(request);- 创建 GET 请求对象
- 通过 HttpClient 发送请求到高德地图服务器
- 服务器处理请求并返回响应
-
接收响应数据
String jsonResponse = EntityUtils.toString(response.getEntity());- 服务器返回 JSON 格式的数据
- 响应示例:
{ "status": "1", "info": "OK", "infocode": "10000", "count": "20", "pois": [ { "id": "B0FFG8YQXB", "name": "万达广场", "type": "购物服务;购物中心;购物中心", "address": "北京市朝阳区建国路93号", "location": "116.481488,39.904989", "tel": "010-12345678", "business_hours": "10:00-22:00", "rating": "4.5" } // ... 更多商场数据 ] }
2. 数据处理流程
-
解析 JSON 响应
JSONObject jsonObject = JSON.parseObject(jsonResponse); if (jsonObject.getInteger("status") == 1) { List<JSONObject> pois = jsonObject.getJSONArray("pois").toJavaList(JSONObject.class); }- 检查响应状态
- 提取 POI 数据列表
-
数据转换
for (JSONObject poi : pois) { MallInfo mall = new MallInfo(); mall.setId(poi.getString("id")); mall.setName(poi.getString("name")); // ... 设置其他字段 }- 将 JSON 数据转换为 Java 对象
- 提取关键信息并存储
3. 数据流向图
用户请求
↓
构建URL(包含搜索参数)
↓
发送HTTP请求到高德地图API
↓
高德地图服务器处理请求
↓
返回JSON格式的响应数据
↓
解析JSON数据
↓
转换为MallInfo对象
↓
返回结果给调用者
4. 关键点说明
-
API 限制
- 高德地图 API 有调用频率限制
- 免费版每天有调用次数限制
- 建议实现请求延迟和重试机制
-
数据完整性
- 返回的数据可能不完整
- 某些字段可能为空
- 需要做好空值处理
-
错误处理
- 网络异常
- API 调用失败
- 数据解析错误
-
性能考虑
- 单次请求获取 20 条数据
- 可以通过分页获取更多数据
- 考虑使用连接池优化性能