做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)
四、翻页逻辑:文本定位 + disabled 判断
next_btn = dp.ele('text=下一页', timeout=1)if not next_btn or 'disabled' in (next_btn.attr('class') or ''): breaknext_btn.click()
五、我故意不展开的三处(付费级)
作者块多行的容错边界:当作者名本身含 / 或出版社名为空时的 fallback 规则图片 URL 补全逻辑:部分 data-original 是相对路径,需拼接 https:
六、这套数据能干什么?
七、结尾软广
爬虫不难,难的是在当当这种“古典DOM”里,用最少的浏览器通信拿到最干净的数据。这篇是《Python 商业数据源实战》的“电商图书篇”。完整源码(含作者块容错、图片URL补全、断点续爬)在圈子里,后台回 当当网 看入口。