尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python爬虫实战:从网页请求到数据存储的完整指南
做爬虫这件事最初往往源于一句很朴素的抱怨“这网站上明明有我要的数据为什么不能直接复制下来”我第一次写Python爬虫就是帮朋友整理一个行业网站上的商品价格信息手动复制粘贴到第两百条的时候眼睛都快花了。后来花了一个下午写了个脚本十分钟就把三千多条数据整整齐齐地存进了表格里。从那一刻我意识到所谓“用Python爬取想要的网页信息”本质上就是把自己从重复劳动里解放出来的过程。我见过很多人把爬虫想得很玄觉得要懂一堆底层协议、浏览器内核其实大部分日常需求根本用不上那么深。你只需要搞清楚三件事怎么把网页请求回来怎么把网页里有用的内容挑出来怎么把挑出来的内容存好。Python在这条链路里有非常成熟的工具链只要按部就班地走一遍一个能用的爬虫脚本大概率能在半天内跑起来。这篇文章就从我实际做项目的角度把整个过程拆开揉碎讲一遍内容包括工具选型、请求写法、解析技巧、数据清洗、常见坑的排查以及我自己反复踩过的几个雷。不管你是刚接触Python的小白还是已经有基础想系统梳理一下这篇文章应该都能给你一些能直接上手的参考。1. 动手前先想清楚爬虫项目的第一步是需求拆解很多人拿到一个爬虫需求就急着写代码结果写一半发现目标页面的数据是动态加载的或者目标数据散落在好几个页面里又或者根本不需要写爬虫网站自己就提供了导出功能。所以我习惯先把需求拆清楚这比选什么工具都重要。1.1 明确目标数据你要抓的到底是什么说白了你得先回答这几个问题目标网站是哪个页面结构大概什么样要抓的数据字段有哪些比如价格、标题、发布时间、评论数。数据量有多大是几十条、几千条、还是每天要持续抓几万条抓取频率是多少一次性跑完还是需要定时增量更新数据最终存到哪里Excel、CSV、数据库还是直接推到API接口别小看这些问题。有一次我接了个需求对方说要抓某论坛的帖子标题我按常规写了列表页遍历结果跑起来发现他想要的其实是帖子里某个隐藏板块的附件链接整个页面结构完全不一样等于返工。后来我养成了习惯先手动打开目标页面用浏览器开发者工具看一下数据长在哪里再动手写代码。这一步花不了几分钟但能省下后面大半天的调试时间。1.2 协议与合规抓取边界先摸清楚每次讲爬虫我都必须提一句合规。虽然本文是技术分享但边界得先说清楚不抓取个人隐私数据、不抓取需要登录才能访问的非公开数据、不绕过网站的技术访问控制。你可以查看目标网站的robots.txt里面会告诉你哪些路径允许爬虫访问。虽然robots.txt没有法律强制力但尊重它是行业里的基本礼貌。实际操作中我一般这么判断如果能通过浏览器直接看到的数据正常的、低频率的抓取通常问题不大但如果数据需要通过账号登录后才能看或者网站明确有付费墙那就别碰。另外抓下来的数据如果涉及个人可识别信息记得做脱敏处理别原样入库。这些都是从业者应该有的自觉。1.3 工具选型requests BeautifulSoup 还是 Scrapy 还是 SeleniumPython爬虫生态里工具选型是第一步选错了后面会很难受。我按自己的使用经验做个对比方案适用场景优点缺点requests BeautifulSoup静态页面、中小规模抓取轻量、上手快、依赖少面对动态页面无能为力Scrapy大规模、多页面、需要并发抓取框架化、扩展性强、自带去重和调度学习曲线陡项目结构比脚本复杂Selenium动态渲染页面、需要模拟点击所见即所得几乎能操作任何页面慢、吃内存、需要维护浏览器驱动Playwright动态渲染页面、自动化操作比Selenium快支持多浏览器同样有环境依赖需要装浏览器内核requests-html轻量动态页面API友好支持JavaScript渲染底层封装较重出问题排查难我的选择逻辑很直接能静态抓就静态抓一个requests就搞定的事没必要上Scrapy。只有遇到需要渲染JavaScript的页面时我才会考虑Selenium或者Playwright。Scrapy适合那种需要长期跑、数据量达到几十万上百万、还要做增量采集的项目普通的个人小项目用它反而有点杀鸡用牛刀。2. 环境准备与基础请求让脚本先学会“打开网页”工具链选好之后第一件事是把环境搭起来。Python版本建议直接上3.10以上现在新项目真的没必要再考虑2.x了。虚拟环境这个东西我一开始觉得麻烦后来被依赖冲突教育过几次之后发现真香。2.1 环境准备与依赖安装创建一个项目目录然后建虚拟环境mkdir my_spider cd my_spider python3 -m venv venv source venv/bin/activate # Windows下用 venv\Scripts\activate虚拟环境的好处是会为当前项目隔离出一套独立的第三方库环境不同项目之间互不污染。我见过太多“在我电脑上能跑”的惨案就是因为全局环境里装了一堆不同版本的库换台机器就崩了。接下来安装核心依赖pip install requests beautifulsoup4 lxml pandasrequests用来发HTTP请求beautifulsoup4用来解析HTMLlxml是指定的解析器引擎比Python内置的html.parser快得多pandas用来做数据清洗和存储。这几个组合足够应付绝大多数静态页面的抓取场景了。2.2 requests 的基本用法从GET开始请求一个页面的最小代码是这样的import requests url https://example.com/list.html resp requests.get(url, timeout10) print(resp.status_code) print(resp.text[:500])这里有几个细节需要说明。timeout参数很重要我见过很多新手不设置这个参数结果目标网站响应慢的时候脚本就一直挂在那里看起来像是卡死了。设置一个合理的超时时间我一般设10秒至少能让脚本在出错的时候快速失败而不是无限等待。其次拿到响应之后先看status_code如果是200就继续往下走如果是404、403或者500你就要停下来排查了而不是盲目地往解析器里扔数据。2.3 请求头与反爬初步别裸奔第一次用requests跑某个站点的时候我收到过403 Forbidden。原因很简单就是没有设置User-Agent。网站一看这个请求连浏览器标识都没有直接当成非浏览器请求给拒了。所以只要写爬虫我几乎都会带上一些常见的请求头headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, } resp requests.get(url, headersheaders, timeout10)User-Agent可以从自己浏览器的开发者工具里复制不同网站的检测策略不一样有些还会检查Referer、Accept-Language这些字段。我通常的做法是先用浏览器打开目标页面看看Network面板里实际发出的请求头是什么样的然后把关键的几个字段复制到代码里。这样写出来的请求和浏览器发出来的请求长得几乎一样能少很多麻烦。另外很多网站对请求频率很敏感。如果你一口气发几十个请求对方可能直接把你的IP封了。我在代码里习惯用time.sleep控制请求间隔比如import time from random import uniform # 每次请求后随机休眠1到3秒模拟人类浏览节奏 time.sleep(uniform(1, 3))这样做的目的不是“做贼心虚”而是降低对目标服务器的压力避免给对方造成不必要的负担。很多爬虫被拉黑不是技术问题是礼貌问题。3. 页面解析与数据提取从HTML中“抠”出真正有用的信息请求拿到HTML之后下一步就是解析。这一步做得不好后面全白搭。我从第一次写爬虫到现在用过正则、BeautifulSoup、XPath、甚至手写字符串查找函数一路走过来现在90%的静态页面我都用BeautifulSoup解决。3.1 BeautifulSoup 定位与选择器BeautifulSoup的核心用法是定位节点。拿到一个HTML文档之后你可以先用find或者find_all来找标签但更高效的方式是用CSS选择器。比如你想抓一个列表页里所有商品的标题和价格HTML结构可能是这样的ul classproduct-list li classproduct-item h2 classtitle商品A/h2 span classprice99.00/span /li li classproduct-item h2 classtitle商品B/h2 span classprice129.00/span /li /ul对应代码from bs4 import BeautifulSoup soup BeautifulSoup(resp.text, lxml) items soup.select(ul.product-list li.product-item) for item in items: title item.select_one(h2.title).text.strip() price item.select_one(span.price).text.strip() print(title, price)select_one只返回第一个匹配结果select返回所有匹配结果这个要分清。我见过有人用select_one拿所有列表项结果只拿到第一条愣是在那儿debug了半天。3.2 正则与XPath对比正则适合什么样的场景比如你想从一段JavaScript代码里抠出某个变量或者某个数据是嵌在一个很长的文本串里有明显的格式特征。但我不推荐用正则去解析HTML本身因为HTML的标签结构会有各种嵌套和属性顺序变化正则表达式写起来会越来越复杂最后变成一坨只有自己能看懂的“神秘代码”。XPath是另一种定位方式主要用在lxml里。它比CSS选择器更灵活功能也更强大尤其是在处理“按文本内容定位”“按元素位置定位”的时候写起来比CSS选择器直观。比如from lxml import html tree html.fromstring(resp.text) titles tree.xpath(//h2[classtitle]/text())如果你对CSS选择器更熟悉就用CSS如果你更适应XPath的写法那就用XPath。工具无高下顺手就行。我个人的建议是新手优先掌握BeautifulSoup的CSS选择器因为它最贴近日常的HTML理解方式等熟练之后再去学XPath做补充也不迟。3.3 数据清洗与结构化存储解析出原始字符串之后往往还要做清洗。网页里的文本经常带着多余的空白、换行、制表符价格字段可能带特殊符号还有一些字段可能为空。我的习惯是每一步都写成函数这样既方便测试也方便复用。比如清洗价格def parse_price(raw): # 把价格字符串中的非数字字符去掉只保留小数点和数字 cleaned re.sub(r[^\d.], , raw) if not cleaned: return None return float(cleaned)而数据存储我一般分两种。数据量小、结构简单的直接存CSV数据量大、需要频繁查询的存SQLite或者MySQL。存CSV用pandas一行就行import pandas as pd data [ {title: 商品A, price: 99.0}, {title: 商品B, price: 129.0}, ] df pd.DataFrame(data) df.to_csv(products.csv, indexFalse, encodingutf-8-sig)这里有个细节编码字段我用的是utf-8-sig而不是utf-8。因为Excel在打开CSV的时候默认按GBK编码解析不带BOM的UTF-8文件会被识别成乱码。加了个BOM头之后Excel就能正确识别了。这个坑我踩过一次之后所有CSV都会加上这个参数。3.4 动态加载页面的处理思路静态页面毕竟只是多数网站的一部分很多现代网站的数据是通过JavaScript动态渲染的。你requests拿回来的HTML源码里可能只有一个空壳框架真正的数据是通过额外的接口请求加载的。遇到这种情况我一般按优先级尝试这么几个方案先用开发者工具打开页面的Network面板看看页面加载过程中有没有XHR请求返回JSON数据。如果有直接请求那个JSON接口解析JSON比解析HTML省事一万倍。如果接口被加了复杂签名可以考虑直接模拟浏览器渲染上Playwright或者Selenium。最后一个备选方案是看页面里有不有内嵌的JSON数据比如
RELATED

相关推荐

计算机核心课程复习资料整合与应试策略

计算机核心课程复习资料整合与应试策略

1. 项目背景与价值解析作为一名经历过山东大学计算机相关课程的学生,我深刻理解在期末复习阶段整合各科资料的重要性。这份2021年的个人整理资料包,包含了数据可视化、数据科学导论、操作系统和数据库四门核心课程的试题汇总与知识点梳理,正是…

📅 2026/10/14 15:09:15
用C++实现霍夫曼树:从频率统计到文件压缩的完整指南

用C++实现霍夫曼树:从频率统计到文件压缩的完整指南

简介:一份使用C实现的霍夫曼树工程,面向数据结构与算法学习者、压缩编码兴趣者,用于演示最优二叉树的构造与霍夫曼编码生成。资源围绕频率统计、优先队列合并、前缀编码构建及解码过程展开,并给出完整的类设计,可作为课…

📅 2026/10/14 15:09:15
三种梯度下降变体详解:原理、代码与调参实战

三种梯度下降变体详解:原理、代码与调参实战

很久之前帮朋友调一个线性回归模型,训练一直很慢,打印出来的损失下降曲线像蜗牛爬坡。我翻了半天代码才发现,他写的是每次都用全部训练样本算一次梯度、更新一次参数。这不算错,但数据量一上来就特别吃亏。后来我又见过不少同学把…

