爬虫阶段一实战练习题二:爬取当当网图书列表
练习二:爬取当当网图书列表
- 目标:http://category.dangdang.com/cp01.01.02.00.00.00.html(计算机/网络类)
- 数据:商品名称、价格、作者、出版社、评论数
- 要求:爬取至少 3 个分类(如计算机、小说、童书),每个分类前 5 页,保存为 JSON 文件。
- 提示 :
- 观察 URL 规律,不同分类对应不同 ID,页数参数
pg=2表示第 2 页。 - 当当网有简单的反爬,需要设置
User-Agent,并适当延时。 - 每个商品在
<li>标签中,class可能为line1或类似,可以用select('.line1')选择。 - 价格通常在一个带有
price类的标签中。 - 作者、出版社在
<p class="search_book_author">中,用<span>分割。 - 评论数在
<a>标签内,可能包含"条评论",需提取数字。
- 观察 URL 规律,不同分类对应不同 ID,页数参数
抓取的当当图书列表数据示例:
html
<li ddt-pit="1" class="line1" id="p102772" sku="102772">
<a title=" 三国演义(上、下,全二册)(团购电话:400-1066666转6)" ddclick="act=normalResult_picture&pos=102772_0_1_p"
class="pic" name="itemlist-picture" dd_name="单品图片" href="//product.dangdang.com/102772.html" target="_blank"><img
src="//img3m2.ddimg.cn/10/23/102772-1_b_1688623719.jpg"
alt=" 三国演义(上、下,全二册)(团购电话:400-1066666转6)">
<p class="cool_label"></p></a>
<p class="name" name="title"><a title=" 三国演义(上、下,全二册)(团购电话:400-1066666转6) 权威版本!收藏经典!"
href="//product.dangdang.com/102772.html"
ddclick="act=normalResult_title&pos=102772_0_1_p" name="itemlist-title"
dd_name="单品标题" target="_blank"> 三国演义(上、下,全二册)(团购电话:400-1066666转6)
权威版本!收藏经典!</a></p>
<p class="detail">推荐购买权威定本 人民文学版四大名著</p>
<p class="price"><span class="search_now_price">¥39.50</span><a class="search_discount"
style="text-decoration:none;">定价:</a><span
class="search_pre_price">¥39.50</span></p>
<div class="lable_label"><span class="new_lable" y=""></span></div>
<p class="search_star_line"><span class="search_star_black"><span style="width: 90%;"></span></span><a
href="//product.dangdang.com/102772.html?point=comment_point" target="_blank" name="itemlist-review"
dd_name="单品评论" class="search_comment_num" ddclick="act=click_review_count&pos=102772_0_1_p">349826条评论</a>
</p><span class="tag_box"></span>
<p class="search_book_author"><span><a
href="//search.dangdang.com/?key2=罗贯中&medium=01&category_path=01.00.00.00.00.00"
name="itemlist-author" dd_name="单品作者" title="罗贯中">罗贯中</a></span><span> /2010-09-01</span><span> /<a
href="//search.dangdang.com/?key=&key3=%C8%CB%C3%F1%CE%C4%D1%A7%B3%F6%B0%E6%C9%E7&medium=01&category_path=01.00.00.00.00.00"
name="P_cbs" dd_name="单品出版社" title="人民文学出版社">人民文学出版社</a></span></p>
<div class="shop_button"><p class="bottom_p"><a class="search_btn_cart " name="Buy" dd_name="加入购物车"
href="javascript:AddToShoppingCart(102772)"
ddclick="act=normalResult_addToCart&pos=102772_0_1_p">加入购物车</a><a
class="search_btn_collect" name="collect" dd_name="加入收藏" id="lcase102772" href="javascript:void(0);"
ddclick="act=normalResult_favor&pos=102772_0_1_p">收藏</a></p></div>
</li>
<li ddt-pit="3" class="line3" id="p29927053" sku="29927053">
<a title=" 【精装刷边版】布鲁克林有棵树 贝蒂·史密斯青少年版女性成长教育自我实现之书温暖治愈外国文学经典作品中小学生课外阅读"
ddclick="act=normalResult_picture&pos=29927053_2_1_p" class="pic" name="itemlist-picture" dd_name="单品图片"
href="//product.dangdang.com/29927053.html" target="_blank"><img
data-original="//img3m3.ddimg.cn/46/10/29927053-1_b_1753759312.jpg"
src="//img3m3.ddimg.cn/46/10/29927053-1_b_1753759312.jpg"
alt=" 【精装刷边版】布鲁克林有棵树 贝蒂·史密斯青少年版女性成长教育自我实现之书温暖治愈外国文学经典作品中小学生课外阅读"
style="display: block;">
<p class="cool_label"></p></a>
<p class="name" name="title"><a
title=" 【精装刷边版】布鲁克林有棵树 贝蒂·史密斯青少年版女性成长教育自我实现之书温暖治愈外国文学经典作品中小学生课外阅读 "
href="//product.dangdang.com/29927053.html" ddclick="act=normalResult_title&pos=29927053_2_1_p"
name="itemlist-title" dd_name="单品标题" target="_blank"> 【精装刷边版】布鲁克林有棵树
贝蒂·史密斯青少年版女性成长教育自我实现之书温暖治愈外国文学经典作品中小学生课外阅读 </a></p>
<p class="detail"></p>
<p class="price"><span class="search_now_price">¥29.00</span><a class="search_discount"
style="text-decoration:none;">定价:</a><span
class="search_pre_price">¥58.00</span><span class="search_discount"> (5折)</span></p>
<div class="lable_label"><span class="new_lable" y=""></span></div>
<p class="search_star_line"><span class="search_star_black"><span style="width: 90%;"></span></span><a
href="//product.dangdang.com/29927053.html?point=comment_point" target="_blank" name="itemlist-review"
dd_name="单品评论" class="search_comment_num" ddclick="act=click_review_count&pos=29927053_2_1_p">9843条评论</a>
</p><span class="tag_box"></span>
<p class="search_book_author"><span><a
href="//search.dangdang.com/?key2=贝蒂·史密斯&medium=01&category_path=01.00.00.00.00.00"
name="itemlist-author" dd_name="单品作者"
title="贝蒂·史密斯">贝蒂·史密斯</a></span><span> /2025-06-01</span><span> /<a
href="//search.dangdang.com/?key=&key3=%D6%D0%B9%FA%CE%C4%C1%AA%B3%F6%B0%E6%C9%E7&medium=01&category_path=01.00.00.00.00.00"
name="P_cbs" dd_name="单品出版社" title="中国文联出版社">中国文联出版社</a></span></p>
<div class="shop_button"><p class="bottom_p"><a class="search_btn_cart " name="Buy" dd_name="加入购物车"
href="javascript:AddToShoppingCart(29927053)"
ddclick="act=normalResult_addToCart&pos=29927053_2_1_p">加入购物车</a><a
class="search_btn_collect" name="collect" dd_name="加入收藏" id="lcase29927053" href="javascript:void(0);"
ddclick="act=normalResult_favor&pos=29927053_2_1_p">收藏</a></p></div>
</li>
<li ddt-pit="2" class="line2" id="p29409127" sku="29409127">
<a title=" 波西和皮普11册超值套装赠同款精美贴纸名字贴(小小聪明豆系列绘本)0-4岁低幼启蒙情绪管理习惯养成绘本,引导宝宝认识接纳"
ddclick="act=normalResult_picture&pos=29409127_1_1_p" class="pic" name="itemlist-picture" dd_name="单品图片"
href="//product.dangdang.com/29409127.html" target="_blank"><img
data-original="//img3m7.ddimg.cn/88/10/29409127-1_b_8.jpg" src="//img3m7.ddimg.cn/88/10/29409127-1_b_8.jpg"
alt=" 波西和皮普11册超值套装赠同款精美贴纸名字贴(小小聪明豆系列绘本)0-4岁低幼启蒙情绪管理习惯养成绘本,引导宝宝认识接纳"
style="display: block;">
<p class="cool_label"></p></a>
<p class="name" name="title"><a
title=" 波西和皮普11册超值套装赠同款精美贴纸名字贴(小小聪明豆系列绘本)0-4岁低幼启蒙情绪管理习惯养成绘本,引导宝宝认识接纳 低幼启蒙绘本,《咕噜牛》作者德国著名插画大师经典作品,被译为十几种语言,幽默的小故事帮助孩子化解成长路上的小烦恼。"
href="//product.dangdang.com/29409127.html" ddclick="act=normalResult_title&pos=29409127_1_1_p"
name="itemlist-title" dd_name="单品标题" target="_blank">
波西和皮普11册超值套装赠同款精美贴纸名字贴(小小聪明豆系列绘本)0-4岁低幼启蒙情绪管理习惯养成绘本,引导宝宝认识接纳
低幼启蒙绘本,《咕噜牛》作者德国著名插画大师经典作品,被译为十几种语言,幽默的小故事帮助孩子化解成长路上的小烦恼。</a>
</p>
<p class="detail">适读年龄:0-3岁 小小聪明豆绘本 波西和皮普系列 是著名图画书大师阿克塞尔
舍夫勒的代表作,细腻活泼的画风、轻松灵动的语言将孩子成长路上的小烦恼、小脾气、小别扭描绘得可爱至极,父母在陪伴孩子阅读故事的时候也会忍俊不禁,也会同孩子一起经历那些成长路上的甜蜜烦恼。</p>
<p class="price"><span class="search_now_price">¥97.90</span><a class="search_discount"
style="text-decoration:none;">定价:</a><span
class="search_pre_price">¥137.00</span><span class="search_discount"> (7.15折)</span></p>
<div class="lable_label"><span class="new_lable" y=""><span class="new_lable1">自营</span><span
class="new_lable2">券</span></span></div>
<p class="search_star_line"><span class="search_star_black"><span style="width: 90%;"></span></span><a
href="//product.dangdang.com/29409127.html?point=comment_point" target="_blank" name="itemlist-review"
dd_name="单品评论" class="search_comment_num" ddclick="act=click_review_count&pos=29409127_1_1_p">799123条评论</a>
</p><span class="tag_box"></span>
<p class="search_book_author"><span>(德)<a
href="//search.dangdang.com/?key2=阿克塞尔·舍夫勒&medium=01&category_path=01.00.00.00.00.00"
name="itemlist-author" dd_name="单品作者" title="(德)阿克塞尔·舍夫勒">阿克塞尔·舍夫勒</a></span><span> /2022-05-01</span><span> /<a
href="//search.dangdang.com/?key=&key3=%CD%E2%D3%EF%BD%CC%D1%A7%D3%EB%D1%D0%BE%BF%B3%F6%B0%E6%C9%E7&medium=01&category_path=01.00.00.00.00.00"
name="P_cbs" dd_name="单品出版社" title="外语教学与研究出版社">外语教学与研究出版社</a></span></p>
<div class="shop_button"><p class="bottom_p"><a class="search_btn_cart " name="Buy" dd_name="加入购物车"
href="javascript:AddToShoppingCart(29409127)"
ddclick="act=normalResult_addToCart&pos=29409127_1_1_p">加入购物车</a><a
class="search_btn_collect" name="collect" dd_name="加入收藏" id="lcase29409127" href="javascript:void(0);"
ddclick="act=normalResult_favor&pos=29409127_1_1_p">收藏</a></p></div>
</li>
调试后的爬虫代码
python
import requests
from bs4 import BeautifulSoup
import json
import time
import re
def fetch_category(category_url, category_name, pages=5):
all_books = []
base_url = "http://category.dangdang.com/"
for page in range(1, pages+1):
url = f'{base_url}pg{page}-{category_url}' # 根据实际URL调整
headers = {'User-Agent': 'Mozilla/5.0'}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, 'lxml')
pattern = re.compile(r'line\d+')
items = soup.find_all('li', class_=pattern) # 商品项选择器
for item in items:
name = item.find('a', class_='pic').get('title') # 商品名
price = item.find('span', class_='search_now_price').text # 折后价格
# 提取作者、出版社
# author_info = item.find('p', class_='search_book_author').text.strip()
itemlist_author = item.find('a', {'name': 'itemlist-author'})
if itemlist_author:
author = itemlist_author.text.strip()
p_cbs=item.find('a', {'name': 'P_cbs'})
if p_cbs:
publisher = p_cbs.text.strip()
# 处理字符串...
#执行 s.strip("条评论") 时,Python 会从字符串 s 的开头依次检查每个字符,如果该字符是 '条'、'评' 或 '论' 中的任意一个,就将其移除;一旦遇到不属于这三个字符的字符,就停止。同样地,从结尾也进行类似的操作。
comment = item.find('a', class_='search_comment_num').text.strip('条评论')
all_books.append({
'name': name,
'price': price,
'author': author,
'publisher': publisher,
'comment': comment
})
time.sleep(2)
return {category_name: all_books}
# 定义要爬的分类URL和名称
categories = {
'计算机': 'cp01.54.00.00.00.00.html',
'小说': 'cp01.03.00.00.00.00.html',
'童书': 'cp01.41.00.00.00.00.html'
}
result = {}
for name, url in categories.items():
result[name] = fetch_category(url, name)
with open('dangdang.json', 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=2)
爬取的JSON数据存储到文件中

总结与下一步建议
通过本次实战,已经掌握了爬虫的基本流程:分析URL → 构造请求 → 解析HTML → 清洗数据 → 存储结果。同时,还实践了分页处理、异常处理、数据清洗等进阶技巧。这些技能可以轻松迁移到其他网站的爬取中。
下一步可以尝试:
爬取图书详情页(从列表页进入),获取更多信息如目录、简介。
将数据存入数据库(如SQLite、MySQL)。
添加数据可视化分析(如价格分布、出版社排行)。
使用Scrapy框架构建更规范的爬虫项目。