当前位置: 首页 > news >正文

Python 调用工厂数据 API 实战:从关键词检索到落地 CSV

写一个能落地的小脚本:按产品关键词检索工厂,翻页拉取,对候选拉档案,最后写成 CSV。数据源用天下工厂开放平台——一个覆盖全国 480 万家工厂的数据库,做了工厂身份识别(只收真实从事生产的工厂,排除贸易商与空壳类主体),对外提供 REST 和 MCP 两种等价接入方式。本文走 REST,纯requests实现,没有 SDK 依赖。

准备

密钥在开发者控制台(https://www.tianxiagongchang.com/open/console)自助签发,注册即送体验额度。调试阶段可以先用公开沙箱密钥sk-tx-test-1685549fb3710c1b36e4d75dc2d0f42a,返回示例数据、不计费,把代码跑通再换正式密钥。

importcsvimportosimporttimeimportrequests BASE="https://open.tianxiagongchang.com/open/v1/capabilities"KEY=os.environ["TIANXIA_API_KEY"]HEADERS={"Authorization":f"Bearer{KEY}","Content-Type":"application/json",}defcall(capability:str,body:dict,timeout:int=30)->dict:resp=requests.post(f"{BASE}/{capability}",json=body,headers=HEADERS,timeout=timeout)envelope=resp.json()ifenvelope["code"]==42900:# 限流:退避后由调用方重试raiseRuntimeError("rate limited")ifenvelope["code"]!=0:raiseRuntimeError(f"{envelope['code']}:{envelope['message']}"f"(request_id={envelope['request_id']})")returnenvelope

两个要点:一是判断成败看响应体里的code而不是 HTTP 状态码,code: 0才是成功;二是报错时把request_id一起抛出来,联系平台排查问题时这个字段是唯一凭据。

翻页检索

defsearch_all(keyword:str,province:str=None,max_pages:int=5):items=[]forpageinrange(1,max_pages+1):body={"keyword":keyword,"page":page,"per_page":20}ifprovince:body["province"]=province env=call("factory_search",body)data=env["data"]items.extend(data["items"])print(f"第{page}页,累计{len(items)}/{data['total']},"f"本次扣{env['credits_charged']},余额{env['credits_balance']}")ifpage*data["per_page"]>=data["total"]:breakreturnitems factories=search_all("注塑模具",province="浙江省")

注意关键词和地区都用简体中文全称("浙江省"带后缀),底层索引是中文的,英文关键词召回会差很多。每个响应都带credits_chargedcredits_balance,把它打出来,脚本跑到哪、花了多少一目了然——按量计费,单次以角计价。

拉档案并落地 CSV

defenrich_and_dump(factories:list,out_path:str,top_n:int=20):rows=[]forfinfactories[:top_n]:env=call("factory_detail",{"company_id":f["id"]})detail=env["data"]rows.append({"id":f["id"],"name":f["name"],"region":f.get("region",""),"industry":f.get("industry",""),"product":f.get("product",""),})time.sleep(0.3)# 常规能力限流 300 次/分钟,留点余量withopen(out_path,"w",newline="",encoding="utf-8-sig")asfp:writer=csv.DictWriter(fp,fieldnames=rows[0].keys())writer.writeheader()writer.writerows(rows)enrich_and_dump(factories,"factories.csv")

两个细节:encoding="utf-8-sig"是为了让 Excel 直接双击打开不乱码;time.sleep(0.3)是对常规限流(每分钟 300 次)的保守处理,批量任务里比事后处理42900更省心。真收到42900时按 1 秒、2 秒、4 秒指数退避重试即可,超限的请求不扣费。

别踩的坑

  • 未知字段会被拒绝。入参是严格校验,多传一个拼错的字段直接返回40000,改参数再发,别原样重试。
  • 长任务另设超时。如果要用factory_deepdive(AI 深挖单厂)或factory_agent_search(自然语言检索),单次执行 30 到 90 秒,timeout要给到 120 秒以上,并且这两个能力共享每分钟 6 次的慢速限流,只能串行。
  • 联系电话放漏斗末端factory_contact单价最高(同一家重复解锁免费),先用检索和档案把名单筛小,再对入围的调用。

完整字段说明在官方文档 https://www.tianxiagongchang.com/open/docs,OpenAPI 3.1 规范可以在GET https://open.tianxiagongchang.com/open/v1/meta/openapi.json匿名获取,交给代码生成器直接出客户端也行。上面这一百来行已经是一个能跑的最小管道,改改关键词就能用在你自己的选品或行业调研脚本里。

http://www.jsqmd.com/news/1317515/

相关文章:

  • 极端环境密封新范式:Conax贯穿件如何以“软密封”技术重塑科研与工业边界
  • XIAO ESP32-S3开发板快速上手:从硬件解析到实战编程
  • Atom 比 RSS 更出色:关键差异解析与应用困境
  • 金电镀凸块技术:微电子封装的关键工艺解析
  • 短剧推荐系统架构与智能算法实践
  • NX CAM二次开发:UF刀路重播技术详解与应用
  • 2026 年现阶段宣化有实力的花池围边锈钢板实力厂家深度剖析,别再用大理石做花池围边了,这玩意儿锈钢板的用法你真的摸透了吗?-万工耐候景观 - 领域鉴赏官
  • 【C++】重定向是什么
  • 2026精选:性价比高的发电机组本地回收方案——河南电力行业绿色转型新选择 - 装修教育财税推荐2026
  • 2026 年新消息:睢宁专业的疏通下水道施工队综合实力解析,上次花200请师傅通的,今天才发现根本没必要花那钱!-嘉宝管道疏通 - 企业信息推荐【官方】
  • 国际象棋思维训练:从核心规则到AI辅助的现代学习路径
  • RapidRAW AI图像编辑预设系统完全指南:快速创建与管理你的专属风格
  • ESP32-C6驱动AMOLED触摸屏:低功耗物联网图形界面开发实战
  • 二手Vision Pro空间视频实测与三星S26 Ultra屏幕技术解析
  • 物联网数据记录器实战:从传感器到云端的可靠数据采集与传输
  • AI智能体在模拟金融市场中的博弈行为与系统构建解析
  • MongoDB 8.0——事务
  • ATAT 全功能说明
  • Linux中查看PDF
  • 2026赤峰劳动争议律师推荐:从工伤认定到仲裁执行的5位实务派 - 本地品牌推荐
  • Flask+Vue全栈健康监控系统开发实践
  • 2026精选:不锈钢排水沟制造厂实力剖析与差异化适配指南——助力佛山市亿齐旺金属有限公司选型 - 装修教育财税推荐2026
  • [Android ] 游戏翻译大师Game Screen Translate v2.1.1 -游戏翻译成中文
  • iOS 使用 Flutter 开发海外工具类应用:账号被封与 APP 下架问题深度解析与解决方案
  • Flutter项目创建卡顿?深度解析网络、Gradle与Android SDK配置
  • 抖音无水印视频下载终极指南:从零开始掌握高效批量下载技巧
  • 初中数学提分实战:几何辅助线模板与二次函数技巧全解析
  • 如何快速解决游戏模组显示问题:BG3ModManager完整排查指南
  • 数字时代的孤独悖论:连接与情感空洞
  • 2026赤峰婚姻家庭律师推荐:从财产追回抚养权到共同债务的5位实务派 - 本地品牌推荐