Python爬虫实战:用requests库爬取电商数据并保存到Excel
Python爬虫实战用requests库爬取电商数据并保存到Excel爬虫是 Python 最经典的应用场景之一。本文将从零开始带你用 requests 库爬取电商商品数据并使用 pandas 和 openpyxl 将数据清洗后保存到 Excel 文件。包含完整的反爬处理策略适合新手学习。一、准备工作1.1 安装依赖库首先我们需要安装以下 Python 库pipinstallrequests pandas openpyxl fake-useragent各库的作用requests发送 HTTP 请求获取网页内容pandas数据处理和清洗openpyxl读写 Excel 文件fake-useragent生成随机 User-Agent1.2 项目结构spider_project/ ├── spider.py # 主爬虫脚本 ├── data_clean.py # 数据清洗脚本 ├── requirements.txt # 依赖列表 └── output/ # 输出目录 └── products.xlsx # 最终 Excel 文件二、基础爬虫实现2.1 发送第一个请求我们先从最简单的请求开始importrequests# 发送 GET 请求urlhttps://books.toscrape.com/responserequests.get(url)# 查看响应状态码print(f状态码:{response.status_code})print(f响应长度:{len(response.text)})# 查看部分响应内容print(response.text[:500])2.2 解析 HTML 内容我们使用 Python 内置的html.parser或者更强大的lxml来解析 HTMLfromhtml.parserimportHTMLParserclassProductParser(HTMLParser):def__init__(self):super().__init__()self.products[]self.current_product{}self.captureFalsedefhandle_starttag(self,tag,attrs):attrs_dictdict(attrs)iftagarticleandproduct_podinattrs_dict.get(class,):self.current_product{}iftagh3:self.captureTruedefhandle_data(self,data):ifself.capture:self.current_product[title]data.strip()self.captureFalseparserProductParser()parser.feed(response.text)print(f找到{len(parser.products)}个商品)三、反爬处理策略电商平台通常会有反爬机制我们需要做好以下处理3.1 设置请求头importrequestsfromfake_useragentimportUserAgent uaUserAgent()# 构造完整的请求头headers{User-Agent:ua.random,Accept:text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8,Accept-Language:zh-CN,zh;q0.9,en;q0.8,Accept-Encoding:gzip, deflate, br,Connection:keep-alive,Referer:https://books.toscrape.com/,}responserequests.get(url,headersheaders)3.2 请求延迟避免请求过快被识别为爬虫importtimeimportrandomdefcrawl_with_delay(urls):results[]forurlinurls:responserequests.get(url,headersheaders)results.append(response)# 随机延迟 1-3 秒delayrandom.uniform(1,3)print(f等待{delay:.2f}秒...)time.sleep(delay)returnresults3.3 使用代理 IP# 代理池配置proxy_list[http://123.45.67.89:8080,http://98.76.54.32:3128,# 更多代理...]defget_random_proxy():proxyrandom.choice(proxy_list)return{http:proxy,https:proxy}# 使用代理发送请求try:proxyget_random_proxy()responserequests.get(url,headersheaders,proxiesproxy,timeout10)exceptrequests.exceptions.RequestExceptionase:print(f请求失败:{e})3.4 重试机制fromretryingimportretryretry(stop_max_attempt_number3,wait_fixed2000)deffetch_url(url,headersheaders):responserequests.get(url,headersheaders,timeout10)response.raise_for_status()returnresponse四、完整爬虫代码下面是完整的爬虫代码整合了所有反爬策略importrequestsimporttimeimportrandomimportjsonfromfake_useragentimportUserAgentclassECommerceSpider:# 电商数据爬虫def__init__(self):self.uaUserAgent()self.sessionrequests.Session()self.data[]defget_headers(self):# 生成随机请求头return{User-Agent:self.ua.random,Accept:text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.8,Accept-Language:zh-CN,zh;q0.9,en;q0.8,Connection:keep-alive,}defcrawl_page(self,page_num):# 爬取单页数据urlfhttps://books.toscrape.com/catalogue/page-{page_num}.htmlheadersself.get_headers()try:responseself.session.get(url,headersheaders,timeout10)response.raise_for_status()returnresponse.textexceptrequests.exceptions.RequestExceptionase:print(f第{page_num}页爬取失败:{e})returnNonedefparse_products(self,html):# 解析商品数据fromhtml.parserimportHTMLParserclassBookParser(HTMLParser):def__init__(self):super().__init__()self.books[]self.current{}self.in_titleFalseself.in_priceFalseself.in_ratingFalsedefhandle_starttag(self,tag,attrs):attrs_dictdict(attrs)iftagarticleandproduct_podinattrs_dict.get(class,):self.current{}iftagh3:self.in_titleTrueiftagpandprice_colorinattrs_dict.get(class,):self.in_priceTrueiftagpandstar-ratinginattrs_dict.get(class,):ratingattrs_dict.get(class,).split()[-1]self.current[rating]ratingdefhandle_data(self,data):ifself.in_title:self.current[title]data.strip()self.in_titleFalseifself.in_price:self.current[price]data.strip()self.in_priceFalsedefhandle_endtag(self,tag):iftagarticleandself.current:self.books.append(self.current)self.current{}parserBookParser()parser.feed(html)returnparser.booksdefrun(self,max_pages5):# 运行爬虫print( 开始爬取 )forpageinrange(1,max_pages1):print(f正在爬取第{page}页...)htmlself.crawl_page(page)ifhtml:productsself.parse_products(html)self.data.extend(products)print(f 获取到{len(products)}条数据)# 随机延迟time.sleep(random.uniform(1,3))print(f 爬取完成共{len(self.data)}条数据 )returnself.data# 运行爬虫spiderECommerceSpider()dataspider.run(max_pages5)五、数据清洗爬取到的原始数据通常需要清洗。我们使用 pandas 进行处理importpandasaspddefclean_data(raw_data):# 数据清洗dfpd.DataFrame(raw_data)print(f原始数据量:{len(df)})print(df.head())# 1. 去除重复数据dfdf.drop_duplicates(subset[title])print(f去重后数据量:{len(df)})# 2. 清洗价格字段去除货币符号转换为数值df[price]df[price].str.replace(£,).str.replace(Â,).astype(float)df.rename(columns{price:price_gbp},inplaceTrue)# 3. 评分映射rating_map{One:1,Two:2,Three:3,Four:4,Five:5}df[rating_score]df[rating].map(rating_map)# 4. 添加爬取时间df[crawl_time]pd.Timestamp.now()# 5. 去除空值dfdf.dropna(subset[title,price_gbp])print(f清洗后数据量:{len(df)})returndf# 清洗数据dfclean_data(data)print(df.describe())六、保存到 Excel6.1 基础保存# 最简单的保存方式df.to_excel(output/products.xlsx,indexFalse)print(数据已保存到 output/products.xlsx)6.2 格式化保存使用 openpyxl 进行格式化fromopenpyxlimportWorkbookfromopenpyxl.stylesimportFont,PatternFill,Alignment,Border,Sidefromopenpyxl.utils.dataframeimportdataframe_to_rowsdefsave_to_excel(df,filepath):# 格式化保存到 ExcelwbWorkbook()wswb.active ws.title商品数据# 标题样式header_fontFont(name微软雅黑,size11,boldTrue,colorFFFFFF)header_fillPatternFill(start_color4472C4,end_color4472C4,fill_typesolid)borderBorder(leftSide(stylethin),rightSide(stylethin),topSide(stylethin),bottomSide(stylethin))# 写入数据forrowindataframe_to_rows(df,indexFalse,headerTrue):ws.append(row)# 格式化标题行forcellinws[1]:cell.fontheader_font cell.fillheader_fill cell.alignmentAlignment(horizontalcenter)cell.borderborder# 设置列宽ws.column_dimensions[A].width50# 标题列ws.column_dimensions[B].width15# 价格列ws.column_dimensions[C].width12# 评分列# 添加自动筛选ws.auto_filter.refws.dimensions wb.save(filepath)print(f格式化数据已保存到{filepath})save_to_excel(df,output/products_formatted.xlsx)七、新手注意事项遵守 robots.txt爬取前先查看目标网站的 robots.txt控制请求频率不要请求过快尊重服务器数据仅供学习爬取的数据仅用于学习研究不要商用处理异常网络请求可能失败务必做好异常处理合法合规遵守相关法律法规不要爬取敏感数据八、完整流程总结发送请求 → 获取HTML → 解析数据 → 数据清洗 → 保存Excel | | | | | 设置UA 响应文本 提取字段 去重转换 格式化输出 设置头 编码处理 结构化 空值处理 自动筛选 代理池 超时控制 存储列表 类型转换 列宽设置九、扩展建议使用Scrapy框架处理大型爬虫项目使用Selenium或Playwright处理动态渲染页面使用Redis构建分布式爬虫队列使用数据库MySQL/MongoDB存储大量数据如果这篇文章对你有帮助欢迎点赞、收藏、关注有任何问题欢迎在评论区交流我会及时回复。后续会分享更多 Python 爬虫实战教程敬请期待作者tlyyxjz | 转载请注明出处

