ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python简单爬虫入门实战:从抓取网页到存入Excel

Python简单爬虫入门实战:从抓取网页到存入Excel 查一个游戏战绩、抓一批商品价格、把某个网站每天更新的公告自动存成表格——这些事听起来完全不搭界但它们背后都是同一个词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, headersheaders, timeout10) 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(stripTrue), 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?page2这种。你只需要套一层循环。import time for page in range(1, 6): url fhttps://example.com/list?page{page} resp requests.get(url, headersheaders, timeout10) # ... 同样的解析逻辑这里省略 time.sleep(1)注意我在每页之间加了一秒的 time.sleep。这句话的意义不是“让代码慢一点”而是让自己做一个有礼貌的请求者。服务器不是你一个人的请求频率过高会把对方的小型站点拖垮也可能让网站管理员专门写规则把你的 IP 封掉。用生活经验来理解你家的门铃一分钟内被同一个快递员按十次你也会不耐烦。从单页到多页这个坎本质上是把“对单次请求的理解”升级成“对批量任务的理解”。翻页之外还能继续延伸出更多变种有的网站翻页是靠点击“加载更多”触发 Ajax 接口这时候你要打开开发者工具看网络面板找到真正返回数据的接口地址直接请求那个接口而不是去模拟点击有的网站通过修改 URL 中的参数控制排序和日期范围原理都是一样的找到规律用循环和参数拼接去覆盖所有组合。3.3 把数据写入 Excel从“能看”到“能用”打印在屏幕上只是自嗨把数据存下来才有价值。热搜词里“python 写入 excel”说明绝大多数人拿到数据后的第一个念头就是放进表格里看。实际上最简单的做法是写 CSVExcel 可以直接打开它格式通用。但如果想生成带格式的 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, indexFalse)是不是很像在列一张表格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 效率与敬畏给“简单爬虫”一个合适的定位“简单爬虫”的价值不在于替代大型采集系统而在于帮你快速解决“手工重复劳动”的问题。每天手动从几个信息源复制内容粘贴到表格里这种工作用爬虫替换掉省下来的时间和心力很可观。但别忘了爬虫只是获取数据的技术手段它不能代替你做判断、分析和决策。我在实际使用中最强烈的体会是抓数据容易把数据变成有用的信息难。不要沉迷在“又突破了一个反爬”的快感里多想想抓下来的东西怎么消化。技术是工具目标才是方向。最后再说几句实在话我在实际使用中反复经历同一个循环写一个爬虫跑得挺美第二天网站改版代码全废。简单爬虫的特点就是脆弱它依赖网页结构结构一变就崩。所以不要指望一套代码吃到老维护的成本永远比开发的成本高设计时尽量把请求、解析、存储三个环节拆开改一处不影响其他。另外个别小技巧后你会发现最简单粗暴的入门路径就是找个目标开始抓遇到问题搜报错解决了继续抓。我带过不少新人那些学得最快的人不是看教程最多的而是第一个动手写出来的人。拿这套思路去替换掉你每天手工复制粘贴的工作你会立刻体会到什么叫省事。技术问题从来不是爬虫的门槛“不知道该做什么”才是。把目标定小一点跑通一个再说这个内容后续还可以扩展到定时抓取、数据可视化、甚至部署成一个小服务——那又是另一条路了等你跑通再说。
返回列表