📅 2026/10/14 15:09:15
MORE NEWS

更多资讯

📰

OpenRig:基于Node.js+tmux的本地大模型开发环境实战指南

1. OpenRig 是什么:一个被严重误读的开源项目名称OpenRig 这个词在当前中文技术社区里,正经历一场典型的“语义漂移”——它既不是某个广为人知的成熟开源项目,也不是官方发布的工具套件,而更像是一组开发者在实操过程中自发组合、…

📰

Python抓包文件解析:从pcap中高效提取DNS、HTTP与TCP流数据

抓包排障做了好几年,我一直觉得pcap文件解析是个“看着简单、上手全是暗坑”的活。你以为拿到一个抓包文件,无非就是读点字节、解个协议,但真到要从海量数据包里批量提取DNS域名、HTTP请求或者某个TCP流里的下载文件时,你会发现事…

📰

工业AI边缘部署实战:从硬件选型到现场调试的避坑指南

1. 为什么工业现场和实验室是两套完全不同的游戏规则很多人第一次听到“工业AI边缘部署”这个词,脑子里浮现的画面可能是在机房里插一张推理卡,把训练好的模型转成通用格式,跑起来就完事了。我在产线现场蹲了三个月之后,可以很负责…

📰

回归还是分类:业务建模选型的底层逻辑与实战指南

1. 开始之前:这个问题为什么值得纠结“拿到一个业务问题,第一件事到底是回归还是分类?” 我见过太多同学卡在这个最初的分岔口上。有人在明确要预测“明天销量是多少件”时选了分类模型,把连续数值硬切成了“高/中/低”三档&#…

📰

C++性能优化4大技巧:Awesome-QuantDev-Learn智能指针、移动语义与模板元编程实战指南

文档教程金融科技 【免费下载链接】Awesome-QuantDev-Learn 本仓库面向所有对量化分析或开发感兴趣的量化交易从业者,提供系统性学习量化开发的技术路线,从数据获取、策略开发、回测系统到实盘部署。 项目地址: https://gitcode.com/gh_mirro…

📰

铝代木构件筑文旅地标 承古韵兼济长效品质

坐落于山西长治长子县的白山羿神文化旅游区,以上古羿神文化为内核,打造集文化展示、游客服务、休闲游憩于一体的文旅综合体。项目核心建筑采用新中式仿古建筑形制,歇山顶舒展大气,青砖墙质朴厚重,檐下构件、中式门窗等关键部位全面应用铝代木仿古构件,以现代工业工艺复刻传统木…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