×

58 同城 item_get - 获取详情数据接口对接全攻略:从入门到精通

万邦科技Lex 万邦科技Lex 发表于2026-01-19 08:50:22 浏览68 评论0

抢沙发发表评论

58 同城 item_get 接口(官方标准命名 58 同城.item.get)是通过信息唯一 ID(item_id) 获取全品类本地生活信息详情的核心接口,覆盖房产、招聘、二手车、二手物品、家政服务等 58 同城主流业务线。该接口采用 HTTPS+AppKey/Secret 签名认证,支持 JSON/XML 双格式返回,具备字段丰富、数据实时、权限分级的特点,是构建本地生活服务平台、垂直领域数据中台的核心依赖。本攻略从接口认知、权限准备、实操对接、调试排错到生产级优化,提供全链路标准化指导。

一、接口核心认知:功能与适配场景

1. 接口定位与核心价值

  • 核心功能:输入信息唯一 ID(item_id,从item_search接口或 58 同城官网详情页提取),返回对应信息的全维度结构化详情;支持按需指定业务线(如房产、招聘)、字段过滤,兼顾数据完整性与响应速度;可联动item_search/city_list接口,实现 “城市筛选→列表检索→详情查看” 的完整业务闭环。

  • 58 同城数据特性

    • 多业务线全覆盖:一套接口适配房产(新房 / 二手房 / 租房)、招聘(全职 / 兼职)、二手车、二手物品等全品类信息,无需单独对接不同业务接口;

    • 交易属性突出:返回信息包含联系人、联系方式、交易状态、报价有效期等核心交易字段,适配本地生活服务交易场景;

    • 数据实时性强:信息上架、下架、价格调整等动态数据1 分钟内同步,保障详情数据时效性;

    • 权限分级管控:基础详情(标题 / 价格 / 基本属性)对所有权限开放,敏感数据(联系人电话、精准位置)需企业资质 + 合规备案双重授权。

  • 典型应用场景

    1. 本地生活服务平台:整合 58 同城多品类信息,搭建一站式本地生活检索与交易平台;

    2. 垂直领域数据中台:针对房产、招聘等单一领域,批量采集详情数据构建行业分析模型;

    3. 中介 / 商家获客系统:获取目标客户信息详情,生成精准获客清单;

    4. 比价 / 评测工具:抓取二手物品、二手车等价格与参数信息,实现跨平台比价。

2. 核心参数与返回字段

(1)请求参数(GET/POST 提交,需签名认证)

参数类型参数名称类型是否必填说明应用示例
公共参数app_keystring应用密钥(开放平台获取)58_appkey_2026_abc123

secretstring应用秘钥(开放平台获取)58_secret_2026_def456

api_namestring接口名称,固定为item_get58同城.item.get

formatstring响应格式,默认 JSONjson/xml

vstring接口版本,固定为1.01.0

timestampstring时间戳(秒级)1735689600
业务参数item_idstring信息唯一 ID123456789(房产)/987654321(招聘)

cate_idstring业务线分类 ID(精准定位品类)1(房产)/2(招聘)/3(二手车)

field_filterstring字段过滤(指定返回字段,逗号分隔)title,price,contact_name,address

need_contactbool是否返回联系人信息(需高级权限)true/false

need_mediabool是否返回图片 / 视频 URLtrue
注意事项
  1. item_id 是唯一必填业务参数,不同业务线的item_id格式不同,需与cate_id匹配使用;

  2. timestamp 参数需为秒级时间戳,与服务器时间误差不得超过 10 分钟,否则签名验证失败;

  3. 签名生成需包含所有非空参数,按参数名 ASCII 升序排序后拼接secret进行 MD5 加密,缺失任一参数会导致认证失败。

(2)返回核心字段(按业务线分类)

业务线核心字段说明
房产类(新房 / 二手房 / 租房)item_id、title、cate_name、price、unit_price、house_style、area_build、orientation、floor、address、metro_info、contact_name、phone(需权限)price:租房为月租(元),二手房 / 新房为总价(万元);unit_price:元 /㎡(仅二手房 / 新房)
招聘类(全职 / 兼职)item_id、title、company_name、salary、work_city、work_address、job_type、requirement、contact_person、phone(需权限)salary:如 “5000-8000 元 / 月”;requirement:学历 / 经验要求
二手车类item_id、title、brand、model、year、mileage、price、displacement、gear_box、contact_name、phone(需权限)year:上牌年份;mileage:万公里数
二手物品类item_id、title、cate_name、price、new_degree、publish_time、address、contact_name、phone(需权限)new_degree:新旧程度(如 “9 成新”)
公共字段publish_time、update_time、status、view_count、collect_count、support_tagsstatus:信息状态(有效 / 已下架 / 审核中);view_count:浏览量
提示:need_contact=true 时,仅企业高级权限且完成合规备案的应用可返回联系人电话,个人测试权限仅返回联系人姓名。

3. 接口限制与注意事项

权限类型日调用上限调用频率适用场景
个人测试权限100 次 / 天1 次 / 秒功能调试、个人信息查询
企业基础权限1000 次 / 天3 次 / 秒中小型本地服务平台、中介系统
企业高级权限10000 次 / 天10 次 / 秒大型数据服务商、全国性本地生活平台
  • 数据缓存规则:基础详情数据(标题 / 价格 / 基本属性)缓存 15 分钟,动态数据(浏览量 / 收藏量)缓存 5 分钟,媒体资源 URL 缓存 24 小时;

  • 地域限制:部分城市的房产、招聘信息受本地监管政策限制,仅对本地备案企业开放;

  • 调用频率限制:超出频率上限会触发临时封禁 15 分钟,多次超限会导致账号权限降级;

  • 合规要求:数据仅可用于自有平台展示或合法商业分析,严禁转售、篡改或用于骚扰式获客(如批量拨打联系人电话)。


二、对接前准备:权限与环境搭建

1. 获取接口权限(官方唯一合规路径)

58 同城 item_get 接口的权限需通过58 同城开放平台申请,步骤如下:
  1. 登录 58 同城开放平台(https://open.58.com),注册企业 / 个人开发者账号;

  2. 提交资质审核:

    • 企业用户:上传营业执照、法人身份证、业务范围说明(如 “房产信息平台开发”);

    • 个人用户:上传身份证,填写应用用途(如 “个人租房信息查询工具”);

  3. 创建应用,填写应用名称、服务器 IP 白名单、数据用途说明,提交审核;

  4. 审核通过后,在 “应用管理 - 密钥管理” 中获取 app_keysecret(接口调用核心凭证);

  5. 申请 58同城.item.get 接口权限,基础权限审核周期为 1-3 个工作日,高级权限(含联系人电话)需额外提交《数据合规使用承诺书》。

风险提示:严禁通过非官方爬虫抓取 58 同城详情数据,违反协议会导致账号封禁并承担法律责任。

2. 技术环境准备

(1)支持语言与协议

  • 协议:HTTPS(强制),HTTP 请求会被直接拦截并返回 403 错误;

  • 开发语言:Python、Java、PHP、Go 等主流语言均可,推荐 Python(代码简洁,适配签名生成与多业务线数据解析)。

(2)必备工具与依赖

工具类型推荐工具用途
调试工具58 同城开放平台调试工具在线输入item_id/cate_id,生成签名并测试接口响应

Postman模拟 GET/POST 请求,保存不同业务线的测试用例

item_id 提取工具从 58 同城官网详情页 URL 中提取标准item_id
开发依赖(Python)requests发送 HTTPS 请求

hashlib生成 MD5 签名

jsonpath-ng快速解析嵌套 JSON 数据

pandas整理详情数据并导出 Excel
辅助工具Redis缓存详情数据,减少重复调用

logging记录接口调用日志,便于问题排查与审计

三、实操步骤:接口对接全流程(Python 示例)

步骤 1:理解签名认证规则(核心,必掌握)

58 同城所有接口采用统一的 app_key+secret+timestamp 签名认证 机制,item_get 接口的签名生成步骤如下:
  1. 收集所有非空请求参数(含公共参数app_key/api_name/timestamp等 + 业务参数item_id/cate_id等);

  2. 按参数名ASCII 升序排序(如api_name排在app_key之前);

  3. 拼接参数为 key1value1key2value2... 的字符串格式(无分隔符,参数值需与传入一致);

  4. secret 拼接在参数串末尾,生成签名原串;

  5. 对原串进行 MD5 加密,转为大写字符串,即为签名 sign

  6. sign 添加到请求参数中,发送 HTTPS GET 请求。

步骤 2:完整代码实现(含签名生成 + 多业务线适配 + 数据标准化)

(1)依赖安装

bash

(2)Python 代码实现

import requests
import hashlib
import time
import logging
import pandas as pd
from typing import Optional, Dict
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
# 日志配置:记录调用日志,便于问题排查与审计
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[logging.FileHandler("58_item_get.log"), logging.StreamHandler()]
)

