吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1571|回复: 30
收起左侧

[Python 原创] 依据百度api搜索关键词获取商家地址和联系方式

  [复制链接]
蜗牛很牛 发表于 2024-11-11 11:53
本帖最后由 蜗牛很牛 于 2024-11-11 16:53 编辑

通过百度地图API批量搜索某个区域内的特定地点(如酒店),并获取其详细信息,包括名称、地址、经纬度和联系方式。具体步骤如下:
  • 发送搜索请求:代码使用 search_url 和 search_params 发送GET请求,查询指定区域(region)内符合关键词(keyword)的地点信息。搜索结果会以 JSON 格式返回。
  • 解析搜索结果:检查返回的JSON数据,确认请求状态正常,并获取其中的地点结果(每次最多10个)。
  • 获取地点详情:对于每个地点,根据其唯一标识符(uid)发送请求至 detail_url,获取该地点的详细信息。
  • 显示地点信息:将每个地点的名称、地址、经纬度和联系方式等信息打印到控制台。
  • 分页:代码通过 page_num 控制分页,以获取更多结果。若没有更多结果,则结束循环。

后面有百度的api的
有需要的使用该链接跳转获取百度的api
https://mp.weixin.qq.com/s?src=11×tamp=1731311146&ver=5621&signature=LyHZBszP*Jwt-jD6*mqrf*IgM29ByqnV9YkBGxJarq1Dkux9OQoLlhE3jMgJuaSPJ*foyVepfU9e2rc3OLqd3noNt2Qd5ZkoMBcgI1l6-mBqLBkSTF1V3x3jQCawJ0aw&new=1
    import webbrowser
    import requests
    import time
    def search_place(api_key, keyword, region):
    search_url = "http://api.map.baidu.com/place/v2/search"
    detail_url = "http://api.map.baidu.com/place/v2/detail"      

    page_num = 0  # 起始页码
    while True:
    search_params = {
        "query": keyword,
        "region": region,
        "output": "json",
        "ak": api_key,
        "page_num": page_num,  # 当前页码
        "page_size": 10  # 每页的结果数(最多10)
    }

    response = requests.get(search_url, params=search_params)

    if response.status_code == 200:
        data = response.json()
        if data.get("status") == 0 and data.get("results"):
            for place in data.get("results", []):
                name = place.get("name")
                address = place.get("address")
                location = place.get("location")
                lat = location.get("lat") if location else None
                lng = location.get("lng") if location else None
                uid = place.get("uid")

                detail_params = {
                    "uid": uid,
                    "output": "json",
                    "scope": 2,  # 设置为2获取详细信息
                    "ak": api_key,
                }
                detail_response = requests.get(detail_url, params=detail_params)

                if detail_response.status_code == 200:
                    detail_data = detail_response.json()
                    if detail_data.get("status") == 0:
                        detail_info = detail_data.get("result", {})
                        telephone = detail_info.get("telephone", "无联系方式")

                        print(f"名称: {name}")
                        print(f"地址: {address}")
                        print(f"经度: {lng}")
                        print(f"纬度: {lat}")
                        print(f"联系方式: {telephone}")
                        print("-" * 40)
                    else:
                        print(f"无法获取 {name} 的详细信息,错误: {detail_data.get('message')}")
                else:
                    print(f"请求详细信息失败,状态码: {detail_response.status_code}")

            page_num += 1
        else:
            # 如果没有更多结果,结束循环
            break
    else:
        print("请求失败,状态码:", response.status_code)
        break
      api_key = ""  # 替换为您的百度API密钥
      keyword = "酒店"  # 搜索关键词
      region = "武汉市江汉区"  # 搜索区域





96dfb78728a863d4abfb4406ecdfb91.jpg

免费评分

参与人数 5吾爱币 +10 热心值 +4 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zhaom1971 + 1 + 1 我很赞同!
ssjh123 + 1 我很赞同!
pingping8203 + 1 谢谢@Thanks!感谢
m921028 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

42328669425 发表于 2024-11-11 12:39
这是安卓吗
什么工具啊
ECGST 发表于 2024-11-12 13:42
本帖最后由 ECGST 于 2024-11-12 14:42 编辑

转成Java

1. AK输入为自己申请的应用;
2. 请求检验方式设置为ip白名单的;(有空的话加上sn校验方式的)
3. 效果如图所示:

[Java] 纯文本查看 复制代码
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Slf4j
public class BaiduMapSearch {

