零基础Python爬虫实战:requests+BeautifulSoup抓取网页数据

发布时间:2026/10/12 15:17:13
零基础Python爬虫实战:requests+BeautifulSoup抓取网页数据
很多人一听到“Python 爬虫零基础入门”第一反应就是“这肯定是写给程序员看的”。其实真没这么吓人。我当初也是被“爬虫必须会正则、必须懂框架、必须研究各种反爬”这些说法劝退过好几回后来被一个项目逼着上手硬着头皮写通了才发现一个最简单的爬虫核心流程总共就四步——请求网页、拿到 HTML、解析数据、存下来。这篇文章就按我当年踩坑的顺序手把手带你把一个完整的入门项目跑通。这次实战的目标很朴素从一个公开的书籍演示站抓取书名和价格保存成文件。它非常适合零基础的同学因为不用登录、不用处理复杂接口、数据也整整齐齐就是天然给爬虫学习者练手用的。你只需要有 Python 的基础环境甚至语法没学完也没关系代码直接复制就能跑每一步我还会解释“为什么这么写”。等这一趟走完你再看网页就不会只看到内容了而是能看到结构。1. 爬虫到底是干嘛的先想清楚3件事再动手1.1 爬虫的本质就是“让电脑替你复制粘贴”我知道很多人把爬虫想得很神秘好像是什么了不起的黑科技。其实用大白话讲爬虫就是把你手动浏览网页时重复做的事情自动化。你想要一本一本书的信息手动操作是什么流程打开页面、看标题、看价格、记下来、翻下一页、再看、再记……重复一百次你就疯了。爬虫做的事一模一样只是把“打开页面”变成“发送请求”“看标题”变成“解析 HTML”“记下来”变成“写文件”。本质没有区别就是替你做苦力只不过它一小时能干完你一天的活。所以我把爬虫拆成三个核心环节你记不住任何专业名词都行记住这三个词就够了请求让程序去访问一个网址把网页内容拿回来。解析从拿回来的内容里把真正有用的信息挑出来。存储把挑出来的数据保存成文件方便后续使用。后面所有内容都是围绕这三个环节展开的。好消息是Python 对这三件事的支持都极其成熟每步都有现成的库不需要你自己从零造轮子。1.2 动手前必须确认的三件事爬虫写起来不难难的是写之前有没有想清楚。我见过很多新手上来就找代码抄结果抄完一运行直接报错根本不知道从哪改起。原因就是没想清楚下面这三个问题要抓什么是标题、价格、链接还是评论内容目标越具体代码越简单。模糊的目标等于写不出来。去哪抓网址是什么数据是直接藏在网页源代码里还是需要滚动页面才加载出来入门阶段只适合处理前者数据直接在 HTML 里那种。能不能抓这也是很多教程不会一上来就告诉你的。爬虫的底线是只抓公开数据、不碰隐私信息、不影响对方网站的正常运行。建议大家先看一眼网站的robots.txt就能大致了解站点的抓取规则再把请求频率控制住别一秒打几十个请求把人家服务器搞崩。我给你的建议是第一个项目一定选静态网页也就是数据在网页源代码里直接能看到的那种。动态加载页面涉及接口分析那是后面才需要考虑的进阶内容。1.3 零基础需要什么基础才能开爬很多人卡在心理门槛上总觉得“我 Python 还没学完肯定看不懂”。我把话放这儿只要你会三件事就能玩转入门爬虫——理解变量、会用 for 循环、能看懂 if 判断。就这三个真的。至于函数、类、装饰器这些东西遇到再查就行不需要提前学完。我当年学爬虫的时候连列表推导式都用不利索照样把项目跑通了。爬虫是典型的“边写边学”领域你在实战中遇到什么不会的针对性补一下比系统性啃语法书高效得多。2. 装环境和工具这一步卡住一半的新手2.1 安装 Python 时最容易踩的坑就是那一个勾选框我不夸张地说当年群里十个新手问“为什么我的 python 命令不好使”九个都是同一个原因安装时没勾 “Add Python to PATH”。这是 Python 官方安装包里的一个选项默认不勾很多人一路 Next 就完事了结果在命令行里输python直接提示找不到命令。所以安装时记住一件事第一步就勾上 “Add Python to PATH”再点 Install Now。如果你已经装完了也没关系后面 Python 的一些集成工具能帮你绕过命令行环境的问题但最好还是重装一次省得后面别扭。装完验证的方式是打开命令行Windows 下是 CMD 或 PowerShellmacOS/Linux 是终端输入python --version如果显示Python 3.x.x说明成功了。2.2 用 venv 建一个干净好用的环境新手最容易忽略环境管理直接全局乱装包。我刚开始也这么干结果后来项目多了各种包冲突卸载重装折腾了整整一下午。所以这一步别省。Python 自带venv模块能帮你给每个项目开一个独立的小房间里面装的包互不干扰。操作非常简单在项目文件夹下执行python -m venv venv然后激活它Windowsvenv\Scripts\activatemacOS / Linuxsource venv/bin/activate激活后你在命令行前头会看到(venv)的标志这说明当前所有pip install都只装在这个项目里干净利落。等哪天项目不要了直接把文件夹删掉就行系统不会留下任何垃圾。2.3 安装两个入门必备库这次实战核心只需要两个库requests发请求和beautifulsoup4解析网页。在激活了 venv 的环境下执行pip install requests beautifulsoup4如果下载速度慢可以临时加一个国内镜像源比如用清华源速度会快很多pip install requests beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple这里解释一下为什么选这两兄弟requests是 Python 生态里最友好的 HTTP 库代码写起来跟人话似的beautifulsoup4则专门用来从 HTML 里提取信息对新手非常友好。框架类的工具比如后面你可能会听说的 Scrapy暂时先别碰等这套流程跑熟了你自然会有判断。2.4 写 3 行代码验证环境通不通装完先别急着开干写个极简脚本确认一切正常。新建一个 Python 文件比如test.py输入import requests r requests.get(https://books.toscrape.com/) print(r.status_code)运行python test.py如果输出200恭喜你环境没问题爬虫的大门已经打开了。如果报错绝大多数情况是没激活 venv检查一下命令行前面有没(venv)标志。3. 第一个爬虫三步拿回网页源代码3.1 最小可运行代码长这样第一个目标很简单把网页的 HTML 源代码拿回来打印出来。不要想复杂了整个逻辑就三行核心代码import requests url https://books.toscrape.com/ r requests.get(url, timeout10) print(r.status_code) print(r.text[:1000])r.text就是服务器返回的网页源代码。打印前 1000 个字符是为了快速确认内容形态避免刷屏。这里再说说timeout10的作用给请求设一个等待上限10 秒内没响应就放弃。没有这个参数的话遇到反应慢的服务器程序会一直傻等看起来像卡死了。新手第一课就要养成这个好习惯。3.2 状态码速查表先学会读懂服务器的回应很多人看到数字就慌其实状态码是服务器在主动跟你交流。常用的就这几个状态码含义新手行动建议200请求成功一切正常继续解析网页404页面不存在检查网址是否写错403服务器拒绝访问多半是没伪装 User-Agent看下一节418服务器跟你开玩笑说“我是茶壶”典型反爬拦截比 403 更直白429请求太频繁被限流放慢请求速度加延时503服务暂时不可用可能被反爬了或网站在维护入门阶段你只要记住200 才代表成功其他要么改代码要么查网络都不是你继续往下走该有的状态。3.3 为什么必须加 User-Agent不装像人一步到位你把上面的代码拿去找别的网站试试很可能直接返回 403。原因很简单requests发出去的请求头里默认写着User-Agent: python-requests/x.x.x服务器一看就知道“你是爬虫”直接拦。打个比方你去别人家里穿的快递员制服主人可能警惕你穿得像个普通朋友才不会被拒之门外。User-Agent 就是你的“外套”把它换成浏览器的样子绝大部分基础反爬就绕过去了。改法是在请求时带上headers参数import requests 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 } url https://books.toscrape.com/ r requests.get(url, headersheaders, timeout10) print(r.status_code)这是我实战里最常用的一招也真的是最有效的一招。很多新手一遇到 403 就想着上多复杂的工具其实先检查一下是不是没加浏览器标识解决问题往往只需要这一行。4. 提取数据不靠肉眼用 BeautifulSoup 按格子取数据4.1 为什么不建议新手直接学正则搜爬虫教程你会看到大量人在用正则表达式提取信息。正则当然强大但它的学习曲线对新手极不友好一眼看去全是.*?和\d很容易劝退。我的建议是入门阶段用 BeautifulSoup把页面当成可以按格子取东西的表格。它允许你通过标签和类名定位元素思路非常直观。等你写多了、遇到特殊字符和嵌套结构复杂的场景再补正则也不迟。爬虫路上没有“必须学什么”的执念只有“够用就行”的务实。4.2 先学会用浏览器找到你要的“格子”BeautifulSoup 的用法特别贴近人的直觉核心就两个动作find找第一个、find_all找所有。但前提是你得知道数据在网页源码里的位置。这里教大家一个终身受用的技巧用浏览器的“检查”功能。打开目标网页鼠标右键点击你想抓的数据比如书名选择“检查”或“Inspect”右侧会弹出开发者工具并自动定位到对应的 HTML 代码上。你会看到类似这样的结构article classproduct_pod h3a titleA Light in the Attic hrefcatalogue/a-light-in-the-attic_1000/index.htmlA Light in the Attic/a/h3 p classprice_color£51.77/p /article这就是你要的“格子”一本一本书都放在article classproduct_pod这个标签里。用 BeautifulSoup 把它挑出来再从中找书名和价格就行了。4.3 单本书的提取写法继续用我们已经拿到的r.text交给 BeautifulSoup 去解析from bs4 import BeautifulSoup soup BeautifulSoup(r.text, html.parser) # 找到第一个商品格子 book soup.find(article, class_product_pod) # 书名在 a 标签的 title 属性里 title book.h3.a[title] # 价格在 class 为 price_color 的 p 标签文本里 price book.find(p, class_price_color).text print(title, price)注意这里有个细节书名并不是直接写在a的文本里而是存在它的title属性中所以要用[title]去取。这就是“检查元素”的重要性——不亲自看 HTML 结构你根本猜不到数据藏在哪。4.4 进阶到整页用 for 循环把 20 本书全部拿下单本拿下来了整页也不过是加个循环的事import requests from bs4 import BeautifulSoup 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 } url https://books.toscrape.com/ r requests.get(url, headersheaders, timeout10) soup BeautifulSoup(r.text, html.parser) books soup.find_all(article, class_product_pod) for book in books: title book.h3.a[title] price book.find(p, class_price_color).text print(title, price)跑一下你就能看到第一页 20 本书的书名和价格全部打印出来了。到这一步最核心的三个环节你已经打通了请求拿到 HTML解析找到了数据循环处理了多个条目。后面所有东西都是在这个骨架上加肉。5. 实战最常翻车的4个地方反爬、乱码与容错5.1 403 拦截不只加一次 User-Agent 就算完前面说你加了 User-Agent 就能解决大多数 403但遇到更精明的网站同一个浏览器标识反复用也会被怀疑。这时候可以准备一个小“用户代理池”每次随机挑一个import random user_agents [ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, ] headers {User-Agent: random.choice(user_agents)}当然这只是入门应对思路。真正的反爬对抗很复杂但你在零基础阶段不需要深陷进去。记住一个简单原则如果网站不让你抓最稳妥的做法是退一步换个公开的数据源练习。很多新手栽跟头不是技术不行是选错了靶子。5.2 请求越频繁死得越快延时是你的护身符新手抓到数据后很容易兴奋立刻写个循环把网站几十个页面刷得飞快。结果往往是用不了几分钟IP 就被悄悄封锁了。这在爬虫圈几乎是人人都经历过的教训。我自己的看法是爬虫跟做人一个道理——人家开门做生意你去了自觉排队交钱别把摊子掀了。对目标网站保持礼貌本质也是保护自己的爬虫能长期稳定运行。解决方式就是让每次请求之间随机停一下import time import random for page in range(3): # 模拟真实操作间隔 time.sleep(random.uniform(1, 3)) print(f抓取第 {page 1} 页)注意是随机延时不要固定写死成 2 秒带节奏那样程序化痕迹太明显。5.3 页面结构一变程序就崩用异常处理接住意外爬虫跑得正欢突然报错是新手最容易慌的时刻。比如网络闪断、某本书缺少价格标签、页面结构改版……你需要给代码穿上“防弹衣”。最简单的处理是try...except。我们把提取单本书的逻辑放进一个函数遇到问题就跳过这本不让整个程序崩溃import requests from bs4 import BeautifulSoup headers {User-Agent: Mozilla/5.0 ...} url https://books.toscrape.com/ try: r requests.get(url, headersheaders, timeout10) r.raise_for_status() # 状态码不是 200 时主动抛出异常 except requests.exceptions.RequestException as e: print(请求失败, e) else: soup BeautifulSoup(r.text, html.parser) books soup.find_all(article, class_product_pod) for book in books: try: title book.h3.a[title] price book.find(p, class_price_color).text print(title, price) except AttributeError: print(跳过一条数据页面结构可能变了)这样即便有个别条目解析失败也只是跳过它程序继续跑完剩下的活。对于入门项目来说这个容错水平已经非常够用了。5.4 中文乱码问题一招止损另一个高频坑是打印结果里中文变成乱码。原因通常是网页编码和 Python 默认编码不一致。requests的r.text通常会自动猜编码但猜的时候也可能猜错。最省心的处理方式是用r.apparent_encoding强制纠正r requests.get(url, headersheaders, timeout10) r.encoding r.apparent_encoding这一行放在拿到响应之后、读取r.text之前就行。如果你遇到的是英文站可能感觉不到差别一旦切换到中文网页这行代码往往能救命。5.5 合规底线这些事新手一定要知道这里想多说几句因为爬虫界翻车的新闻不少但绝大多数翻车原因都是“越界”。说几条我给自己定的规矩也建议你照着办只爬公开的、允许访问的数据需要登录才能看的内容不要动。遵守网站的 robots 协议在站点域名后面加上/robots.txt就能看到它对爬虫的态度。降低请求频率比起“能爬到”更要考虑“能不能一直爬”。不抓取任何个人隐私数据这个没有商量余地。抓到的数据只用于学习或正当用途不要二次倒卖。咱们今天用的书籍演示站本身就是设计用来给爬虫学习者演练的数据公开、结构规整是最安全友好的练手靶场。6. 把数据落盘CSV 和 Excel 两种方式一次讲清6.1 标准库 csv最朴素的保存方式数据打印出来不算完能保存成文件才算真正“拿到数据”。先讲 Python 自带的标准库方案不需要额外安装任何东西import csv with open(books.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([书名, 价格]) writer.writerow([A Light in the Attic, £51.77])这里有两个新手特别容易踩的点先说清楚newline必须写否则行与行之间会多出空行这是 Windows 平台的老毛病。encodingutf-8-sig必须用普通utf-8存出来的 CSV 用 Excel 打开会乱码加-sig是为了让 Excel 正确识别编码。6.2 想一键存 Excel用 pandas 偷懒如果你觉得用标准库逐行写入太繁琐或者后续可能要对数据做分析直接用pandas更省事。先安装pip install pandas openpyxl然后这段代码就把整个结构化数据一步导出了import pandas as pd data [ {书名: A Light in the Attic, 价格: £51.77}, {书名: Tipping the Velvet, 价格: £53.74}, ] df pd.DataFrame(data) df.to_excel(books.xlsx, indexFalse)pandas不擅长的地方是网络请求、HTML 解析这些“前端”工作它强在拿到一堆结构化数据后的处理和落盘。所以我们的分工很清晰requestsBeautifulSoup负责抓数据pandas负责存储和整理。6.3 完整闭环 Demo抓整页书名和价格存成 CSV把所有环节拼起来就是下面这个完整可运行的脚本。目标抓取书籍演示站第一页所有书名和价格存进 CSVimport csv import requests from bs4 import BeautifulSoup 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 } url https://books.toscrape.com/ r requests.get(url, headersheaders, timeout10) soup BeautifulSoup(r.text, html.parser) books soup.find_all(article, class_product_pod) with open(books.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([书名, 价格]) for book in books: title book.h3.a[title] price book.find(p, class_price_color).text writer.writerow([title, price]) print(保存完成共, len(books), 条数据)运行完项目文件夹里会出现一个books.csv用 Excel 打开就能看到整整齐齐的书名和价格表。到这一步你已经完成了一个真正意义上的爬虫项目——虽然代码很基础但“请求、解析、存储”三件套已经完整闭环。7. 入门之后往哪走三个方向帮你续命7.1 遇到动态加载页面先别慌练会“找接口”手感就顺了静态页面爬完了你迟早会碰到那种“网页源代码里啥都没有内容却显示出来了”的网站。原因是内容不是服务器一开始就返回的而是页面加载后通过接口动态获取的。这时候别急着研究什么无头浏览器最简单的路是打开浏览器开发者工具切到“网络”或“Network”面板勾上 XHR 过滤条件刷新页面观察哪些请求返回了数据。大多数网站用的是 JSON 接口拿到接口后直接用requests请求它再解析 JSON比解析 HTML 还快。有的接口甚至就在 HTML 底部的script标签里以 JSON 格式预埋着找到之后提取难度很低。这条路一通你能爬的网站数量直接翻好几倍。7.2 什么阶段学 Scrapy别拿框架当救命稻草很多人入门爬虫没两天就急着去学 Scrapy 这种重量级框架。我的意见很明确至少先用 requests 手写五个以上的小项目再考虑框架。道理很简单框架是帮你把重复工作打包好的工具但你得先亲手做过这些重复工作才知道框架封装了什么、有什么意义。一上来就学框架很容易变成“会调 API 但不懂原理”遇到问题完全没有排查头绪。爬虫调试能力恰恰是在手写代码的过程中练出来的。7.3 我见过的大多数新手都死在哪儿这些年看到很多零基础同学学爬虫真正劝退他们的往往不是技术难度而是节奏问题。第一关环境没装好就弃坑了。所以这篇文章把环境准备放在了很靠前的位置这一关迈过去后面都是坦途。第二关被一次 403 吓退了。其实很多时候就只是缺一个 User-Agent或者在请求之间加几秒延时。你以为的天大难题老手眼里就是一行代码的事。第三关直接抄别人的代码从不自己看网页结构。代码能跑但一换网站就抓瞎。爬虫的核心能力其实是“看页面、猜结构、试选择器”这是抄不来的只能自己动手查元素练出来。我自己练爬虫时养成过一个特别笨但有效的小习惯每次只给自己定一个极小的目标比如“把这个网站所有书名抓下来”“把每个页面的下一页链接提取出来”。完成了就收工绝不贪多。目标驱动比系统学习更容易坚持也更容易积累小胜利。爬虫这条路走通之后你会发现自己看网页的视角彻底变了别人看到的是内容你看到的是结构、接口和数据结构。这种感觉还挺上头的去把第一份数据抓下来试试吧。