当前位置:首页>python>Python爬取当当网图书数据:DrissionPage监听搜索页,正则解析outerHTML拿全12项指标

Python爬取当当网图书数据:DrissionPage监听搜索页,正则解析outerHTML拿全12项指标

  • 2026-09-19 19:02:55
Python爬取当当网图书数据:DrissionPage监听搜索页,正则解析outerHTML拿全12项指标
做Python爬虫和图书电商数据分析的朋友,对当当网一定不陌生。作为国内老牌图书电商,当当的商品列表页包含了大量结构化、可直接用于商业分析的图书数据:书名、作者、出版社、出版时间、当前售价、原价、折扣率、评论数、店铺名。
这些数据,对图书选品、价格监控、出版趋势分析、竞品对标都有极高价值。但当你真正打开当当的搜索结果页,会发现它的 DOM 结构非常“古典”——图片懒加载用 data-original,作者/出版社/出版时间挤在一个  里的多个  中,评论数藏在嵌套 span 里。
如果逐字段用 XPath/CSS 去取,不仅代码冗长,而且页面稍有改版就全盘崩溃。今天这篇,我基于DrissionPage一次性拿到每个  的 outerHTML,然后全部交给正则本地解析,把 12 个字段稳定落盘。核心思路全讲,但作者块多行的容错边界、翻页组件 disabled 判断的完整封装,我只给逻辑,不贴完整代码——毕竟能稳定跑一个月的脚本,和跑一次就炸的 Demo,完全是两个东西。

Python爬取当当网图书数据 · 核心逻辑拆解

技术栈:DrissionPage + li.outerHTML + 正则本地解析 + 翻页组件定位


一、为什么当当网图书数据值得爬?

字段

分析价值

书名 / 商品ID

唯一标识 + 检索

作者 / 出版社 / 出版时间

图书元数据,用于分类与趋势

当前售价 / 原价 / 折扣率

价格监控、促销分析

评论数

用户口碑基准

店铺名

自营 vs 第三方对比

主图

内容运营 / 竞品截图

👉 一份 CSV,直接能做出“某关键词下图书价格分布热力图”或“出版社出书频次排行”。

二、核心优化:一次取 HTML,本地正则解析

lis = dp.eles('x://ul[@id="component_59"]/li', timeout=2)for li in lis:    html = li.html  一次 DOM 通信拿到全部 HTML    # 后续全部用 re.search() 在本地字符串上操作
✅为什么这样做?
每调一次 dp.ele() / dp.eles() 都是一次WebSocket 通信(浏览器 ↔ 驱动)
12 个字段 = 12 次通信 × N 个商品 = 大量延迟
一次拿 outerHTML,后续全在 Python 本地跑,速度提升 5~10 倍
⚠️坑位:
不 strip() 或不过滤空白 → 正则匹配失败
图片懒加载用 data-original 而非 src → 直接取 src 拿到占位图

三、正则解析的关键字段拆解

1. 标题 + 链接 + 商品ID

m_link = re.search(r'href="([^"]*\d+\.html)"', html)m_id = re.search(r'/(\d+)\.html', link)
✅ 从 URL 里反解 item_id,比单独找 data-id 属性更稳定。

2. 当前价 / 原价

m_now = re.search(r'search_now_price">¥?([\d.]+)', html)m_pre = re.search(r'search_pre_price">¥?([\d.]+)', html)
✅ 注意 ¥? 可选符号——有的页面带 ¥,有的不带。

3. 折扣率(衍生指标)

rate = (float(now_price) / float(pre_price)) * 10discount = f'{rate:.1f}折'
✅ 这是你代码里的衍生指标,接口不返回,自己算。

4. 作者 / 出版社 / 出版时间(最复杂的一块)

<pclass="search_book_author">  <a>作者名</a>  <a>/2024-01-01/</a>  <a>出版社名</a></p>
spans = re.findall(r'<a[^>]*>(.*?)</a>', author_block, re.S)
✅ 用 re.findall 一次抓出所有  文本,按位置分配字段。
⚠️坑位:出版时间可能带 / 前后缀,需要 .replace('/', '').strip()。

5. 评论数

m_comment = re.search(r'(\d+)\s*条评论', html)
✅ 用 \s* 兼容换行和空格。

四、翻页逻辑:文本定位 + disabled 判断

next_btn = dp.ele('text=下一页', timeout=1)if not next_btn or 'disabled' in (next_btn.attr('class') or ''):    breaknext_btn.click()
✅优点:
text=下一页 比 CSS 选择器更直观
disabled 判断防止死循环
timeout=1 避免最后一页卡顿

五、我故意不展开的三处(付费级)

作者块多行的容错边界:当作者名本身含 / 或出版社名为空时的 fallback 规则
图片 URL 补全逻辑:部分 data-original 是相对路径,需拼接 https:
断点续爬:基于商品ID去重,中断后从最后一条继续

六、这套数据能干什么?

图书选品:分析某关键词下高评分、低折扣的潜力书
价格监控:跟踪竞品图书的折扣变化频率
出版趋势:统计各出版社年度出书量
评论分析:评论数 vs 评分的口碑模型

七、结尾软广

爬虫不难,难的是在当当这种“古典DOM”里,用最少的浏览器通信拿到最干净的数据。
这篇是《Python 商业数据源实战》的“电商图书篇”。
完整源码(含作者块容错、图片URL补全、断点续爬)在圈子里,后台回 当当网 看入口。

最新文章

随机文章