    private static final String SEARCH_URL = "http://api.map.baidu.com/place/v2/search";
    private static final String DETAIL_URL = "http://api.map.baidu.com/place/v2/detail";

    public static String AK = "";

    private static final OkHttpClient CLIENT = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .build();

    public static void main(String[] args) throws UnsupportedEncodingException {

        String keyword = "新丰小吃";
        String region = "杭州市萧山区";
        searchPlace(keyword, region);
    }


    public static void searchPlace(String keyword, String region) {
        int pageNum = 0;
        while (true) {
            Map<String, String> searchParams = new LinkedHashMap<>();
            searchParams.put("query", keyword);
            searchParams.put("region", region);
            searchParams.put("output", "json");
            searchParams.put("ak", AK);
            searchParams.put("page_num", String.valueOf(pageNum));
            searchParams.put("page_size", "10");

            String searchUrl = buildUrlWithParams(SEARCH_URL, searchParams);

            try {
                String responseData = executeRequest(searchUrl);
                JSONObject jsonResponse = JSON.parseObject(responseData);

                if (isResponseSuccessful(jsonResponse)) {
                    break;
                }

                JSONArray results = jsonResponse.getJSONArray("results");
                if (results == null || results.isEmpty()) {
                    break;
                }

                for (int i = 0; i < results.size(); i++) {
                    JSONObject place = results.getJSONObject(i);
                    processPlace(place);
                }
                pageNum++;
            } catch (IOException e) {
                log.error("请求报错: {}", e.getMessage());
                break;
            }
        }
    }

    private static String buildUrlWithParams(String baseUrl, Map<String, String> params) {
        StringBuilder urlBuilder = new StringBuilder(baseUrl);
        urlBuilder.append("?");
        for (Map.Entry<String, String> entry : params.entrySet()) {
            try {
                urlBuilder.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8")).append("&");
            } catch (Exception e) {
                log.error("URL编码错误: {}", e.getMessage());
            }
        }
        return urlBuilder.toString().substring(0, urlBuilder.length() - 1);
    }

    private static String executeRequest(String url) throws IOException {
        Request request = new Request.Builder()
                .url(url)
                .build();

        try (Response response = CLIENT.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                log.error("请求失败,状态码: {}", response.code());
                return null;
            }
            return response.body().string();
        }
    }

    private static boolean isResponseSuccessful(JSONObject jsonResponse) {
        int status = jsonResponse.getIntValue("status");
        if (status != 0) {
            log.error("搜索请求失败,错误信息: {}", jsonResponse.getString("message"));
            return true;
        }
        return false;
    }

    private static void processPlace(JSONObject place) {
        String name = place.getString("name");
        String address = place.getString("address");
        JSONObject location = place.getJSONObject("location");
        double lat = location.getDoubleValue("lat");
        double lng = location.getDoubleValue("lng");
        String uid = place.getString("uid");

        String detailUrl = String.format("%s?uid=%s&output=json&scope=2&ak=%s", DETAIL_URL, uid, AK);

        try {
            String detailResponseData = executeRequest(detailUrl);
            if (detailResponseData == null) {
                return;
            }

            JSONObject detailJsonResponse = JSON.parseObject(detailResponseData);

            if (isResponseSuccessful(detailJsonResponse)) {
                return;
            }

            JSONObject detailResult = detailJsonResponse.getJSONObject("result");
            String telephone = detailResult.getString("telephone");

            log.info("名称: {}", name);
            log.info("地址: {}", address);
            log.info("经度: {}", lng);
            log.info("纬度: {}", lat);
            log.info("联系方式: {}", telephone);
            log.info("--------------------------------------------");
        } catch (IOException e) {
            log.error("请求报错: {}", e.getMessage());
        }
    }
}

Snipaste_2024-11-12_14-41-08.png
lcg888 发表于 2024-11-11 12:31
Js2121u 发表于 2024-11-11 12:45
这个接口要付费吗。
hyy127 发表于 2024-11-11 12:47
进来学习一下
三滑稽甲苯 发表于 2024-11-11 12:50
帖子的 代码格式稍微有点问题
bfyh 发表于 2024-11-11 13:16
厉害了,
znc940210 发表于 2024-11-11 13:19
代码格式不对啊
anrika 发表于 2024-11-11 13:27
不错,感谢
lkxxs 发表于 2024-11-11 13:56
厉害了,
学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-9 13:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表