相关新闻

LangExtract:面向业务语义的动态文本抽取框架

LangExtract:面向业务语义的动态文本抽取框架

1. 项目概述:为什么传统文本提取正在失效,而LangExtract不是另一个“AI玩具”我做文本数据处理已经十年了。最早用正则表达式从日志里扒IP地址,后来写Python脚本解析PDF表格,再后来搭spaCy流水线做客服工单分类——每一步都踩过坑…

2026/10/12 2:45:13 阅读更多 →
多维聚合实战:银行风控中的五种核心模式

多维聚合实战:银行风控中的五种核心模式

1. 项目概述:为什么多维聚合不是“加个groupby”就完事了?我在银行数据平台组干了八年,从最早用SQL写几十行嵌套子查询做客户分层,到后来在Spark上跑PB级交易流水,再到如今带团队设计实时风控指标引擎——所有这些活儿…

2026/10/7 3:14:36 阅读更多 →
大模型API实战指南:GPT、Gemini与Llama技术选型与工程实践

大模型API实战指南:GPT、Gemini与Llama技术选型与工程实践

如果你最近在关注大模型动态,可能会被各种"GPT-5.6"、"Gemini 3.5 Pro"的消息搞得一头雾水。这些看似"最新"的模型版本,实际上很多都是社区讨论中的非官方信息,甚至包含误导性内容。今天这篇文章,我…