# 配置信息(替换为你的开放平台app_key/secret)
CONFIG = {
    "app_key": "你的app_key",
    "secret": "你的secret",
    "api_url": "https://openapi.58.com/item_get",
    "format": "json",
    "version": "1.0"
}

def generate_sign(params: Dict[str, str], secret: str) -> str:
    """生成58同城接口签名(MD5加密,大写)"""
    # 1. 按参数名ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 2. 拼接参数为 key1value1key2value2 格式
    param_str = "".join([f"{k}{v}" for k, v in sorted_params])
    # 3. 拼接secret并MD5加密,转大写
    sign_str = param_str + secret
    sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
    return sign

def standardize_detail_data(raw_data: Dict, cate_id: str) -> Dict:
    """标准化详情数据,适配不同业务线"""
    # 公共字段标准化
    base_data = {
        "信息ID": raw_data.get("item_id", ""),
        "标题": raw_data.get("title", ""),
        "业务线分类": raw_data.get("cate_name", ""),
        "发布时间": raw_data.get("publish_time", ""),
        "更新时间": raw_data.get("update_time", ""),
        "信息状态": raw_data.get("status", ""),
        "浏览量": raw_data.get("view_count", 0),
        "收藏量": raw_data.get("collect_count", 0),
        "配套标签": ",".join(raw_data.get("support_tags", [])),
        "联系人": raw_data.get("contact_name", "暂无"),
        "数据请求时间": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    }

    # 不同业务线字段适配
    if cate_id == "1":  # 房产类
        price = raw_data.get("price", 0.0)
        price_desc = f"{price}万元" if raw_data.get("cate_name") in ["新房", "二手房"] else f"{price}元/月"
        base_data.update({
            "价格": price_desc,
            "单价(元/㎡)": raw_data.get("unit_price", 0.0),
            "户型": raw_data.get("house_style", ""),
            "建筑面积(㎡)": raw_data.get("area_build", 0.0),
            "朝向": raw_data.get("orientation", ""),
            "楼层": raw_data.get("floor", ""),
            "详细地址": raw_data.get("address", ""),
            "地铁配套": raw_data.get("metro_info", "暂无")
        })
    elif cate_id == "2":  # 招聘类
        base_data.update({
            "薪资范围": raw_data.get("salary", ""),
            "公司名称": raw_data.get("company_name", ""),
            "工作城市": raw_data.get("work_city", ""),
            "工作地址": raw_data.get("work_address", ""),
            "职位类型": raw_data.get("job_type", ""),
            "任职要求": raw_data.get("requirement", "")
        })
    elif cate_id == "3":  # 二手车类
        base_data.update({
            "品牌型号": f"{raw_data.get('brand', '')} {raw_data.get('model', '')}",
            "上牌年份": raw_data.get("year", ""),
            "里程数(万公里)": raw_data.get("mileage", 0.0),
            "排量(L)": raw_data.get("displacement", ""),
            "变速箱类型": raw_data.get("gear_box", ""),
            "报价(万元)": raw_data.get("price", 0.0)
        })
    else:  # 二手物品等其他品类
        base_data.update({
            "价格(元)": raw_data.get("price", 0.0),
            "新旧程度": raw_data.get("new_degree", ""),
            "详细地址": raw_data.get("address", "")
        })

    # 敏感信息处理(仅高级权限返回)
    if raw_data.get("phone"):
        base_data["联系电话"] = raw_data.get("phone")
    else:
        base_data["联系电话"] = "权限不足,未返回"

    return base_data

