查一个游戏战绩、抓一批商品价格、把某个网站每天更新的公告自动存成表格——这些事听起来完全不搭界,但它们背后都是同一个词:Python 爬虫。网上一搜“爬虫”,满屏教程看得人眼花缭乱,但真正能陪你从零跑到出数据的,不多。这篇文章就是一套我从实际使用中沉淀下来的“简单爬虫”玩法:讲清楚爬虫是怎么一回事、你最该先学哪几招、会遇到哪些坑,以及哪些内容碰都不要碰。
适合谁看?零基础想入门 Python 的人、接了个小数据需求却不知道从哪下手的打工人、还有那些被“三行代码抓全网”视频忽悠过又铩羽而归的同学。带上你的电脑,装好 Python,跟着往下走就行。我不会给你画大饼,只保证讲的东西你今晚就能跑起来。
1. 一个“简单爬虫”到底简单在哪:先拆清楚需求再动手
1.1 爬虫的本质:三个动作,仅此而已
把爬虫说得神乎其神的,多半没写过几行正经代码。爬虫的本质就三个动作:把网页拿回来、把内容挑出来、把东西存起来。
第一个动作叫“发请求”,你打开浏览器访问一个网页,本质上就是在向服务器要一堆数据,这堆数据通常是一大段 HTML 文本;第二个动作叫“解析”,就是从这一大段文本里,把你关心的标题、价格、链接抠出来,其他不要的扔掉;第三个动作叫“存储”,把抠出来的东西写进文件、Excel 或者数据库,留作后用。
做个不太恰当的类比:爬虫像一个帮你念书的助手,请求就是把书从书架上拿过来,解析是拿起荧光笔划出重点句,存储是把重点句抄进笔记本。整个过程没有任何魔法,网上那些“一秒抓取全网”的渲染,只是把这三个动作包装得神秘了。
我第一次写爬虫的时候,以为要啃完整本《Python 编程从入门到实践》才能动手。实际上,你只需要知道函数怎么写、列表和字典怎么用、循环怎么跑,就已经具备起步条件了。剩下的都是在这三个动作上叠细节。
1.2 动手之前先回答三个问题,能省三天弯路
很多人卡在做不出爬虫,不是代码写不出来,而是连自己要什么都说不清。我接过的不少私信,张口就是“帮我爬一下这个网站”,我问他爬哪些字段、存什么格式、要多少页,他一个都答不上来。这种需求连神仙都难做。
动手前,请老老实实回答自己三个问题:
- 你要的数据到底是什么?比如“所有文章的标题和发布时间”这就是明确的字段;而“网站所有有用的东西”等于没问。
- 数据从哪来?是页面直接渲染出来的,还是藏在接口里,还是需要登录才能看到,这直接决定你后面用简单请求还是上浏览器自动化。
- 拿到之后放哪儿?输出到屏幕、存成 CSV、写进 Excel、还是塞进数据库,不同存储方式写了不同的代码,但难度差别不大。
把这三个答案写下再上网搜教程,你会发现自己过滤掉了八成用不上的废话。那些搜“python 爬虫查王者战绩”“python 爬虫查抖音数据”的同学,绝大部分不是真的要做通用爬虫,只是有具体问题要解决,先把问题定义好,再去学工具,这才是最快的路径。
1.3 “简单”的分水岭不在代码,在目标网站
同样是爬虫,难度天差地别。抓一个没人维护的个人博客,三步就完事;抓一个套了强风控的电商平台,可能需要逆向加密签名、模拟设备指纹、处理滑块验证码,那已经脱离了“简单”的范畴,属于进阶的爬虫攻防战。
判断一个目标是否“简单”,看三件事:第一,内容是否直接在 HTML 里,右键查看网页源代码能搜到数据就是简单模式;第二,是否需要登录,一登录就得处理会话和 Cookie;第三,是否会因为请求频率异常触发验证码或 IP 封禁。
我建议新手把第一个目标选定为:一个列表页 + 内容直接渲染 + 不需要登录 + 没有验证码的网站。哪怕是自己的博客都行。在这个安全的练手目标上跑通全流程,比去挑战大平台有意义得多。
2. 环境准备从哪一步开始:把 Python 跑起来再说
2.1 装对 Python,配好工作区,别乱整
去 Python 官网下载安装包这件事,光在热搜榜上就能占好几个位子。“python 安装教程”“python 下载安装教程”“linux 系统安装 python”,每天都有人搜,说明这一关真的卡掉了不少人。
几个关键点说清楚。Windows 用户下载安装包后,第一屏一定要勾选“Add Python to PATH”,不勾的话后续在命令行里敲 python 会提示找不到命令,这大概是新手最常遇到的第一个报错。macOS 用户则要注意系统自带的 Python 版本很老,建议通过官网安装包或包管理器装一份新的,不要动系统默认的那一份,避免搞乱系统依赖。Linux 用户多数发行版自带 Python 3,直接命令行验证一下版本就行,缺什么库用 pip 装。
推荐用 VS Code 作为编辑器,不是因为它最强,而是因为它开箱即用、插件丰富、对新手足够友好。PyCharm 功能更全,但启动重、配置杂,等你写复杂项目再换也不迟。装好编辑器后,在项目目录下创建虚拟环境,这一步很多人会跳过,等到依赖冲突的时候才后悔。一行命令:
python -m venv venv激活后,再把 requests 等库装进这个虚拟环境里,不同项目各用各的环境,互相不污染。这个习惯值得从现在就开始养。
2.2 requests 与解析库怎么选:别一上来就装一箩筐
热搜词里“requests 爬虫”常年居高不下,足以说明这个库的地位。requests 是 Python 里最常用的 HTTP 请求库,它把底层的网络连接细节封装得干干净净,你关心的事只剩三件:请求地址是什么、请求头带什么、超时设多少。
解析这块,主流工具有正则、BeautifulSoup4、lxml 三种。我的建议是:新手主攻 BeautifulSoup4,它写起来最像人话,选择器傻瓜化,适合理解“解析”的思维;等熟悉了可以再用 lxml 加速;正则作为一种补充手段,后面遇到提取手机号、邮箱这类简单文本时再补学也不迟。
还有一件重要的事:现阶段别碰 Selenium 和 Playwright。原因后面讲,先把 requests + BeautifulSoup4 的组合练熟。这套组合拳能应付市面上六成以上的静态页面抓取,足够撑起你入门阶段的成就感。
3. 手把手写一个简单爬虫:从一行代码到能存进表格
3.1 第一个目标:抓下一个页面的标题和链接
我拿出一段最朴素的示例代码,解释每一行的用途,你可以替换成任意目标网站来练手。
import requests from bs4 import BeautifulSoup url = "https://example.com/list" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36" } resp = requests.get(url, headers=headers, timeout=10) resp.encoding = "utf-8" if resp.status_code == 200: soup = BeautifulSoup(resp.text, "html.parser") items = soup.select(".post-title a") for item in items: print(item.get_text(strip=True), item.get("href")) else: print("请求失败:", resp.status_code)先说 requests.get 里的三个参数。url 是目标地址,headers 里我故意塞了一个 User-Agent,这行非常关键——很多网站会检查请求是不是来自真实浏览器,不带 UA 的 Python 请求就像大半夜不敲门直接闯进别人家,被拦下来再正常不过。timeout 设成 10 秒,是为了防止请求卡死导致程序无限等待,这类问题排查起来非常反直觉,加个超时能帮你迅速识别网络异常。
resp.encoding 这行是给服务器返回的文本指定编码方式。中文网站如果不手动设置编码,变量里的中文十有八九会变成一串乱码“æ ˆç¨‹”,那场面比报错还让人头疼。响应状态码 200 表示请求成功,如果是 404 或 403,就需要分别排查地址是否正确、请求头是否被拦截。
BeautifulSoup 的 select 方法接收的是 CSS 选择器,.post-title a表示选中所有 class 为 post-title 的节点内部的所有链接标签,这需要你提前打开目标网页的开发者工具看一眼结构。这一步并不难,右键打开“检查”,找到自己要的数据在哪一个标签里,把路径抄回来而已。
3.2 加个翻页循环:从抓一页到抓整个列表
一个页面根本不够看。很多网站的文章列表、商品列表都是分页的,URL 规律也很直白,常见的格式是https://example.com/list?page=2这种。你只需要套一层循环。
import time for page in range(1, 6): url = f"https://example.com/list?page={page}" resp = requests.get(url, headers=headers, timeout=10) # ... 同样的解析逻辑,这里省略 time.sleep(1)注意我在每页之间加了一秒的 time.sleep。这句话的意义不是“让代码慢一点”,而是让自己做一个有礼貌的请求者。服务器不是你一个人的,请求频率过高会把对方的小型站点拖垮,也可能让网站管理员专门写规则把你的 IP 封掉。用生活经验来理解:你家的门铃,一分钟内被同一个快递员按十次,你也会不耐烦。
从单页到多页这个坎,本质上是把“对单次请求的理解”升级成“对批量任务的理解”。翻页之外还能继续延伸出更多变种:有的网站翻页是靠点击“加载更多”触发 Ajax 接口,这时候你要打开开发者工具看网络面板,找到真正返回数据的接口地址,直接请求那个接口而不是去模拟点击;有的网站通过修改 URL 中的参数控制排序和日期范围,原理都是一样的,找到规律,用循环和参数拼接去覆盖所有组合。
3.3 把数据写入 Excel:从“能看”到“能用”
打印在屏幕上只是自嗨,把数据存下来才有价值。热搜词里“python 写入 excel”说明绝大多数人拿到数据后的第一个念头就是放进表格里看。实际上最简单的做法是写 CSV,Excel 可以直接打开它,格式通用。但如果想生成带格式的 Excel 文件,推荐用 pandas 一行导出。
import pandas as pd data = [ {"标题": "文章一", "链接": "https://example.com/post/1"}, {"标题": "文章二", "链接": "https://example.com/post/2"}, ] df = pd.DataFrame(data) df.to_excel("result.xlsx", index=False)是不是很像在列一张表格?pandas 接收一个字典列表,每个字典对应一行,键名就是列名,然后 to_excel 一步落盘。如果抓取的是纯简单数据、不想引入额外依赖,直接用 Python 自带的 csv 模块也能在十行内写完。
我自己的习惯是:先存 CSV 做数据预览,确认字段没抓错之后,再转存成 Excel 做交付。少一步中间检查,就会大概率把脏数据交给下游,后面清洗的工程量比重新抓还大。数据量特别大时还可以考虑 SQLite,它单文件、免安装、查询方便,那是后话。
4. 热词背后的真实需求:从查战绩到抓影视源,到底能不能做
4.1 游戏查战绩这类需求是怎么实现的
热搜词里的“python 爬虫查王者战绩”“steam 爬虫”是最典型的具体需求,它们本质上都不是“爬网页”,而是“调接口”。游戏平台通常会把战绩数据封装成接口,前端页面拿到接口返回的 JSON 数据后渲染出来。
这类需求的正确姿势是:打开游戏官网的战绩查询页面,按 F12 打开开发者工具,切到 Network 面板,刷新一次页面,找到返回 JSON 数据的那个请求,复制它的 URL、请求头和参数,然后在 Python 里用 requests 照猫画虎复现一遍。你只要返回结果是一串可读的 JSON,就说明你成功了。
但这里有一个非常重要的边界要拎清:你只能查询自己账号或用户自己授权公开的信息,不能去批量抓取别人的个人战绩、手机号、地址等数据。游戏的公开战绩可以查,私密的用户画像不能碰。这类技术写出来很简单,难的是克制。
4.2 短视频平台爬虫:为什么教程总在“断更”
“抖音爬虫”“快手爬虫”在搜索榜上热度惊人,但奇怪的是,真正的成品教程总在断更。原因不是大家不知道怎么做,而是这些平台的反爬强度远高于普通网站。
它们通常配备多重防护:请求参数里有加密签名,每次访问都会校验设备信息,行为模式一异常就触发滑块验证码,频率高了直接 IP 封禁。你拿前面那套 requests 简单流程去请求抖音的接口,大概率会得到一个验证码页面或者一串加密报错。网上流传的“三行代码抓抖音”的短视频教程,要么是旧接口失效后的营销素材,要么是把登录后的 Cookie 硬编码在代码里,换个设备就废了。
这是劝退还是劝学?我的看法是,别把它当成入门练习,它属于进阶挑战。先把简单爬虫玩熟,理解反爬的套路之后,再回头解决签名和风控问题,心态会平和很多。同理会话里也出现过“美团爬虫电话”等需求,涉及用户联系方式的数据已经踩到个人隐私的红线了,不管技术上做不做得到,都建议不要碰。
4.3 影视资源爬虫与版权红线
“红果短剧爬虫”“爬虫源影视”这些热词,我见过太多次了。很多人的需求是想做个观影列表、或者把某个平台的剧集信息聚合到自己的小项目里展示。但影视数据和游戏战绩、商品价格完全是两码事——影视作品的版权边界非常敏感,批量抓取盗版影视资源链接用于传播,已经不是“写着玩”而是明确踩线的行为。
我的经验是,简单爬虫可以抓正版平台上公开的剧名、简介、封面等元数据,只要平台允许并且频率合理,这属于公开信息采集;但抓取盗版源的播放地址、维护一个可在线观看的影视站,这是绝对不能碰的领域。翻了车的人,轻则网站关停,重则吃官司,完全得不偿失。
做技术的底线不是“能不能写出来”,而是“该不该这么用”。后面第 6 章我会再展开讲合规的边界。
5. 从简单到进阶:反爬虫、登录态和分布式到底是怎么回事
5.1 网站常见的反爬套路和应对思路
你在爬别人,别人也在想方设法防你。入门阶段遇到的反爬大概有四类:
- User-Agent 检测:认出非浏览器请求,直接拒绝。应对就是伪装 UA,这是最简单的一层,带上浏览器指纹就能过去。
- 请求频率限制:同一 IP 短时间请求过多,触发频率告警。应对思路很简单——降低频率、加延时,别做那个讨厌的快递员。
- 登录态验证:需要登录才能看到内容。应对需要处理 Cookie,用 requests.Session 保持会话,先走一次登录流程把凭证挂上。
- JavaScript 动态渲染:数据不存在于 HTML 里,而是页面加载后由脚本写入。requests 拿回来的 HTML 是空的,那就绕不开浏览器自动化工具。
此外还有一类更强硬的防护,在知名 CDN 服务商的防御体系里很常见,包括 TLS 指纹校验、浏览器环境检测、验证码挑战等,属于硬骨头。这类目标对“简单爬虫”来说已经不是练手项目,与其硬啃,不如先去瞧瞧对方有没有开放官方 API,正规渠道永远比逆向省力。
5.2 什么时候才轮得到 Selenium 这类浏览器自动化
热搜词里有一句“python selenium 反爬虫”,很多人以为 Selenium 是反爬的,其实它是用来穿透动态渲染的。它的思路简单粗暴:直接驱动一个真实浏览器,让浏览器去加载页面、执行脚本、渲染出完整内容,你的代码再从浏览器里把数据取出来。
听起来很美,代价是速度和资源。一个浏览器实例要吃掉几百兆内存,跑起来远不如 requests 直接请求那么轻快;而且模拟浏览器的行为和真实用户还是有细微差别,强风控网站依然能识别出来。所谓“反爬虫”,其实是网站在反 Selenium 这类自动化工具被用作爬虫手段。
我的决策顺序是这样的:先试 requests,看到 HTML 里缺数据才怀疑动态渲染;再用开发者工具找接口,能直接请求接口就优先直接请求;只有接口找不到、数据又全靠脚本渲染时才启用 Selenium 或 Playwright 这类浏览器方案。永远不要拿重武器打蚊子。
5.3 爬虫逆向与分布式:进阶方向要花多少精力
“爬虫逆向”是很多人的终极向往,因为学会了它,很多高难度目标才有解。它的本质是拆解前端 JavaScript 代码,搞明白网站把参数加密了哪些、用什么算法生成的签名,然后在 Python 里重新实现一遍加密过程。这要求你懂 JavaScript、懂浏览器调试工具、肯一行一行读混淆过的代码,时间成本相当高。
“分布式爬虫”则是另一个方向,解决的是单机跑不动、效率不够的问题。思路是把任务拆散到多台机器,中间用 Redis 队列协调调度。这更像一套工程体系,涉及部署、监控、反冲突,适合企业级数据采集,个人开发者日常根本用不上。
这两个词都不是“简单爬虫”该操心的事。我给的建议是一步一个脚印:先把 requests 玩到熟,再把浏览器自动化玩到熟,期间积累面对动态站点的解决思路,等到自然需要规模化和逆向时再去补,那才是水到渠成。
6. 常见问题与避坑经验:这些坑我替你先踩了
6.1 新手最容易遇到的五个问题速查
写爬虫的人,没有一个不踩坑的。我把自己和身边人踩过的高频问题整理成了一个速查表,每个问题都有对应的排查顺序。
| 问题 | 现象 | 排查思路 | 建议方案 |
|---|---|---|---|
| 中文乱码 | 抓回来全是“æ”之类的符号 | 响应编码没有正确设置 | 在请求后设置 resp.encoding = "utf-8",或在解析时对soup内容做编码探测 |
| 拿不到数据 | 返回 200 但 HTML 里没有目标内容 | 页面可能是动态渲染,或数据在接口里 | 检查响应文本是否过短,用浏览器开发者工具找真实请求地址 |
| 被识别封禁 | 请求几次后被拒或弹出验证码 | 请求头信息太单调,或者频率过高 | 带上完整浏览器 UA 和常用请求头,增加 sleep 间隔,避免循环内一次性发大量请求 |
| 解析结果为空 | select 匹配不到任何标签 | 看不到页面上确实存在的元素 | 先打印一小段响应文本确认结构,检查 CSS 选择器是否写得对,注意空格和层级 |
| 数据不完整 | 拿到表格但缺列少行 | 网页本身是分块加载的 | 检查是否有延迟加载或懒加载,逐个请求对应接口再合并 |
这张表也对应了热搜词里的“python 画图横坐标太密集”这种现象级问题——数据拿到了,展示不对,往往不是爬虫的锅,而是你自己对数据缺乏整理。爬虫只是起点,数据处理技能同样重要。
6.2 几个红线问题,一定不能碰
技术没有善恶,但用法有。写爬虫的人,脑子里必须有一根弦。我见过太多“好哥们儿”在接单群里刷着“爬虫接单一年收入”的截图,也见过有人一时手痒把“cc 攻击源码”反复折腾——后者已经是明确的违法工具,任何人拿它攻击他人系统,都已涉嫌违法犯罪,正规的技术社区见到这类内容只有一种处理方式:举报,拉黑,没有任何商量余地。
除此之外,务必远离这几件事:
- 批量爬取个人隐私信息,比如手机号、地址、身份证号,不管目的是什么,出事的概率和代价都非常高。
- 抓取并传播有版权保护的内容,像影视作品、付费课程的内部资料、数据库的商业信息,版权方有充分理由追责。
- 倒卖数据。哪怕数据本身是公开的,规模化采集后转手牟利,也容易触碰法律红线。
我个人的判断标准很简单:假设这个数据被公开报道出“某某用爬虫干了什么”,如果我会心虚,那就坚决不做。
6.3 效率与敬畏:给“简单爬虫”一个合适的定位
“简单爬虫”的价值不在于替代大型采集系统,而在于帮你快速解决“手工重复劳动”的问题。每天手动从几个信息源复制内容粘贴到表格里,这种工作用爬虫替换掉,省下来的时间和心力很可观。
但别忘了,爬虫只是获取数据的技术手段,它不能代替你做判断、分析和决策。我在实际使用中最强烈的体会是:抓数据容易,把数据变成有用的信息难。不要沉迷在“又突破了一个反爬”的快感里,多想想抓下来的东西怎么消化。技术是工具,目标才是方向。
最后再说几句实在话
我在实际使用中反复经历同一个循环:写一个爬虫,跑得挺美,第二天网站改版,代码全废。简单爬虫的特点就是脆弱,它依赖网页结构,结构一变就崩。所以不要指望一套代码吃到老,维护的成本永远比开发的成本高,设计时尽量把请求、解析、存储三个环节拆开,改一处不影响其他。
另外,个别小技巧后你会发现,最简单粗暴的入门路径就是:找个目标,开始抓,遇到问题搜报错,解决了继续抓。我带过不少新人,那些学得最快的人不是看教程最多的,而是第一个动手写出来的人。拿这套思路去替换掉你每天手工复制粘贴的工作,你会立刻体会到什么叫省事。
技术问题从来不是爬虫的门槛,“不知道该做什么”才是。把目标定小一点,跑通一个再说,这个内容后续还可以扩展到定时抓取、数据可视化、甚至部署成一个小服务——那又是另一条路了,等你跑通再说。