孔夫子舊書網 API 實戰:古籍與二手書數據獲取及接口調用方案

孔夫子舊書網作為國內知名的古籍、二手書交易平臺,其商品數據對于圖書收藏、學術研究及二手書電商系統具有重要價值。本文將詳細介紹孔夫子平臺接口的調用方法,涵蓋認證機制、搜索參數配置、數據解析及反爬策略,并提供可直接使用的 Python 代碼實現,幫助開發者合規獲取古籍和二手書數據。

一、孔夫子平臺接口基礎信息

孔夫子舊書網提供的開放接口主要包括圖書搜索、商品詳情、店鋪信息等功能,其中/api/v1/books/search是獲取圖書列表的核心接口,特別適用于古籍、珍本、二手書的檢索。

接口特點

  • 采用 API Key 認證機制,部分接口需要商業合作授權
  • 支持按書名、作者、出版社、年代、品相等級等多維度篩選
  • 包含古籍特有的版本信息、刻印年代、裝幀形式等字段
  • 提供賣家信譽、交易記錄等二手書交易關鍵數據

接口端點https://api.kongfz.com/api/v1/books/search

二、認證機制與核心參數

1. 認證方式

孔夫子接口采用簡單直接的 API Key 認證:

  1. 在孔夫子開發者平臺注冊并申請應用,獲取 API Key
  2. 在所有請求的 Header 中攜帶X-API-Key參數
  3. 商業用戶可申請更高權限的 Secret Key 進行簽名認證

2. 核心搜索參數

  • keyword:搜索關鍵字(書名、作者、ISBN 等,必填)
  • category:圖書分類(古籍 / 二手書 / 期刊等,可選)
  • year_min/year_max:出版年代范圍(可選)
  • condition:品相等級(1-10 級,10 為全新,可選)
  • price_min/price_max:價格區間(可選)
  • publisher:出版社(可選)
  • sort:排序方式(price_asc/price_desc/time_desc/credit_desc)
  • page:頁碼(默認 1)
  • limit:每頁條數(1-20,默認 10)
  • rare:是否僅顯示珍本(true/false,可選)

3. 響應數據結構

  • total:總結果數
  • page/limit:分頁信息
  • books:圖書列表數組
  • filters:可用篩選條件

三、完整代碼實現

以下是 Python 實現的孔夫子舊書網圖書搜索功能,包含 API 調用、數據解析和反爬策略:

import requests
import time
import random
from typing import Dict, List, Optional, Any
from user_agent import generate_user_agent
import logging# 配置日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger('kongfz_api')class KongfzBookAPI:def __init__(self, api_key: str, use_proxy: bool = False, proxy_pool: List[str] = None):"""初始化孔夫子舊書網API客戶端:param api_key: 平臺申請的API Key:param use_proxy: 是否使用代理:param proxy_pool: 代理IP池列表"""self.api_key = api_keyself.base_url = "https://api.kongfz.com"self.search_endpoint = "/api/v1/books/search"self.detail_endpoint = "/api/v1/books/detail"self.max_limit = 20  # 最大每頁條數self.use_proxy = use_proxyself.proxy_pool = proxy_pool or []self.session = self._init_session()def _init_session(self) -> requests.Session:"""初始化請求會話,配置持久連接"""session = requests.Session()session.headers.update({"Accept": "application/json","Content-Type": "application/json","X-API-Key": self.api_key,"Connection": "keep-alive"})return sessiondef _get_random_headers(self) -> Dict[str, str]:"""生成隨機請求頭,降低反爬風險"""return {"User-Agent": generate_user_agent(),"Accept-Language": random.choice(["zh-CN,zh;q=0.9", "zh-TW,zh;q=0.9,en;q=0.8"]),"Referer": "https://www.kongfz.com/"}def _get_proxy(self) -> Optional[Dict[str, str]]:"""從代理池獲取隨機代理"""if self.use_proxy and self.proxy_pool:proxy = random.choice(self.proxy_pool)return {"http": proxy, "https": proxy}return Nonedef search_books(self,keyword: str,category: Optional[str] = None,year_min: Optional[int] = None,year_max: Optional[int] = None,condition: Optional[int] = None,price_min: Optional[float] = None,price_max: Optional[float] = None,publisher: Optional[str] = None,sort: str = "time_desc",page: int = 1,limit: int = 10) -> Dict[str, Any]:"""搜索孔夫子舊書網圖書:param keyword: 搜索關鍵字:param category: 圖書分類:param year_min: 最小出版年份:param year_max: 最大出版年份:param condition: 品相等級(1-10):param price_min: 最低價格:param price_max: 最高價格:param publisher: 出版社:param sort: 排序方式:param page: 頁碼:param limit: 每頁條數:return: 搜索結果"""# 限制每頁最大條數limit = min(limit, self.max_limit)# 構建查詢參數params: Dict[str, Any] = {"keyword": keyword,"sort": sort,"page": page,"limit": limit}# 添加可選參數if category:params["category"] = categoryif year_min is not None:params["year_min"] = year_minif year_max is not None:params["year_max"] = year_maxif condition is not None:params["condition"] = conditionif price_min is not None:params["price_min"] = price_minif price_max is not None:params["price_max"] = price_maxif publisher:params["publisher"] = publisher# 準備請求配置headers = self._get_random_headers()proxy = self._get_proxy()try:# 隨機延遲,模擬人類行為time.sleep(random.uniform(0.8, 1.5))# 發送請求response = self.session.get(f"{self.base_url}{self.search_endpoint}",params=params,headers=headers,proxies=proxy,timeout=15)response.raise_for_status()# 解析響應result = response.json()# 處理API錯誤if result.get("code") != 0:logger.error(f"API錯誤: {result.get('msg')}")return {"success": False,"error_code": result.get("code"),"error_msg": result.get("msg")}# 解析搜索結果return self._parse_search_result(result.get("data", {}))except requests.exceptions.RequestException as e:logger.error(f"請求異常: {str(e)}")return {"success": False,"error_msg": f"請求異常: {str(e)}"}except Exception as e:logger.error(f"處理響應失敗: {str(e)}")return {"success": False,"error_msg": f"處理響應失敗: {str(e)}"}def _parse_search_result(self, raw_data: Dict[str, Any]) -> Dict[str, Any]:"""解析搜索結果為結構化數據"""# 分頁信息pagination = {"total": raw_data.get("total", 0),"page": raw_data.get("page", 1),"limit": raw_data.get("limit", 10),"pages": (raw_data.get("total", 0) + raw_data.get("limit", 10) - 1) // raw_data.get("limit", 10)}# 解析圖書列表books = []for item in raw_data.get("books", []):# 處理古籍特有的版本信息ancient_info = Noneif item.get("is_ancient"):ancient_info = {"edition": item.get("ancient_edition"),  # 版本"engraving_year": item.get("engraving_year"),  # 刻印年代"binding": item.get("binding"),  # 裝幀"seal_info": item.get("seal_info")  # 鈐印信息}books.append({"book_id": item.get("id"),"title": item.get("title"),"author": item.get("author"),"publisher": item.get("publisher"),"publish_year": item.get("publish_year"),"category": item.get("category"),"is_ancient": item.get("is_ancient", False),  # 是否古籍"ancient_info": ancient_info,"condition": {"level": item.get("condition_level"),  # 品相等級"description": item.get("condition_desc")  # 品相描述},"price": {"current": item.get("price"),"original": item.get("original_price"),"currency": "CNY"},"seller": {"id": item.get("seller_id"),"name": item.get("seller_name"),"credit": item.get("seller_credit"),  # 信譽等級"score": item.get("seller_score")  # 好評率},"images": {"main": item.get("main_image"),"thumbnail": item.get("thumbnail")},"url": item.get("url"),"tags": item.get("tags", [])})# 解析可用篩選條件filters = self._parse_filters(raw_data.get("filters", {}))return {"success": True,"pagination": pagination,"books": books,"filters": filters}def _parse_filters(self, raw_filters: Dict[str, Any]) -> Dict[str, Any]:"""解析篩選條件"""filters = {}# 分類篩選if "categories" in raw_filters:filters["categories"] = [{"id": item.get("id"), "name": item.get("name"), "count": item.get("count")}for item in raw_filters["categories"]]# 品相篩選if "conditions" in raw_filters:filters["conditions"] = [{"level": item.get("level"), "name": item.get("name"), "count": item.get("count")}for item in raw_filters["conditions"]]# 年代篩選if "years" in raw_filters:filters["years"] = raw_filters["years"]return filtersdef batch_search(self,keyword: str,max_pages: int = 3,**kwargs) -> Dict[str, Any]:"""批量獲取多頁搜索結果:param keyword: 搜索關鍵字:param max_pages: 最大獲取頁數:param**kwargs: 其他搜索參數:return: 合并的搜索結果"""all_books = []current_page = 1total_pages = 1while current_page <= max_pages and current_page <= total_pages:logger.info(f"搜索第 {current_page} 頁,關鍵字: {keyword}")# 搜索當前頁result = self.search_books(keyword=keyword,page=current_page,**kwargs)if not result.get("success"):return result# 收集圖書數據all_books.extend(result.get("books", []))# 更新分頁信息pagination = result.get("pagination", {})total_pages = pagination.get("pages", 1)# 準備下一頁current_page += 1# 增加頁數間隔,降低反爬風險if current_page <= max_pages:time.sleep(random.uniform(1.5, 2.5))return {"success": True,"total_books": len(all_books),"books": all_books,"summary": {"total_available": pagination.get("total", 0),"fetched_pages": current_page - 1}}# 使用示例
if __name__ == "__main__":# 替換為你的API KeyAPI_KEY = "your_api_key"# 代理配置(可選)PROXY_POOL = [# "http://ip1:port",# "http://ip2:port"]# 初始化API客戶端kongfz_api = KongfzBookAPI(api_key=API_KEY,use_proxy=False,  # 根據需要開啟proxy_pool=PROXY_POOL)# 示例1:搜索古籍ancient_result = kongfz_api.search_books(keyword="論語",category="ancient",  # 古籍分類year_min=1949,year_max=2023,condition=8,  # 8級及以上品相sort="price_asc",page=1,limit=10)if ancient_result["success"]:print(f"古籍搜索: 找到 {ancient_result['pagination']['total']} 本相關圖書")if ancient_result["books"]:book = ancient_result["books"][0]print(f"書名: {book['title']}")print(f"作者: {book['author']}")print(f"價格: {book['price']['current']}元")print(f"品相: {book['condition']['level']}級 - {book['condition']['description']}")if book["is_ancient"]:print(f"版本: {book['ancient_info']['edition']}")# 示例2:批量搜索二手書# batch_result = kongfz_api.batch_search(#     keyword="魯迅全集",#     category="secondhand",  # 二手書分類#     price_min=50,#     price_max=500,#     max_pages=2# )# # if batch_result["success"]:#     print(f"\n批量搜索: 共獲取 {batch_result['total_books']} 本圖書")

