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 分钟内同步,保障详情数据时效性;
权限分级管控:基础详情(标题 / 价格 / 基本属性)对所有权限开放,敏感数据(联系人电话、精准位置)需企业资质 + 合规备案双重授权。
典型应用场景
本地生活服务平台:整合 58 同城多品类信息,搭建一站式本地生活检索与交易平台;
垂直领域数据中台:针对房产、招聘等单一领域,批量采集详情数据构建行业分析模型;
中介 / 商家获客系统:获取目标客户信息详情,生成精准获客清单;
比价 / 评测工具:抓取二手物品、二手车等价格与参数信息,实现跨平台比价。
2. 核心参数与返回字段
(1)请求参数(GET/POST 提交,需签名认证)
| 参数类型 | 参数名称 | 类型 | 是否必填 | 说明 | 应用示例 |
|---|---|---|---|---|---|
| 公共参数 | app_key | string | 是 | 应用密钥(开放平台获取) | 58_appkey_2026_abc123 |
| secret | string | 是 | 应用秘钥(开放平台获取) | 58_secret_2026_def456 | |
| api_name | string | 是 | 接口名称,固定为item_get | 58同城.item.get | |
| format | string | 否 | 响应格式,默认 JSON | json/xml | |
| v | string | 是 | 接口版本,固定为1.0 | 1.0 | |
| timestamp | string | 是 | 时间戳(秒级) | 1735689600 | |
| 业务参数 | item_id | string | 是 | 信息唯一 ID | 123456789(房产)/987654321(招聘) |
| cate_id | string | 否 | 业务线分类 ID(精准定位品类) | 1(房产)/2(招聘)/3(二手车) | |
| field_filter | string | 否 | 字段过滤(指定返回字段,逗号分隔) | title,price,contact_name,address | |
| need_contact | bool | 否 | 是否返回联系人信息(需高级权限) | true/false | |
| need_media | bool | 否 | 是否返回图片 / 视频 URL | true |
注意事项
item_id是唯一必填业务参数,不同业务线的item_id格式不同,需与cate_id匹配使用;
timestamp参数需为秒级时间戳,与服务器时间误差不得超过 10 分钟,否则签名验证失败;签名生成需包含所有非空参数,按参数名 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_tags | status:信息状态(有效 / 已下架 / 审核中);view_count:浏览量 |
提示:need_contact=true时,仅企业高级权限且完成合规备案的应用可返回联系人电话,个人测试权限仅返回联系人姓名。
3. 接口限制与注意事项
| 权限类型 | 日调用上限 | 调用频率 | 适用场景 |
|---|---|---|---|
| 个人测试权限 | 100 次 / 天 | 1 次 / 秒 | 功能调试、个人信息查询 |
| 企业基础权限 | 1000 次 / 天 | 3 次 / 秒 | 中小型本地服务平台、中介系统 |
| 企业高级权限 | 10000 次 / 天 | 10 次 / 秒 | 大型数据服务商、全国性本地生活平台 |
数据缓存规则:基础详情数据(标题 / 价格 / 基本属性)缓存 15 分钟,动态数据(浏览量 / 收藏量)缓存 5 分钟,媒体资源 URL 缓存 24 小时;
地域限制:部分城市的房产、招聘信息受本地监管政策限制,仅对本地备案企业开放;
调用频率限制:超出频率上限会触发临时封禁 15 分钟,多次超限会导致账号权限降级;
合规要求:数据仅可用于自有平台展示或合法商业分析,严禁转售、篡改或用于骚扰式获客(如批量拨打联系人电话)。
二、对接前准备:权限与环境搭建
1. 获取接口权限(官方唯一合规路径)
item_get 接口的权限需通过58 同城开放平台申请,步骤如下:登录 58 同城开放平台(https://open.58.com),注册企业 / 个人开发者账号;
提交资质审核:
企业用户:上传营业执照、法人身份证、业务范围说明(如 “房产信息平台开发”);
个人用户:上传身份证,填写应用用途(如 “个人租房信息查询工具”);
创建应用,填写应用名称、服务器 IP 白名单、数据用途说明,提交审核;
审核通过后,在 “应用管理 - 密钥管理” 中获取
app_key和secret(接口调用核心凭证);申请
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:理解签名认证规则(核心,必掌握)
item_get 接口的签名生成步骤如下:收集所有非空请求参数(含公共参数
app_key/api_name/timestamp等 + 业务参数item_id/cate_id等);按参数名ASCII 升序排序(如
api_name排在app_key之前);拼接参数为
key1value1key2value2...的字符串格式(无分隔符,参数值需与传入一致);将
secret拼接在参数串末尾,生成签名原串;对原串进行 MD5 加密,转为大写字符串,即为签名
sign;将
sign添加到请求参数中,发送 HTTPS GET 请求。
步骤 2:完整代码实现(含签名生成 + 多业务线适配 + 数据标准化)
(1)依赖安装
(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. 优先用官方工具调试(排除签名与参数问题)
登录 58 同城开放平台调试工具,选择
item_get接口;输入
item_id、cate_id等参数,点击 “生成签名” 并发送请求;若官方工具调用成功 → 问题出在代码的签名生成逻辑或参数拼接错误(如时间戳格式错误、参数未转字符串);
若官方工具调用失败 → 问题出在权限配置或参数有效性(如
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 小时;
缓存失效触发条件:接口返回信息状态变更(如 “有效→已下架”)时,主动更新缓存。
字段按需加载:前端详情页采用懒加载策略:
首屏仅请求核心字段(标题 / 价格 / 基本属性);
用户滚动到媒体模块时,再请求图片 / 视频 URL;
用户点击 “联系商家” 时,再请求联系人信息(需权限);
减少单次请求的数据体积,提升响应速度。
2. 数据质量优化
数据清洗与标准化:
按
item_id去重,避免重复存储同一信息数据;过滤异常值(如价格≤0、面积≤0 的房产信息);
统一字段格式(如薪资范围统一为 “X-Y 元 / 月”,新旧程度统一为 “X 成新”);
缺失值填充(如无地铁配套的房产填充为 “暂无地铁配套”)。
多业务线适配优化:根据
cate_id动态解析返回字段,避免非目标业务线字段干扰(如查询招聘信息时过滤房产相关字段)。
3. 合规与安全优化
密钥安全管理:生产环境禁止硬编码 app_key/secret,推荐两种存储方式:
配置中心存储:将密钥存入 Nacos、Apollo 等配置中心,应用启动时动态拉取;
环境变量存储:通过
os.environ.get("58_APP_KEY")读取,避免代码泄露风险;定期轮换密钥(建议每 3 个月一次)。
重试与熔断机制:
对临时性错误(403 频率超限、504 超时),采用指数退避重试策略(首次间隔 1 秒,之后翻倍,最多重试 3 次);
对永久性错误(401 签名错误、400 参数错误),直接抛出异常,不重试;
引入熔断机制(如
pybreaker库),当接口连续失败次数≥5 次时,暂停调用 5 分钟,避免雪崩效应。敏感信息脱敏:对返回的联系人电话进行脱敏处理(如显示为 “138****1234”),仅在用户授权后展示完整号码,避免隐私泄露。
六、扩展场景:接口联动与功能升级
全链路数据采集:联动
city_list获取城市编码 →item_search按城市 / 品类筛选列表 →item_get批量获取详情,实现 “城市→列表→详情” 的完整数据链路;本地生活服务平台搭建:整合房产、招聘、二手车等多品类详情数据,搭建一站式本地生活检索平台,支持多维度筛选与比价;
信息监控系统:定时调用
item_get接口,监控目标信息的价格、状态变化,当价格下调或状态更新时,通过邮件 / 短信推送提醒;商家获客智能助手:针对二手物品、家政服务等品类,批量获取详情数据,筛选高意向客户(如价格低于市场价的卖家),辅助商家精准获客