孔夫子旧书网批量抓取工具:自动登录+商品信息提取+Excel导出
本文还有配套的精品资源,点击获取
简介:直接运行就能从孔夫子旧书网批量获取二手书数据,支持自动登录账号、逐条抓取商品页核心字段(书名、作者、出版社、售价、品相、上架时间等),失败链接自动记录到url.txt,全部结果汇总进结果数据C.xlsx。工具基于Python + ChromeDriver实现浏览器自动化,无需修改代码,只要把待采集的商品URL粘贴到info_url.txt里,双击运行spider.py即可启动。配套login.py处理登录逻辑,执行手顺.txt提供分步操作指引,requirements.txt列明所需依赖库,整个流程适配当前网站结构,稳定应对验证码和页面跳转。适合做二手书价格对比、市场供需分析、个人藏书数字化归档或小规模书商选品参考。
1. 项目概述:为什么二手书数据采集值得认真对待
你有没有试过在孔夫子旧书网上查一本绝版书的价格?输入书名,翻三页,发现同一种书有27个卖家,售价从38元到298元不等,品相标注五花八门——“九五品”“近全品”“内页干净”“略有黄斑”,上架时间跨度从2021年到昨天。这时候你真正需要的不是第28个报价,而是一张横向对比表:同一ISBN下所有在售商品的核心字段、价格分布、品相分级、上架节奏。但手动复制粘贴27次?光校对出版社名称(“人民文学出版社” vs “人文社” vs “人民文学”)就能耗掉半小时。这正是我开发这套工具的起点——它不是为写论文凑数据,而是为真实场景里“想快速看清市场”的人服务的。
核心关键词“孔夫子爬虫”“旧书数据采集”“Python自动化”,背后对应的是三个刚性需求:第一,网站有登录墙和动态渲染,传统HTTP请求直接失效;第二,商品页结构嵌套深(价格藏在JS计算后的span里,品相描述混在div文本流中),正则硬扒极易断裂;第三,用户要的是结果,不是代码,所以“无需修改即可运行”不是宣传话术,而是设计底线。整套流程围绕“最小干预原则”构建:你只管往info_url.txt里粘URL,双击spider.py,剩下的——登录、重试、异常隔离、字段清洗、Excel落盘——全部由程序闭环完成。它适配当前网站结构,不是靠猜selector,而是基于对页面DOM生命周期的理解:比如登录后跳转必然触发window.location变更,商品页加载完成必须等待#price_box元素可见且非空,这些细节决定了工具能否在验证码更新、促销弹窗出现、服务器响应延迟时依然稳住不崩。适合谁用?二手书摊主选品前扫一眼区域竞品定价,高校图书馆老师做古籍复本率统计,个人藏书者给自家书架建数字档案,甚至考研党比对历年真题册的二手流通溢价——只要你的需求是“批量看清楚”,它就不是玩具,而是趁手的工具。
2. 整体架构与设计逻辑:为什么选择浏览器自动化而非纯HTTP
2.1 方案选型的底层权衡
很多人看到“爬虫”第一反应是requests+BeautifulSoup,但孔夫子旧书网早已不是静态HTML时代的产品。我试过纯HTTP方案:用requests模拟登录,抓取首页返回的HTML,结果发现关键字段如实时售价、库存状态、卖家信用等级全部由AJAX异步加载,且请求头里藏着动态生成的X-Requested-With和加密签名。更麻烦的是登录环节——2023年Q4起,网站将验证码从图片升级为行为验证(拖动拼图+鼠标轨迹分析),传统OCR或打码平台成功率不足60%,而人工干预又违背“开箱即用”初衷。这时候浏览器自动化就成了唯一可行路径,但并非盲目选Selenium。我对比了三种主流方案:
- Selenium + ChromeDriver:成熟稳定,支持完整浏览器上下文(Cookie、LocalStorage、Canvas指纹),能自然绕过大部分前端反爬;缺点是资源占用高,启动慢。
- Playwright:新锐方案,多浏览器支持好,API更现代;但孔夫子部分页面依赖Chrome特有API(如document.fonts.load),在Firefox下偶发渲染异常。
- Pyppeteer(无头Chrome):轻量,启动快;可一旦遇到需要人工介入的验证码(比如滑块失败后弹出文字验证),无头模式无法交互,整个流程就卡死。
最终选定Selenium+ChromeDriver,不是因为它最先进,而是它最“可靠”。这里的可靠指两层:一是技术层面,ChromeDriver对孔夫子页面的兼容性经过三年迭代验证,login.py里封装的登录逻辑已覆盖扫码登录、账号密码登录、短信验证三种入口;二是工程层面,当某天网站突然增加新的防爬JS(比如检测window.navigator.webdriver属性),我们只需在spider.py开头加一行options.add_experimental_option("excludeSwitches", ["enable-automation"]),而不用重构整个网络栈。这种可维护性,对一个面向非程序员用户的工具至关重要。
2.2 模块化分工:每个文件解决一个明确问题
整个工具包不是单个脚本的堆砌,而是按职责切分的精密齿轮组:
login.py:专注“身份建立”。它不处理任何商品数据,只做三件事:启动浏览器、注入登录凭证(从环境变量读取,避免明文写死)、等待登录成功标识(如右上角出现“我的孔网”链接)。这里有个关键设计:登录后不立即跳转,而是主动执行
driver.get("https://www.kongfz.com/")强制刷新首页,确保Session完全激活。很多失败案例源于跳转太快,Cookie未同步到新页面上下文。spider.py:作为总控中枢,它只做调度,不做解析。核心逻辑是循环读取info_url.txt的每一行URL,调用统一的
fetch_item_info(driver, url)函数,并根据返回值决定写入结果表还是异常日志。这种解耦让后续扩展变得简单——比如你想加价格走势图,只需在fetch_item_info里多提一个“历史价格”字段,spider.py完全不用改。info_url.txt与异常数据url.txt:采用纯文本而非数据库,是刻意为之的降维设计。普通用户打开记事本就能编辑URL,不需要装MySQL或学SQL;异常记录也直接追加到txt,方便排查时用Ctrl+F搜索特定失败原因(比如“timeout”或“404”)。我测试过,当URL列表超过500条时,文本文件的IO性能反而比SQLite更稳定——毕竟我们不是在做高并发服务,而是在解决“把100本书的信息抄下来”这个具体问题。
结果数据C.xlsx:命名带字母“C”是有意为之。早期版本叫“结果.xlsx”,但用户反馈常因误操作覆盖原文件导致数据丢失。现在每次运行都会检查文件是否存在,若存在则自动重命名为“结果数据B.xlsx”,再新建“结果数据C.xlsx”。这种小设计背后是对用户操作习惯的尊重——他们不是工程师,不会每天备份。
2.3 稳定性设计:如何应对网站结构的“温柔变化”
孔夫子旧书网的前端团队很克制,不会频繁大改,但小修小补不断。比如2024年3月,商品页的“品相”字段从<div class="item-condition">挪到了<span style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />
简介:直接运行就能从孔夫子旧书网批量获取二手书数据,支持自动登录账号、逐条抓取商品页核心字段(书名、作者、出版社、售价、品相、上架时间等),失败链接自动记录到url.txt,全部结果汇总进结果数据C.xlsx。工具基于Python + ChromeDriver实现浏览器自动化,无需修改代码,只要把待采集的商品URL粘贴到info_url.txt里,双击运行spider.py即可启动。配套login.py处理登录逻辑,执行手顺.txt提供分步操作指引,requirements.txt列明所需依赖库,整个流程适配当前网站结构,稳定应对验证码和页面跳转。适合做二手书价格对比、市场供需分析、个人藏书数字化归档或小规模书商选品参考。
本文还有配套的精品资源,点击获取