2026/10/13 12:16:35 阅读更多 →

最新新闻

AnyPS5跨平台图像处理管线:色彩管理与批量处理实战避坑指南

AnyPS5跨平台图像处理管线:色彩管理与批量处理实战避坑指南

1. 项目缘起与核心定位AnyPS5 这个名字第一次出现在我视野里的时候,我正被一堆跨平台图像处理的需求折腾得够呛。团队里有人用 Windows 做设计,有人用 macOS 做后期,还有几个同事习惯在 Linux 环境下跑批处理脚本,每次交付素材都要…

2026/10/14 4:26:51 阅读更多 →
GridView + AJAX 效果实战:Web Forms老项目异步升级指南

GridView + AJAX 效果实战:Web Forms老项目异步升级指南

简介:这是一份专门面向ASP.NET开发者的GridView实用实例,旨在解决Visual Studio自带GridView在数据增删改操作与交互体验上的明显短板。资源基于ASP.NET 4.0与SQL Server 2008环境,实现了完整的无刷新Ajax增删改功能,代码量少、结…

2026/10/14 4:26:51 阅读更多 →
Flutter迁移开源鸿蒙实战:逆向匹配算法设计与踩坑记录

Flutter迁移开源鸿蒙实战:逆向匹配算法设计与踩坑记录

从拿到这个标题到真正把App跑在开源鸿蒙设备上,中间隔了整整两个周末的调试时间。这篇东西不是教程式的堆砌,而是把我做“flutter_for_openharmony逆向思维训练app实战逆向匹配实现”这个项目时踩过的坑、想通的原理、反复验证过的代码逻辑,全…

2026/10/14 4:26:51 阅读更多 →
开源八卦怎么吃?从项目细节中读出真实信号

开源八卦怎么吃?从项目细节中读出真实信号

我最初入行写代码那几年,对“开源”的理解很单纯:一堆互相不认识的人,在某个仓库里合写代码,因为共同的兴趣走到一起。直到后来亲历了几场“项目圈内事件”,才意识到开源世界里的“八卦”根本不是茶余饭后的消遣——它…

2026/10/14 4:26:51 阅读更多 →
范畴论入门必刷:Algebra Chapter 0集合练习题复盘与映射思维训练

范畴论入门必刷:Algebra Chapter 0集合练习题复盘与映射思维训练

1. 为什么“集合练习题”值得单独拎出来做一篇复盘很多人看到“Algebra: Chapter 0”这个书名,第一反应是“范畴论入门”,然后翻两页就被各种交换图劝退。但真正卡住新手的往往不是后面的泛函、自然变换,而是第0章里那些看起来人畜无害的集合…

2026/10/14 4:26:51 阅读更多 →
考研数据结构复试高频考点、手写代码与面试应对策略

考研数据结构复试高频考点、手写代码与面试应对策略

初试成绩出来之后,很多同学会陷入一种“不知道该干什么”的状态。刷题吧,好像复试不考这么细;看论文吧,又不知道从哪看起;真要准备机试,又发现手生的厉害。我自己当年备考“考研数据结构复试题目整理”的时…

2026/10/14 4:25:51 阅读更多 →

日新闻

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 阅读更多 →