四、代碼核心功能解析

1. 反爬策略實現

  • 隨機生成 User-Agent 和請求頭,模擬不同瀏覽器行為
  • 加入隨機請求延遲,避免固定訪問頻率被識別
  • 支持代理 IP 池配置,分散請求來源
  • 使用持久化 Session,模擬正常用戶瀏覽行為

2. 古籍數據特色處理

  • 專門解析古籍特有的版本、刻印年代、裝幀等信息
  • 區分古籍與普通二手書的數據結構
  • 提取鈐印信息等古籍收藏關鍵維度

3. 搜索功能設計

  • 支持完整的圖書篩選參數,滿足古籍和二手書的搜索需求
  • 提供單頁搜索和多頁批量搜索兩種模式
  • 批量搜索時動態調整間隔時間,平衡效率與安全性

4. 數據結構化

  • 按圖書類型組織數據,區分普通二手書和古籍
  • 提取賣家信譽、品相描述等二手交易關鍵信息
  • 解析可用篩選條件,便于前端實現高級篩選功能

五、實戰注意事項

1. 接口權限與申請

  • 孔夫子 API 分為免費版和商業版,免費版有調用頻率限制(通常 QPS≤2)
  • 古籍珍本等敏感數據需要申請商業授權
  • 個人開發者需提供身份證明,企業開發者需提供營業執照

2. 反爬與合規

  • 免費版接口請勿進行高頻次調用,建議單 IP 日調用不超過 1000 次
  • 數據使用需遵守孔夫子平臺的版權協議,不得用于商業競品
  • 尊重古籍數據的知識產權,引用時需注明來源

3. 搜索策略優化

  • 古籍搜索建議結合年代和版本篩選,提高精準度
  • 批量獲取數據時,合理設置max_pages參數,避免觸發限制
  • 對稀缺古籍建立緩存機制,緩存周期建議 7-30 天

4. 數據處理建議

  • 書名和作者可能存在異體字、通假字,需進行文字規范化處理
  • 品相描述為文本信息,可通過 NLP 技術提取關鍵評價
  • 出版年代可能存在模糊表述(如 "民國年間"),需特殊處理

