客户让我给她写个爬虫

215 阅读3分钟

基于 Java 实现高德地图商场数据爬虫

前言

在商业数据分析中,商场数据是一个重要的信息源。本文将介绍如何使用 Java 实现一个高德地图商场数据爬虫,帮助您快速获取商场信息。

项目背景

随着商业地产的快速发展,获取准确的商场数据变得越来越重要。高德地图提供了丰富的 POI(兴趣点)数据,我们可以通过其开放 API 来获取这些信息。

技术选型

  • Java 8
  • Maven
  • HttpClient:发送 HTTP 请求
  • Fastjson:JSON 数据处理
  • Lombok:简化代码
  • SLF4J:日志处理

项目结构

src/main/java/com/example/amap/
├── model/
│   └── MallInfo.java      // 商场信息实体类
├── crawler/
│   └── AmapCrawler.java   // 爬虫核心实现
└── Main.java              // 程序入口

核心实现

1. 数据模型

首先,我们定义商场信息的实体类:

@Data
public class MallInfo {
    private String id;            // 商场ID
    private String name;          // 商场名称
    private String address;       // 地址
    private String phone;         // 电话
    private String businessHours; // 营业时间
    private String rating;        // 评分
    private String latitude;      // 纬度
    private String longitude;     // 经度
    private String city;          // 所在城市
    private String district;      // 所在区域
    private String category;      // 商场类别
    private String description;   // 描述
}

2. 爬虫实现

爬虫核心类实现了与高德地图 API 的交互:

@Slf4j
public class AmapCrawler {
    private static final String AMAP_API_KEY = "YOUR_API_KEY";
    private static final String AMAP_API_URL = "https://restapi.amap.com/v3/place/text";

    private final CloseableHttpClient httpClient;

    public AmapCrawler() {
        this.httpClient = HttpClients.createDefault();
    }

    public List<MallInfo> searchMalls(String city, String keywords) {
        List<MallInfo> mallList = new ArrayList<>();
        try {
            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);

            HttpGet request = new HttpGet(url);
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                String jsonResponse = EntityUtils.toString(response.getEntity());
                JSONObject jsonObject = JSON.parseObject(jsonResponse);

                if (jsonObject.getInteger("status") == 1) {
                    List<JSONObject> pois = jsonObject.getJSONArray("pois").toJavaList(JSONObject.class);
                    for (JSONObject poi : pois) {
                        MallInfo mall = new MallInfo();
                        // 解析POI数据
                        mall.setId(poi.getString("id"));
                        mall.setName(poi.getString("name"));
                        // ... 其他字段解析
                        mallList.add(mall);
                    }
                }
            }
        } catch (IOException e) {
            log.error("爬取商场数据时发生错误", e);
        }
        return mallList;
    }
}

3. 使用示例

public class Main {
    public static void main(String[] args) {
        AmapCrawler crawler = new AmapCrawler();
        try {
            List<MallInfo> malls = crawler.searchMalls("北京", "商场");

            for (MallInfo mall : malls) {
                log.info("商场信息:");
                log.info("名称:{}", mall.getName());
                log.info("地址:{}", mall.getAddress());
                log.info("电话:{}", mall.getPhone());
                log.info("营业时间:{}", mall.getBusinessHours());
                log.info("评分:{}", mall.getRating());
                log.info("位置:{},{}", mall.getLatitude(), mall.getLongitude());
                log.info("-------------------");
            }
        } finally {
            crawler.close();
        }
    }
}

项目特点

  1. 简单易用:代码结构清晰,易于理解和扩展
  2. 功能完整:支持获取商场的详细信息
  3. 异常处理:完善的错误处理和日志记录
  4. 资源管理:正确管理 HTTP 客户端资源

使用说明

  1. 首先需要申请高德地图 API 密钥
  2. AmapCrawler.java中配置您的 API 密钥
  3. 使用 Maven 构建项目
  4. 运行 Main 类进行测试

注意事项

  1. 高德地图 API 有调用频率限制,请注意控制请求频率
  2. 建议添加请求延迟和重试机制
  3. 可以根据需要扩展数据存储功能

扩展建议

  1. 添加数据持久化(如 MySQL、MongoDB 等)
  2. 实现多线程爬取提高效率
  3. 添加代理 IP 池避免请求限制
  4. 增加数据导出功能(如 Excel、CSV 等)
  5. 添加更多的搜索条件支持

总结

本文介绍了一个基于 Java 实现的高德地图商场数据爬虫项目。通过这个项目,您可以快速获取商场数据,为商业分析提供数据支持。项目代码简洁,易于扩展,您可以根据实际需求进行功能增强。

参考资源