def item_get_58(
    item_id: str,
    cate_id: Optional[str] = None,
    field_filter: Optional[str] = None,
    need_contact: bool = False,
    need_media: bool = True
) -> Dict:
    """调用58同城item_get接口获取信息详情"""
    # 1. 校验必填参数
    if not item_id:
        return {"success": False, "error_msg": "item_id不能为空", "data": {}}

    # 2. 构建公共参数
    params = {
        "app_key": CONFIG["app_key"],
        "api_name": "item_get",
        "format": CONFIG["format"],
        "v": CONFIG["version"],
        "timestamp": str(int(time.time())),  # 秒级时间戳
        "item_id": item_id,
        "need_contact": str(need_contact).lower(),
        "need_media": str(need_media).lower()
    }

    # 3. 添加工业务参数
    if cate_id:
        params["cate_id"] = cate_id
    if field_filter:
        params["field_filter"] = field_filter

    # 4. 生成签名
    sign = generate_sign(params, CONFIG["secret"])
    params["sign"] = sign

    try:
        # 5. 发送HTTPS请求
        response = requests.get(
            url=CONFIG["api_url"],
            params=params,
            timeout=15,
            verify=True  # 生产环境必须开启证书验证
        )
        response.raise_for_status()  # 抛出HTTP状态码异常
        result = response.json()

        # 6. 解析响应结果
        if result.get("status") != "success":
            error_msg = f"[{result.get('error_code', '未知错误')}] {result.get('error_msg', '无错误信息')}"
            logging.error(f"获取详情失败(信息ID:{item_id}):{error_msg}")
            return {"success": False, "error_msg": error_msg, "data": {}}

        raw_detail = result.get("data", {})
        if not raw_detail:
            logging.warning(f"无详情数据返回(信息ID:{item_id})")
            return {"success": False, "error_msg": "无匹配信息详情数据", "data": {}}

        # 7. 标准化数据(根据cate_id适配)
        standard_data = standardize_detail_data(raw_detail, cate_id or "")
        return {
            "success": True,
            "data": standard_data,
            "error_msg": ""
        }

    except requests.exceptions.RequestException as e:
        logging.error(f"网络请求异常(信息ID:{item_id}):{str(e)}")
        return {"success": False, "error_msg": f"网络异常:{str(e)}", "data": {}}
    except Exception as e:
        logging.error(f"数据解析异常(信息ID:{item_id}):{str(e)}")
        return {"success": False, "error_msg": f"解析异常:{str(e)}", "data": {}}
# 封装好API供应商demo url=https://console.open.onebound.cn/console/?i=Lex
# 调用示例
if __name__ == "__main__":
    # 示例1:查询房产类信息详情(cate_id=1)
    house_item_id = "123456789"
    house_result = item_get_58(
        item_id=house_item_id,
        cate_id="1",
        field_filter="title,price,house_style,area_build,address",
        need_contact=True
    )

    if house_result["success"]:
        print("=== 58同城房产详情 ===")
        for k, v in house_result["data"].items():
            print(f"{k}: {v}")
        # 保存为Excel
        df_house = pd.DataFrame([house_result["data"]])
        df_house.to_excel(f"58同城房产详情_{house_item_id}.xlsx", index=False)
    else:
        print(f"获取失败:{house_result['error_msg']}")

    # 示例2:查询招聘类信息详情(cate_id=2)
    # job_item_id = "987654321"
    # job_result = item_get_58(item_id=job_item_id, cate_id="2")
    # if job_result["success"]:
    #     print("\n=== 58同城招聘详情 ===")
    #     for k, v in job_result["data"].items():
    #         print(f"{k}: {v}")

四、调试与问题排查:快速解决对接异常

1. 优先用官方工具调试(排除签名与参数问题)

  1. 登录 58 同城开放平台调试工具,选择 item_get 接口;

  2. 输入item_idcate_id等参数,点击 “生成签名” 并发送请求;

  3. 若官方工具调用成功 → 问题出在代码的签名生成逻辑或参数拼接错误(如时间戳格式错误、参数未转字符串);

  4. 若官方工具调用失败 → 问题出在权限配置或参数有效性(如item_id错误、IP 未加入白名单)。

2. 高频问题排查表

问题现象常见原因解决方案
签名验证失败(401)1. app_key/secret 错误或过期;2. 参数未按 ASCII 升序排序;3. timestamp 非秒级或与服务器时间差 > 10 分钟;4. 布尔参数未转小写(如 True→true)1. 核对开放平台的 app_key/secret,过期则重新申请;2. 严格按参数名 ASCII 升序排序所有非空参数;3. 确保 timestamp 为秒级时间戳,同步服务器时间;4. 将 need_contact 等布尔参数转为小写字符串
权限不足(403)1. 未申请item_get接口权限;2. 服务器 IP 不在白名单;3. 调用频率超限;4. need_contact=true 但无高级权限1. 在开放平台 “权限管理” 中申请对应接口;2. 添加服务器公网 IP 到应用白名单;3. 降低调用频率,控制并发数≤权限上限;4. 关闭 need_contact 或升级企业高级权限
参数错误(400)1. item_id 为空或格式非法;2. cate_id 与 item_id 业务线不匹配;3. field_filter 字段格式错误(如用分号分隔)1. 确保传入有效的 item_id,从 58 官网提取标准 ID;2. 确认 cate_id 与 item_id 对应业务线一致(如房产用 cate_id=1);3. field_filter 字段用英文逗号分隔
无数据返回(200 但 data 为空)1. 信息已下架或审核中;2. item_id 正确但所属业务线与 cate_id 不匹配;3. 信息受地域监管限制1. 验证 item_id 有效性,在 58 官网搜索该 ID 确认状态;2. 调整 cate_id 或不传入 cate_id 让接口自动识别;3. 联系开放平台客服确认地域权限
响应超时(504)1. 网络波动或服务器负载高;2. need_media=true 且图片 / 视频数量多;3. 高峰期调用(工作日 9:00-12:00/14:00-18:00)1. 添加重试机制,设置超时时间为 15 秒;2. 非必要时关闭 need_media 参数;3. 避开高峰期调用,分批次获取数据

