客户让我给她写个爬虫-流程说明

87 阅读2分钟

客户让我给她写个爬虫

高德地图商场数据爬虫工作流程说明

1. 请求流程

当我们在代码中调用searchMalls("北京", "商场")时,发生了以下过程:

  1. 构建请求 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 表示返回详细信息)
  2. 发送 HTTP 请求

    HttpGet request = new HttpGet(url);
    CloseableHttpResponse response = httpClient.execute(request);
    
    • 创建 GET 请求对象
    • 通过 HttpClient 发送请求到高德地图服务器
    • 服务器处理请求并返回响应
  3. 接收响应数据

    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. 数据处理流程

  1. 解析 JSON 响应

    JSONObject jsonObject = JSON.parseObject(jsonResponse);
    if (jsonObject.getInteger("status") == 1) {
        List<JSONObject> pois = jsonObject.getJSONArray("pois").toJavaList(JSONObject.class);
    }
    
    • 检查响应状态
    • 提取 POI 数据列表
  2. 数据转换

    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. 关键点说明

  1. API 限制

    • 高德地图 API 有调用频率限制
    • 免费版每天有调用次数限制
    • 建议实现请求延迟和重试机制
  2. 数据完整性

    • 返回的数据可能不完整
    • 某些字段可能为空
    • 需要做好空值处理
  3. 错误处理

    • 网络异常
    • API 调用失败
    • 数据解析错误
  4. 性能考虑

    • 单次请求获取 20 条数据
    • 可以通过分页获取更多数据
    • 考虑使用连接池优化性能