Python爬虫入门实战:Books to Scrape网站数据抓取
1. 项目背景与核心价值Books to Scrape 是一个专门为爬虫学习设计的沙盒网站它模拟了真实电商网站的结构和反爬机制但不会对爬虫行为进行实际限制。这个项目非常适合作为爬虫入门者的第一个实战案例原因有三网站结构清晰但又不失复杂度包含了分页、详情页、分类导航等典型电商元素数据质量高且稳定图书信息包含封面图、书名、价格、库存状态、评分等完整字段没有法律风险是官方明确允许爬取的练习平台我曾用这个案例带过20新人入门爬虫发现它能很好地训练以下几个核心能力HTML解析与数据抽取分页处理逻辑异常请求处理数据清洗与结构化存储2. 技术方案设计2.1 工具选型解析对于这种中小规模的静态网站爬取我推荐使用以下技术栈组合import requests from bs4 import BeautifulSoup import pandas as pd import time import random选择理由requests比urllib更人性化的HTTP库适合初学者快速上手BeautifulSoupHTML解析神器学习曲线平缓pandas数据清洗和导出CSV的一站式解决方案timerandom用于实现请求间隔模拟人类操作注意虽然Scrapy框架更强大但对于新手来说先用这个轻量级方案理解爬虫基本原理更重要。等掌握了基础再升级到框架不迟。2.2 爬取策略设计整个爬取流程分为三个关键阶段目录页遍历先获取所有图书分类链接共50个分类列表页处理每个分类下的分页处理平均每个分类3-5页详情页抓取最终获取每本书的完整信息字段关键技巧在于设计合理的URL生成规则。观察网站后发现分类页URL模式http://books.toscrape.com/catalogue/category/books/{分类名}/index.html分页URL模式.../page-{页码}.html详情页URL直接从列表页的h3a标签提取3. 核心代码实现3.1 基础请求函数封装先实现一个带异常处理的请求函数def safe_request(url, max_retry3): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } for _ in range(max_retry): try: resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() return resp except Exception as e: print(f请求失败: {url}, 错误: {str(e)}) time.sleep(random.uniform(1, 3)) return None这个函数实现了随机User-Agent模拟浏览器超时和重试机制随机延迟避免被封3.2 列表页解析关键代码def parse_list_page(html): soup BeautifulSoup(html, html.parser) books [] # 提取当前页所有图书条目 for article in soup.select(article.product_pod): book { title: article.h3.a[title], detail_url: http://books.toscrape.com/catalogue/ article.h3.a[href].replace(../, ), price: article.select(p.price_color)[0].get_text(), rating: article.p[class][1] # 评分藏在class名里 } books.append(book) # 检查是否有下一页 next_btn soup.select(li.next a) if next_btn: next_url http://books.toscrape.com/catalogue/category/ next_btn[0][href].replace(../, ) return books, next_url return books, None这里有几个易错点详情页URL需要拼接基础路径评分信息藏在class属性的第二个值如star-rating Four表示4星分页按钮可能不存在需要做判空处理3.3 详情页字段提取def parse_detail_page(html): soup BeautifulSoup(html, html.parser) table soup.find(table, class_table table-striped) return { upc: table.find(th, textUPC).find_next(td).text, product_type: table.find(th, textProduct Type).find_next(td).text, price_excl_tax: table.find(th, textPrice (excl. tax)).find_next(td).text, price_incl_tax: table.find(th, textPrice (incl. tax)).find_next(td).text, tax: table.find(th, textTax).find_next(td).text, availability: table.find(th, textAvailability).find_next(td).text, num_reviews: table.find(th, textNumber of reviews).find_next(td).text, description: soup.find(div, idproduct_description).find_next(p).text if soup.find(div, idproduct_description) else }重要提示不是所有图书都有描述信息必须做判空处理否则会抛出AttributeError4. 完整爬取流程实现4.1 主控逻辑代码def crawl_whole_site(): base_url http://books.toscrape.com/ start_url base_url index.html # 第一步获取所有分类链接 resp safe_request(start_url) soup BeautifulSoup(resp.text, html.parser) category_links [ base_url li.a[href] for li in soup.select(div.side_categories ul li ul li) ] all_books [] # 第二步遍历每个分类 for cat_url in category_links: print(f正在处理分类: {cat_url}) current_url cat_url # 第三步处理分类下的所有分页 while current_url: resp safe_request(current_url) if not resp: break books, next_page parse_list_page(resp.text) # 第四步处理每本书的详情页 for book in books: detail_resp safe_request(book[detail_url]) if detail_resp: detail_info parse_detail_page(detail_resp.text) complete_book {**book, **detail_info} all_books.append(complete_book) time.sleep(random.uniform(0.5, 1.5)) # 礼貌性延迟 current_url next_page # 最终数据存储 df pd.DataFrame(all_books) df.to_csv(books_data.csv, indexFalse, encodingutf-8-sig) print(f共爬取 {len(df)} 条图书数据已保存到books_data.csv)4.2 关键优化点增量爬取添加检查机制避免重复爬取已存在的数据if os.path.exists(books_data.csv): existing pd.read_csv(books_data.csv) existing_urls set(existing[detail_url]) else: existing_urls set()断点续爬将已处理的URL保存到文件程序重启后可以继续# 保存进度 with open(progress.txt, a) as f: f.write(f{current_url}\n)代理池集成如果需要大规模爬取可以加入代理IPproxies { http: http://your_proxy:port, https: http://your_proxy:port } resp requests.get(url, proxiesproxies)5. 常见问题与解决方案5.1 请求被拒绝403错误可能原因服务器检测到爬虫行为User-Agent被识别解决方案轮换User-Agentuser_agents [ Mozilla/5.0 (Windows NT 10.0; Win64; x64)..., Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)... ] headers {User-Agent: random.choice(user_agents)}添加请求延迟time.sleep(random.uniform(1, 3)) # 1-3秒随机延迟5.2 数据提取失败典型错误AttributeError: NoneType object has no attribute find_next解决方法总是先检查元素是否存在element soup.find(div, class_price) if element: price element.text使用更健壮的CSS选择器# 不推荐 price soup.find(p, class_price_color).text # 推荐 price soup.select_one(p.price_color).get_text()5.3 CSV文件乱码问题表现用Excel打开中文显示为乱码pandas默认使用utf-8编码解决方案df.to_csv(books_data.csv, indexFalse, encodingutf-8-sig)6. 数据清洗与后续分析建议爬取完成后通常需要对原始数据做一些清洗# 价格清洗 df[price] df[price].str.replace(£, ).astype(float) # 库存数字提取 df[stock] df[availability].str.extract((\d)).fillna(0).astype(int) # 评分转换 rating_map {One:1, Two:2, Three:3, Four:4, Five:5} df[rating] df[rating].map(rating_map)后续分析方向建议价格分布分析各分类图书数量统计评分与价格的关系库存与价格的相关性这个项目虽然不大但完整覆盖了爬虫开发的各个环节。建议新手在完成基础版本后尝试添加以下进阶功能使用多线程加速爬取将数据存入MySQL数据库添加自动邮件通知功能部署到服务器定时运行