六、功能擴展方向

  1. 開發古籍版本比對工具,基于多本同書數據進行版本差異分析
  2. 構建賣家信譽評估系統,結合歷史交易和評價數據
  3. 實現圖書價格趨勢分析,追蹤古籍市場價格波動
  4. 開發古籍修復需求識別功能,基于品相描述自動判斷修復需求

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93960.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93960.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93960.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件包含的學習筆記

面試問題 1&#xff0c;任意文件讀取&#xff0c;到底讀什么文件&#xff0c;有什么危害 權限是www 只能讀第一個&#xff0c;讀這個沒用&#xff0c;密碼在/etc/shadow中 其它沒有權限 my.cnf mysql密碼看不了 但是可以看見日志文件的目錄 sql注入時&#xff0c;你有注…

Linux 軟件包安裝和管理的相關操作及使用總結(未完成)

一、基礎知識1、軟件包分類源碼包&#xff08;Source Package&#xff09;&#xff1a;包含軟件的源代碼文件、編譯指令和配置文件。需要用戶自行編譯安裝&#xff0c;過程相對復雜&#xff0c;但靈活性高&#xff0c;可以定制安裝選項。文件格式通常為.tar.gz、.tar.bz2等壓縮…

【開發指南】飛凌i.MX9352核心板開發過程中的常見問題及排查思路

飛凌嵌入式作為NXP金牌合作伙伴&#xff0c;已基于i.MX系列應用處理器推出了多款嵌入式主控產品&#xff0c;除了最新發布的i.MX95xx系列核心板外&#xff0c;同為i.MX9系的i.MX93xx系列核心板也已上市多年并獲得了眾多客戶的認可和選擇。在長期的技術支持服務過程中&#xff0…

Windows應急響應一般思路(二)

進程排查 進程(Process)是計算機中的程序關于某數據集合上的一次運行活動&#xff0c;是系統進行資源分配和調度的基本單位&#xff0c;是操作系統結構的基礎 無論是在Windows系統還是Linux系統中&#xff0c;主機在感染惡意程序后&#xff0c;惡意程序都會啟動相應的進程&am…

FFmpeg03:多媒體文件處理基礎

日志系統 #include <libavutil/log.h>av_log_set_level(AV_LOG_DEBUG)av_log(NULL, AV_LOG_INFO, “…%s\n”, op) 常用日志級別 AV_LOG_ERROR AV_LOG_WARNING AV_LOG_INFO Demo log.cpp #include <iostream> extern "C" { #include <libavutil/log.h…

【每天一個知識點】AIOps 與自動化管理

一、AIOps 的內涵AIOps&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff1a;指將人工智能、大數據分析和機器學習技術應用于 IT 運維管理中。主要目標是&#xff1a;利用智能算法對云平臺、網絡、應用和日志等海量運維數據進行實時分析&#xff0c;…

ios使用saveVideoToPhotosAlbum 保存視頻失敗提示 invalid video

ios使用saveVideoToPhotosAlbum 保存視頻失敗提示 invalid video 解決辦法 iOS 上對保存到相冊的視頻存在某種格式和分辨率上的限制&#xff0c;建議先自查看下視頻生成的參數&#xff0c;可以先試試蘋果自帶瀏覽器 safari 上能否播放該視頻。 如果不能播放&#xff0c;證明 io…

Vue基礎(③父子組件)

房子&#xff08;父組件&#xff09;包含窗戶和門&#xff08;子組件&#xff09; 窗戶和門&#xff08;子組件&#xff09;是房子&#xff08;父組件&#xff09;的一部分父組件<!-- 父組件&#xff1a;比如叫 Home.vue --> <template><div><h1>這是父…

AI領域的語義空間是什么?

寫在前面&#xff1a;本文將從簡單的二維空間來逐漸展開問題&#xff0c;帶您理解語義空間。距離和體型&#xff1a;這里嘗試用距離和體型這兩個尺度來理解語義空間&#xff0c;先說的是低維情況&#xff0c;后面在嘗試理解高維的情況。比如&#xff0c;在二維空間的x,y坐標系&…

排序---插入排序

基本思想對于插入排序而言&#xff0c;它的基本思想就是往已經排好序的序列里邊插入數據。思想類似于玩撲克牌。接下來的排序都是基于下邊的這個數組。int a[ ] { 5 , 3 , 9 , 6 , 2 , 4 , 7 , 1 , 8 };直接插入排序我們想要將這個數組排成升序&#xff0c;在最一開始&#xf…

Java性能優化實戰(四):IO與網絡優化的4個關鍵方向

IO與網絡操作是Java應用性能的常見瓶頸&#xff0c;尤其在高并發場景下&#xff0c;低效的IO處理會導致響應緩慢、資源浪費等問題。本文將聚焦IO與網絡優化的四個核心方向&#xff0c;通過真實案例、代碼對比和性能數據&#xff0c;詳解如何提升IO效率、減少網絡傳輸開銷&#…

對齊Wireshark和USRP捕獲信號的波形

一、USRP信號 USRP捕獲信號的波形如下&#xff1a; 放大后&#xff1a; 100ms 10ms 1ms 100us 10us 1us 二、波形分析 2.1 時間分辨率 采樣率61.44MHz, 對應時間分辨率為1/61.44us0.01627us16.27ns。 這時間分辨率夠用了&#xff0c;數據包長度為1到20us&#xff1a; 2.2 W…

2025年加密軟件技術深度分析:從原理到企業級應用實踐

一、加密技術基礎與分類加密技術作為信息安全的核心基石&#xff0c;其基本原理是通過特定算法將明文數據轉換為不可讀的密文&#xff0c;只有持有正確密鑰的授權用戶才能解密還原。2025年主流的加密技術可分為三大類&#xff1a;?對稱加密?&#xff1a;使用相同密鑰進行加密…

打工人日報20250822

打工人日報20250822 對自己負責&#xff0c;可以是換一個角度看待自己不喜歡的工作&#xff0c;轉換一個角度&#xff0c;從中找到自己感興趣的點 真的非常不想計算聲場的數據 啊啊啊啊啊 技術 STM32燒錄問題 STM32 代碼燒錄失敗&#xff1a;Error: Flash Download failed …

消費盲返模式:重構快消行業營銷生態的破局之道與風險防控指南

一、模式爆發&#xff1a;快消行業的新增長引擎在流量成本攀升、用戶留存困難的商業環境下&#xff0c;消費盲返模式正成為零售領域的一匹黑馬。其核心邏輯在于通過"消費即投資"的機制設計&#xff0c;將每筆交易轉化為后續100筆訂單的激勵源&#xff0c;形成獨特的&…

STM32-FreeRTOS快速入門指南(上)

第一章 FreeRTOS系統配置 1. FreeRTOSConfig.h文件 針對 FreeRTOSConfig.h 文件&#xff0c;在 FreeRTOS 官方的在線文檔中有詳細的說明&#xff0c;網址為&#xff1a; https://www.freertos.org/a00110.html FreeRTOS 使用 FreeRTOSConfig.h 文件進行配置和裁剪。 FreeRTOSCo…

南溪智融雙碳示范基地建筑設備管理系統 + 智能照明系統調試完成:筑牢 “綠色智能” 運營基石

南溪智融雙碳示范基地作為聚焦 “雙碳” 目標的標桿項目&#xff0c;其建筑設備管理系統與智能照明系統的調試完成&#xff0c;標志著基地在 “設備高效運維、能源精準管控、低碳場景落地” 方面邁出關鍵一步。兩大系統深度契合示范基地 “以技術賦能雙碳” 的核心定位&#xf…

c++的可擴展性方法

在C編碼中&#xff0c;"方便擴展"通常指的是代碼設計具有良好的**可維護性、可重用性和靈活性**&#xff0c;能夠在不修改原有代碼或僅少量修改的情況下&#xff0c;輕松添加新功能、支持新類型或適應新需求。以下是一些典型的、體現“方便擴展”思想的C編程案例&…

加速車輛開發 風丘道路載荷數據采集 (RLDA) 測試方案

一、背景 整車廠在汽車上市前&#xff0c;了解產品所能承受的載荷是非常重要的&#xff0c;因此需進行道路載荷數據采集&#xff08;RLDA&#xff09;測試。通過獲得車輛在實際試驗場或公路道路中行駛的載荷信息來為整車臺架道路模擬試驗提供目標信號輸入&#xff0c;以及為用于…

大模型0基礎開發入門與實踐:第4章 “腦細胞”的模擬:神經網絡與深度學習入門

第4章 “腦細胞”的模擬&#xff1a;神經網絡與深度學習入門 1. 引言 在上一章&#xff0c;我們像一位偵探&#xff0c;學會了使用決策樹這樣的工具&#xff0c;從清晰的線索&#xff08;花瓣、花萼的尺寸&#xff09;中推理出確定的結論&#xff08;鳶尾花的種類&#xff09;。…