五、进阶优化:生产级稳定性提升

1. 性能与配额优化

  • 批量调用优化:多item_id查询时,采用 异步并发框架(如 Python 的aiohttp),并发数严格控制在权限允许的频率上限内(如企业基础权限 3 次 / 秒);避免同步循环调用导致的效率低下。

  • 智能缓存策略:用 Redis 缓存详情数据,缓存 key 设计为 58_item_信息ID_业务线ID,缓存时间区分数据类型:

    • 动态数据(浏览量 / 收藏量):缓存 5 分钟;

    • 基础数据(标题 / 价格 / 基本属性):缓存 15 分钟;

    • 媒体资源 URL:缓存 24 小时;

      缓存失效触发条件:接口返回信息状态变更(如 “有效→已下架”)时,主动更新缓存。

  • 字段按需加载:前端详情页采用懒加载策略:

    1. 首屏仅请求核心字段(标题 / 价格 / 基本属性);

    2. 用户滚动到媒体模块时,再请求图片 / 视频 URL;

    3. 用户点击 “联系商家” 时,再请求联系人信息(需权限);

      减少单次请求的数据体积,提升响应速度。

2. 数据质量优化

  • 数据清洗与标准化

    1. item_id去重,避免重复存储同一信息数据;

    2. 过滤异常值(如价格≤0、面积≤0 的房产信息);

    3. 统一字段格式(如薪资范围统一为 “X-Y 元 / 月”,新旧程度统一为 “X 成新”);

    4. 缺失值填充(如无地铁配套的房产填充为 “暂无地铁配套”)。

  • 多业务线适配优化:根据cate_id动态解析返回字段,避免非目标业务线字段干扰(如查询招聘信息时过滤房产相关字段)。

3. 合规与安全优化

  • 密钥安全管理:生产环境禁止硬编码 app_key/secret,推荐两种存储方式:

    1. 配置中心存储:将密钥存入 Nacos、Apollo 等配置中心,应用启动时动态拉取;

    2. 环境变量存储:通过os.environ.get("58_APP_KEY")读取,避免代码泄露风险;

      定期轮换密钥(建议每 3 个月一次)。

  • 重试与熔断机制

    1. 临时性错误(403 频率超限、504 超时),采用指数退避重试策略(首次间隔 1 秒,之后翻倍,最多重试 3 次);

    2. 永久性错误(401 签名错误、400 参数错误),直接抛出异常,不重试;

    3. 引入熔断机制(如pybreaker库),当接口连续失败次数≥5 次时,暂停调用 5 分钟,避免雪崩效应。

  • 敏感信息脱敏:对返回的联系人电话进行脱敏处理(如显示为 “138****1234”),仅在用户授权后展示完整号码,避免隐私泄露。


六、扩展场景:接口联动与功能升级

  1. 全链路数据采集:联动 city_list 获取城市编码 → item_search 按城市 / 品类筛选列表 → item_get 批量获取详情,实现 “城市→列表→详情” 的完整数据链路;

  2. 本地生活服务平台搭建:整合房产、招聘、二手车等多品类详情数据,搭建一站式本地生活检索平台,支持多维度筛选与比价;

  3. 信息监控系统:定时调用item_get接口,监控目标信息的价格、状态变化,当价格下调或状态更新时,通过邮件 / 短信推送提醒;

  4. 商家获客智能助手:针对二手物品、家政服务等品类,批量获取详情数据,筛选高意向客户(如价格低于市场价的卖家),辅助商家精准获客


群贤毕至

访客