相关新闻

Vue 3.6 Vapor 模式结合 WebGL/Canvas:打造 60fps 极速实时数据流图表

Vue 3.6 Vapor 模式结合 WebGL/Canvas:打造 60fps 极速实时数据流图表

在构建出海 SaaS 的实时监控大屏、高频金融行情图、或者双 11 大促流量实时态势感知系统时,前端工程师常常会遇到一个令人头疼的性能瓶颈:高频数据流与框架渲染开销的冲突。 当服务端通过 WebSocket 以每秒 60 次到 100 次的频率向前端推送成千上万个指标…

2026/10/14 6:33:28 阅读更多 →
人工智能课程(配套AIMA(Artificial Intelligence: A Modern Approach))

人工智能课程(配套AIMA(Artificial Intelligence: A Modern Approach))

一、1 AI简介27 道德与安全四种理解 AI 的方式:Think like a human —— 像人一样思考 Act like a human —— 像人一样行动 Think rationally —— 理性地思考 Act rationally —— 理性地行动这门课把 AI 的核心看成:构造能够在环境中“理性行动&#…

2026/10/14 6:33:28 阅读更多 →
级联H桥储能变流器双层SOC均衡:相内相间错峰控制策略

级联H桥储能变流器双层SOC均衡:相内相间错峰控制策略

调到级联H桥储能变流器项目上的人,迟早都会撞上同一样东西:屏幕上几十条SOC曲线像炸开的梳子,A相第3簇还顶着72%在放电,B相最差的那簇已经报到58%。你要是不管,顶多几分钟,最弱的那一簇就会先触底&#xff…

2026/10/14 6:33:28 阅读更多 →

最新新闻

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

MATLAB共享储能电站冷热电多微网双层优化配置模型详解

先说一句啊,这篇不是那种把模型往纸上一放、公式一抄就完事的论文复现,而是基于“MATLAB共享储能电站服务冷热电多微网系统双层优化配置模型”这条线,把建模思路、求解路线、MATLAB实现细节和踩坑经验一次性捋清楚。如果你想做园区级综合能源…

2026/10/14 7:20:37 阅读更多 →
90天PMP通关攻略:专治拖延症的反人性备考技巧

90天PMP通关攻略:专治拖延症的反人性备考技巧

2026年6月PMP考试:一场与“拖延症”的终极对决!90天通关全攻略(内附反人性备考技巧)如果有人问我,PMP考试难在哪,我大概率会说:难在开始。2026年6月那场考试,我提前90天就买好了教材…

2026/10/14 7:20:37 阅读更多 →
电商数据获取技术解析与实战架构设计

电商数据获取技术解析与实战架构设计

1. 电商数据获取的核心价值与挑战在电商行业摸爬滚打这些年,我深刻体会到数据就是决策的氧气。记得2016年刚入行时,团队还在用Excel手动统计商品点击量,现在回头看简直像石器时代。如今一个中等规模的电商平台,日均产生的用户行为…

2026/10/14 7:20:37 阅读更多 →
豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

豆瓣电影排行榜高级爬虫实战:从请求构造到数据存储的完整链路

很多人学网络爬虫时,第一个练手项目都会选豆瓣电影排行榜的数据抓取。理由很简单:页面结构清晰、数据规律、难度适中。但如果你以为requests拿到HTML、正则抠出几条电影名就算学会了爬虫,那离真正的高级数据抓取还差着十万八千里。我见过不少…

2026/10/14 7:20:37 阅读更多 →
做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?回款周期与利润真相深度拆解

做Temu多久能看到收益?这个问题几乎每个新入局的人都问过,但网上的答案特别极端:一边是晒后台截图说上架三天就出单的,一边是吐槽备货压了几万块却迟迟见不到钱的。我跟几个做全托管、半托管的朋友反复对过账,也盯着后…

2026/10/14 7:20:37 阅读更多 →
AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

1. 这个“2万Star”到底意味着什么:从GitHub数字看AI编程教程的真实分量很多人看到标题里“2万Star”第一反应是:哇,火了。但作为在开发者教育领域摸爬滚打十多年的老手,我得先泼一盆冷静的水——Star数从来不是教学内容质量的直接…

2026/10/14 7:19:37 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →