硬核入门!Python爬虫实战:爬取豆瓣读书TOP250,书名+评分+简介,一键生成精美Excel书单(2026避坑版)
前言“想建个私人书单却要在豆瓣上一页页复制粘贴”“看到好书想记录但手动整理书名、作者、评分、简介太耗时”“听说爬虫很酷但怕封IP、怕写代码太难、怕法律风险”别担心今天我们将通过一个经典且实用的项目——爬取豆瓣读书TOP250带你从零开始掌握Python爬虫的核心技能。为什么选豆瓣TOP250结构清晰HTML结构规范非常适合新手练习解析。数据价值高涵盖书名、作者、评分、评价人数、简介等核心信息是制作书单的完美素材。反爬适中有一定的反爬机制如User-Agent检查能学到真实的对抗技巧但又不会像大厂那样难如登天。本实战你将学到️请求伪装如何构造Headers让服务器以为你是真人浏览器。数据提取使用BeautifulSoup和CSS选择器精准定位目标数据。️反爬策略添加延时、随机User-Agent优雅地避免被封禁。数据持久化使用pandas将清洗后的数据一键导出为专业的Excel表格。⚖️合规指南爬虫的道德与法律边界做守法的开发者。哪怕你是编程小白跟着本文步骤30分钟内也能拥有自己的自动化书单收集器一、环境准备工欲善其事在开始之前我们需要安装几个核心库。请确保你已安装 Python 3.8。1. 安装依赖打开终端CMD或Terminal运行以下命令pipinstallrequests beautifulsoup4 pandas openpyxlrequests: 发送HTTP请求获取网页内容。beautifulsoup4: 解析HTML提取数据的神器。pandas: 数据处理与Excel导出。openpyxl: pandas导出Excel所需的引擎。2. 项目结构创建一个文件夹douban_spider内部结构如下douban_spider/ ├── main.py # 主程序代码 ├── books.xlsx # 生成的结果文件运行后产生 └── README.md # 说明文档二、核心代码实战四步走战略第一步分析网页结构与反爬机制打开浏览器推荐Chrome访问 豆瓣读书TOP250。按F12打开开发者工具切换到Network(网络) 标签。刷新页面找到第一个top250请求。观察Request Headers豆瓣会检查User-Agent。如果缺失或是Python默认的python-requests直接返回418错误“I’m a teapot”。对策我们需要伪造一个浏览器的User-Agent。观察HTML结构Elements标签每本书在一个tr classitem标签中。书名div classpl2下的a标签。作者/出版社/价格p classpl标签。评分span classrating_nums。简介span classinq注意部分书可能没有简介。图片链接img的src属性。第二步编写爬虫核心逻辑 (main.py)importrequestsfrombs4importBeautifulSoupimportpandasaspdimporttimeimportrandom# 1. 配置请求头 (伪装成浏览器)HEADERS{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Referer:https://book.douban.com/}defget_book_data(url):发送请求并获取单页数据try:responserequests.get(url,headersHEADERS,timeout10)response.raise_for_status()# 豆瓣网页编码通常是utf-8但有时需要手动指定response.encodingutf-8returnresponse.textexceptrequests.RequestExceptionase:print(f请求失败:{e})returnNonedefparse_html(html):解析HTML提取书籍信息soupBeautifulSoup(html,html.parser)books[]# 定位所有书籍条目itemssoup.find_all(tr,class_item)foriteminitems:try:# --- 提取书名 (处理换行符) ---title_divitem.find(div,class_pl2)full_titletitle_div.find(a)[title]iftitle_div.find(a).get(title)elsetitle_div.find(a).get_text(stripTrue)# 有些书名包含副标题用换行符分隔这里简单处理titlefull_title.replace(\n,).replace(/, ).strip()# --- 提取作者/出版社/年份/价格 ---info_pitem.find(p,class_pl)info_textinfo_p.get_text(stripTrue)ifinfo_pelse# 简单分割实际可根据 / 进一步结构化author_pubinfo_text# --- 提取评分 ---rating_spanitem.find(span,class_rating_nums)ratingrating_span.get_text(stripTrue)ifrating_spanelse无评分# --- 提取评价人数 ---votes_spanitem.find(span,textlambdat:tand人评价int)votesvotes_span.get_text(stripTrue).replace(人评价,)ifvotes_spanelse0# --- 提取简介 ---quote_spanitem.find(span,class_inq)summaryquote_span.get_text(stripTrue)ifquote_spanelse无简介# --- 提取封面图链接 ---img_tagitem.find(img)cover_urlimg_tag[src]ifimg_tagelsebooks.append({书名:title,作者/出版信息:author_pub,评分:rating,评价人数:votes,简介:summary,封面链接:cover_url})exceptExceptionase:print(f解析单条数据出错:{e})continuereturnbooksdefmain():all_books[]base_urlhttps://book.douban.com/top250?start{}print( 开始爬取豆瓣读书TOP250...)# TOP250每页25本共10页 (0, 25, 50 ... 225)forpageinrange(10):start_numpage*25urlbase_url.format(start_num)print(f正在爬取第{page1}页:{url})htmlget_book_data(url)ifhtml:dataparse_html(html)all_books.extend(data)print(f✅ 第{page1}页抓取成功共{len(data)}本书)else:print(f❌ 第{page1}页抓取失败跳过)# ️ 关键反爬策略随机延时# 模拟人类阅读速度避免请求过快触发风控sleep_timerandom.uniform(1.5,3.5)time.sleep(sleep_time)# 3. 保存数据到Excelifall_books:dfpd.DataFrame(all_books)file_name豆瓣读书TOP250书单.xlsx# 调整列顺序dfdf[[书名,作者/出版信息,评分,评价人数,简介,封面链接]]# 导出Exceldf.to_excel(file_name,indexFalse)print(f 成功数据已保存至{file_name}共{len(df)}条记录。)else:print( 未获取到任何数据请检查网络或代码。)if__name____main__:main()三、关键点深度解析1. 为什么需要User-Agent服务器通过User-Agent判断客户端身份。如果是Python默认的python-requests/x.x.x豆瓣会直接拒绝服务返回418状态码。解决复制浏览器的UA字符串放入HEADERS字典。进阶可以建立一个UA池每次请求随机选择一个进一步降低风险。2. 数据清洗的细节书名处理豆瓣的书名有时包含换行符\n或副标题分隔符/代码中使用了.replace()进行清理保证Excel整洁。缺失值处理不是所有书都有“简介”或“评分”代码中做了if ... else 无简介的判断防止程序报错崩溃。3. 反爬核心时间延时 (time.sleep)这是新手最容易忽略的一点。错误做法不加延时瞬间发送10个请求。结果IP被暂时封禁。正确做法time.sleep(random.uniform(1.5, 3.5))。模拟人类翻页的不确定性。给服务器喘息时间体现“礼貌爬虫”原则。4. 为什么用 Pandas 而不是csvcsv处理中文编码容易乱码GBk vs UTF-8。pandas的to_excel直接生成.xlsx格式自动处理编码且支持格式化虽然本例未展示但扩展性强。四、运行结果展示运行脚本后你将得到一个名为豆瓣读书TOP250书单.xlsx的文件。书名作者/出版信息评分评价人数简介封面链接百年孤独[哥伦比亚] 加西亚·马尔克斯 / 2011-6-1 / 39.50元9.3582109魔幻现实主义文学巅峰之作…https://img1.doubanio.com/…活着余华 / 2012-8-1 / 20.00元9.4903211讲述一个人一生的故事关于苦难与生存…https://img2.doubanio.com/…………………你可以直接用Excel筛选“评分9.0”的书籍或者根据“作者”排序轻松制作你的年度阅读计划五、常见问题与避坑指南 (FAQ)❌ 问题1运行报错418 Client Error: Im a teapot原因User-Agent 缺失或被识别为爬虫。解决检查HEADERS是否正确赋值。尝试更换一个最新的浏览器UA字符串。❌ 问题2中文乱码原因Excel打开CSV时的编码问题或爬取时解码错误。解决本代码直接使用pandas.to_excel避免了CSV乱码问题。如果必须存CSV请指定encodingutf-8-sig。❌ 问题3数据提取为空原因豆瓣网页结构微调导致CSS选择器失效。解决重新F12检查元素类名class name是否变化如pl2变成了pl3更新find或select的参数。❌ 问题4IP被封禁现象连续请求后所有请求都返回错误。解决增加sleep时间如 5-10秒。暂停程序换个网络环境如切换手机热点再试。进阶使用代理IP池本项目不需要仅针对大规模爬取。六、⚠️ 重要爬虫的道德与法律边界技术无罪但使用需有度。在编写和运行爬虫时请务必遵守以下原则遵守 Robots 协议访问https://www.douban.com/robots.txt。豆瓣允许部分爬取但禁止高频访问和商业化利用。本教程仅限个人学习研究。控制频率不要对服务器造成压力。本代码中的sleep是必须的不要删除。数据用途✅ 允许个人书单管理、数据分析练习、学术研究。❌ 禁止将数据用于商业售卖、搭建镜像网站、公开传播大量数据。隐私保护只爬取公开数据严禁尝试获取用户隐私信息。声明本教程代码仅供学习交流使用。请勿用于任何非法用途。如因滥用代码导致的法律纠纷作者不承担任何责任。七、进阶挑战你能做得更好如果你已经跑通了代码不妨尝试以下挑战提升技能树下载封面图利用cover_url使用requests下载图片保存到本地文件夹建立可视化书库。深入详情页目前只爬了列表页。尝试进入每本书的详情页爬取更详细的“目录”、“书评摘要”、“标签”。数据可视化使用matplotlib或pyecharts绘制“高分书籍出版社分布图”或“评分与评价人数散点图”。自动化推送结合smtplib每周自动抓取新书榜发送邮件推荐给你自己。总结通过这个实战你不仅获得了一份珍贵的豆瓣TOP250书单更重要的是掌握了HTTP请求与响应的本质。HTML解析的核心技巧。反爬虫的基本应对策略。数据清洗与存储的完整流程。爬虫是通往数据世界的一把钥匙。现在钥匙在你手中去探索更多有趣的数据吧
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413498.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!