不要任何基础,2小时速通Python爬虫!专为0基础小白打造的Python爬虫教程
你是不是经常看到别人用Python爬虫轻松获取数据,自己却觉得门槛太高?或者尝试过几次,总是在环境配置、代码报错、反爬虫机制面前败下阵来?今天这篇文章,我要告诉你一个事实:Python爬虫的核心逻辑,远比大多数人想象的要简单。你不需要精通计算机网络,也不需要理解复杂的异步编程,更不需要被那些“从入门到放弃”的教程吓退。
这篇文章的目标很明确:让一个完全零基础的小白,在2小时内,真正理解爬虫是什么、能做什么,并且亲手运行第一个能工作的爬虫脚本。我不会讲那些华而不实的理论,也不会堆砌一堆你暂时用不上的高级库。我们将从一个最核心、最经典的“请求-解析-存储”流程出发,用最少的代码,解决最实际的问题——从网页上抓取你需要的信息。
读完这篇文章,你将彻底搞懂:
- 爬虫的本质是什么?它和你手动复制粘贴有什么区别?
- 零基础需要准备什么?如何用最简单的方式搭建Python环境。
- 爬虫的核心三步走:如何发送请求、如何解析网页、如何保存数据。
- 第一个实战项目:爬取一个公开的、无反爬的网站(比如豆瓣电影Top250),并保存到Excel。
- 你会遇到哪些“坑”?以及如何用最基础的方法绕过它们。
我们开始吧。
1. 这篇文章真正要解决的问题:为什么你学不会爬虫?
很多新手学爬虫失败,不是因为笨,而是因为教程的起点错了。他们一上来就让你学urllib、asyncio、Scrapy框架,讲HTTP状态码、User-Agent、Cookie池。这些知识重要吗?重要。但对零基础的你来说,它们就像还没学会走路,就被要求理解空气动力学去跑步。
爬虫最核心的思维,其实是“模拟浏览器访问 + 提取规律信息”。你平时怎么在浏览器里看网页?输入网址 -> 浏览器请求 -> 服务器返回HTML -> 浏览器渲染成你看到的图文。爬虫就是把这个过程自动化:用代码代替你输入网址,用代码接收服务器返回的HTML,再用代码从这一大堆“源代码”里,把你想要的那部分文字、链接、图片地址“抠”出来。
所以,零基础学爬虫,第一步不是学复杂的库,而是建立这个“模拟-提取”的思维模型。一旦这个模型建立起来,后面所有的技术细节,都是为了解决这个模型在实际运行中遇到的具体问题,比如“网站不让我模拟了怎么办?”(反爬虫)、“网页加载太慢了怎么办?”(异步)、“数据太多了怎么办?”(框架和分布式)。
本文将严格遵循这个思路,先带你用最基础的库(requests和BeautifulSoup)跑通整个核心流程,建立信心。在这个过程中,你会自然遇到一些初级“坑”,我们再一一解决。这样学,路径最短,成就感最强。
2. 基础概念与核心原理
在动手之前,我们用3分钟把几个最关键的概念说清楚。放心,没有任何难懂的术语。
2.1 什么是爬虫?
爬虫(Web Crawler/Spider),就是一段自动访问互联网网页并抓取数据的程序。你可以把它想象成一个不知疲倦的、速度极快的“复制粘贴机器人”。
- 手动操作:你打开浏览器 -> 访问豆瓣电影Top250页面 -> 用眼睛找到电影名 -> 打开Excel -> 手动输入。
- 爬虫操作:你写一段代码 -> 代码自动访问豆瓣电影Top250页面 -> 自动从网页代码里找到所有电影名的位置 -> 自动把所有名字保存到一个文件里。
2.2 爬虫的基本工作流程(核心三步走)
这是本文的基石,务必理解:
- 发送请求(Request):你的程序向目标网站的服务器说:“喂,把某某网页的内容发给我”。这就像你在浏览器地址栏输入网址后敲回车。
- 获取响应(Response):网站服务器收到请求后,会把网页的“源代码”(主要是HTML格式)打包好,发回给你的程序。这就像浏览器收到了网页数据。
- 解析与存储(Parse & Save):你的程序拿到这堆“源代码”(它是一堆包含各种标签的文本,对人来说很乱,但对程序来说有规律可循),然后从中提取出你需要的信息(如电影名、评分、链接),最后把这些信息保存到文件(如TXT、CSV、Excel)或数据库里。
整个过程的核心是找到规律。你要告诉程序:电影名在源代码里,是被<span class="title">和</span>这样的标签包起来的。程序的工作就是找到所有这样的标签,并把里面的文字拿出来。
2.3 我们将要使用的“武器”
为了让第一步尽可能简单,我们选择Python社区最流行、最易用的两个库:
requests:专门用于“发送请求”和“获取响应”。它用起来比Python自带的urllib简单十倍,一句话就能搞定网页下载。BeautifulSoup(简称bs4):专门用于“解析”HTML/XML文档。它提供了一套非常直观的方法,让你能像点名一样,通过标签名、属性值来找到你想要的数据。
它们的组合,是Python爬虫入门公认的“黄金搭档”。
3. 环境准备与前置条件
“工欲善其事,必先利其器”。搭建环境是很多新手的第一个拦路虎,我们用一个最稳妥、最通用的方案。
3.1 安装Python
如果你还没有安装Python,请按以下步骤操作:
- 访问官网:打开浏览器,访问 python.org 。
- 下载安装包:点击 “Downloads”,选择你的操作系统(Windows/macOS/Linux)。对于Windows用户,务必记得在安装时勾选 “Add Python to PATH” 这个选项!这是避免后续在命令行中找不到
python命令的关键。 - 验证安装:安装完成后,打开“命令提示符”(Windows)或“终端”(macOS/Linux)。输入以下命令并按回车:
如果显示类似python --versionPython 3.8.10的版本信息,说明安装成功。如果提示“不是内部或外部命令”,请重新安装并确认勾选了“Add Python to PATH”。
3.2 安装必要的库
我们将使用pip(Python的包管理工具)来安装requests和beautifulsoup4。同样在命令行中,依次输入以下两条命令并执行:
pip install requests pip install beautifulsoup4注意:如果速度慢或失败,可以使用国内镜像源加速,例如:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple pip install beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple安装成功后,环境就准备好了。你可以关闭命令行窗口了。
3.3 选择你的代码编辑器
写代码需要一个文本编辑器。你可以使用任何你喜欢的,比如:
- VSCode:免费、强大、插件丰富,推荐新手使用。
- PyCharm Community:专门为Python设计的IDE,功能齐全。
- 记事本/文本编辑:也可以,但不方便调试。
本文的代码示例将保持最大的兼容性,你可以在任何编辑器中编写并运行。
4. 核心流程拆解:从零编写第一个爬虫
现在,我们正式进入实战环节。我们将爬取一个非常适合练手的公开网站:豆瓣电影Top250。这个网站结构清晰,没有复杂的反爬机制,是学习爬虫的经典目标。
我们的目标是:爬取第一页的25部电影的名称、评分和详情页链接。
4.1 第一步:观察目标与分析网页结构(关键!)
在写代码之前,我们必须先“人肉”观察一下网页。这是爬虫成功与否的决定性步骤。
- 用浏览器打开 豆瓣电影Top250 。
- 在页面上右键 -> 检查(或按F12),打开“开发者工具”。
- 点击开发者工具左上角的箭头图标(或按Ctrl+Shift+C),然后将鼠标移动到网页中的任意一个电影条目(比如“肖申克的救赎”)上并点击。
- 此时,开发者工具会自动定位到显示这部电影信息的HTML代码区域。
你会发现规律:每一个电影条目都包裹在一个<div class="item">的标签里。在这个div内部:
- 电影名位于
<span class="title">标签内。 - 评分位于
<span class="rating_num">标签内。 - 详情页链接位于
<a href="...">标签的href属性中。
我们的任务就是写代码,让程序自动找到所有class="item"的div,然后在每个div里,分别提取出上述信息。
4.2 第二步:发送请求,获取网页源代码
打开你的代码编辑器,新建一个文件,命名为douban_spider.py。
首先,我们要导入刚才安装的库,然后用requests去获取网页内容。
# douban_spider.py import requests from bs4 import BeautifulSoup # 1. 定义目标URL(豆瓣电影Top250第一页) url = 'https://movie.douban.com/top250' # 2. 定义一个请求头,这是为了让自己看起来更像一个“浏览器”,避免被最简单的反爬机制拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # 3. 发送GET请求,获取服务器响应 response = requests.get(url, headers=headers) # 4. 检查请求是否成功(状态码200表示成功) if response.status_code == 200: # 将响应的内容(网页HTML源代码)以文本形式保存到变量 `html_content` 中 html_content = response.text print("网页请求成功!") # 可以先打印前500个字符看看内容 # print(html_content[:500]) else: print(f"请求失败,状态码:{response.status_code}")代码解释:
import ...: 引入我们需要的工具。headers: 这是模拟浏览器的关键。服务器会通过User-Agent来判断访问者是谁。使用一个常见的浏览器UA,能让我们的请求更“合法”。requests.get(): 这是requests库最核心的函数,用于发起一个GET请求。response.status_code: 响应状态码。200成功,404页面不存在,500服务器错误等。response.text: 服务器返回的HTML源代码,正是我们需要解析的内容。
运行一下这段代码(在文件所在目录打开命令行,输入python douban_spider.py),如果看到“网页请求成功!”,恭喜你,最基础的一步已经完成了!
4.3 第三步:解析HTML,提取目标数据
现在,我们手里有了一团乱麻似的HTML文本 (html_content)。接下来要用BeautifulSoup把这团乱麻理顺,并抽出我们想要的丝线(数据)。
在上一步的代码后面继续添加:
# 5. 使用BeautifulSoup解析HTML内容,指定解析器为‘html.parser’ soup = BeautifulSoup(html_content, 'html.parser') # 6. 查找所有 class="item" 的 div 标签,每一个对应一部电影 movie_items = soup.find_all('div', class_='item') # 7. 遍历每一个电影条目,提取具体信息 for item in movie_items: # 提取电影名称(注意:中文名在第一个 span.title 里,可能还有英文名在第二个) title_tag = item.find('span', class_='title') # 使用 .string 属性获取标签内的文本,如果找不到标签则返回空字符串 title = title_tag.string if title_tag else '未找到名称' # 提取评分 rating_tag = item.find('span', class_='rating_num') rating = rating_tag.string if rating_tag else '未找到评分' # 提取详情页链接 # 先找到包含链接的 <a> 标签,它通常在 class="hd" 的 div 里 link_tag = item.find('div', class_='hd').find('a') if item.find('div', class_='hd') else None link = link_tag['href'] if link_tag else '未找到链接' # 打印提取到的信息 print(f"电影:{title} | 评分:{rating} | 链接:{link}")代码解释:
BeautifulSoup(html_content, 'html.parser'): 创建一个BeautifulSoup对象,它装载了HTML内容,并提供了各种查找方法。soup.find_all('div', class_='item'):这是核心!find_all方法会找到HTML中所有符合条件的标签。这里我们找到所有class属性为item的div标签,返回一个列表。item.find('span', class_='title'): 在单个电影条目 (item) 中,使用find方法查找第一个符合条件的标签(class为title的span)。.string: 获取标签内的文本内容。if ... else ...: 这是一个简单的容错处理。如果找不到某个标签(比如网页结构有微小变动),程序不会崩溃,而是赋予一个默认值。link_tag['href']: 获取标签的属性值。这里获取<a>标签的href属性,即链接地址。
再次运行程序。你应该能在控制台看到25行输出,每一行都是一部电影的名称、评分和链接。这一刻,你的第一个爬虫已经成功了!
4.4 第四步:保存数据到文件
把数据打印在屏幕上只是第一步,我们通常需要保存下来。这里我们选择保存到CSV文件(一种可以用Excel打开的表格格式)。
在打印信息的循环结束后,添加数据保存的代码。我们需要先收集所有数据,再一次性写入文件。
修改你的代码,整体结构如下:
import requests from bs4 import BeautifulSoup import csv # 导入csv模块用于写文件 url = 'https://movie.douban.com/top250' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: html_content = response.text soup = BeautifulSoup(html_content, 'html.parser') movie_items = soup.find_all('div', class_='item') # 创建一个列表来存储所有电影数据,每个电影是一个字典 movies_data = [] for item in movie_items: title_tag = item.find('span', class_='title') title = title_tag.string if title_tag else 'N/A' rating_tag = item.find('span', class_='rating_num') rating = rating_tag.string if rating_tag else 'N/A' link_tag = item.find('div', class_='hd').find('a') if item.find('div', class_='hd') else None link = link_tag['href'] if link_tag else 'N/A' # 将每部电影的信息存入字典,并添加到列表中 movies_data.append({ 'title': title, 'rating': rating, 'link': link }) # 仍然在控制台打印,方便查看进度 print(f"已抓取:{title}") # 将数据写入CSV文件 csv_filename = 'douban_top250_page1.csv' # 定义CSV文件的列名 fieldnames = ['title', 'rating', 'link'] with open(csv_filename, 'w', newline='', encoding='utf-8-sig') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 写入表头 writer.writerows(movies_data) # 写入所有数据行 print(f"\n数据已成功保存到文件:{csv_filename}") else: print(f"请求失败,状态码:{response.status_code}")代码解释:
import csv: 导入Python内置的CSV模块。movies_data = []: 创建一个空列表,用于在循环中积累每一部电影的数据(字典格式)。movies_data.append({...}): 将每部电影的信息作为一个字典,添加到列表中。with open(...) as csvfile:: 使用with语句打开(或创建)一个文件,这样可以确保文件在使用后被正确关闭。encoding='utf-8-sig': 指定文件编码为UTF-8 with BOM,这是为了在Excel中打开时能正确显示中文。csv.DictWriter: 创建一个字典写入器,它可以根据我们提供的fieldnames(列名)将字典数据写入CSV文件。writer.writeheader()和writer.writerows(): 分别写入表头和所有数据行。
运行这段完整的代码。程序执行完毕后,你会在douban_spider.py同一个文件夹下,发现一个新生成的douban_top250_page1.csv文件。用Excel或文本编辑器打开它,你会看到一个整洁的表格,包含了25部电影的信息。
5. 运行结果与效果验证
运行上面的完整代码,你应该在控制台看到类似以下的输出:
网页请求成功! 已抓取:肖申克的救赎 已抓取:霸王别姬 已抓取:阿甘正传 ... 已抓取:窃听风暴 数据已成功保存到文件:douban_top250_page1.csv如何验证成功?
- 控制台输出:程序没有报错(如
ConnectionError,KeyError等),并且按顺序打印出了25个电影名。 - 文件生成:在脚本所在目录,生成了
douban_top250_page1.csv文件。 - 文件内容:用Excel或记事本打开该CSV文件,确认有三列(title, rating, link),并且有25行数据(加上表头是26行),中文显示正常。
如果以上三点都符合,那么恭喜你,你的第一个Python爬虫项目已经圆满成功!你已经完整地走过了“发送请求 -> 解析数据 -> 保存数据”的全流程。
6. 常见问题与排查思路
作为新手,你几乎一定会遇到下面这些问题。别担心,它们都有明确的解决路径。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 运行脚本后没有任何输出,或立即闪退 | 1. 代码有语法错误。 2. 没有在命令行中正确进入脚本所在目录。 | 1. 在命令行中运行python douban_spider.py,仔细看错误信息(通常是SyntaxError)。2. 使用 cd命令切换到脚本所在文件夹再运行。 | 1. 根据错误信息修改代码,常见错误:缩进不对、冒号缺失、括号不匹配。 2. 在文件资源管理器地址栏输入 cmd回车,可直接在当前目录打开命令行。 |
报错ModuleNotFoundError: No module named ‘requests’ | requests库没有安装成功,或安装在了其他Python环境。 | 在命令行中运行pip list,查看已安装的包列表中是否有requests和beautifulsoup4。 | 重新执行pip install requests beautifulsoup4。如果电脑有多个Python,确认你正在使用的python和pip是同一个版本的(可用python -m pip install来安装)。 |
| 请求失败,状态码为 403 | 目标网站识别出这是爬虫请求,拒绝了访问。这是最常见的反爬虫手段。 | 检查代码中的headers是否设置,特别是User-Agent是否是一个有效的浏览器标识。 | 1.确保headers字典已正确添加在requests.get()调用中。2. 可以尝试更新 User-Agent字符串,在网上搜索“最新User-Agent”替换。 |
| 请求失败,状态码为 404 | 输入的URL地址错误。 | 核对代码中的url变量,是否和浏览器地址栏的网址完全一致。 | 复制浏览器中目标网页的完整地址,替换代码中的url。 |
能打印“请求成功”,但movie_items是空的,抓不到数据 | 1. 网页结构已经发生变化,class=’item’的div不存在了。2. 网站需要登录或JavaScript渲染,直接请求拿到的HTML里没有数据。 | 1. 再次使用浏览器的“检查”功能,确认电影条目外层的标签和类名是否还是div class=”item”。2. 将 html_content保存到一个.html文件,用浏览器打开,看是否包含可见的电影信息。 | 1. 根据新的网页结构,修改soup.find_all()里的查找条件。2. 对于需要JS渲染的网站,入门阶段建议换一个静态网站练习(如其他榜单、新闻网站)。进阶需要使用 Selenium或Playwright等工具。 |
| 保存的CSV文件用Excel打开中文是乱码 | Excel对UTF-8无BOM编码支持不友好。 | 用记事本打开CSV文件,如果中文正常,则是Excel的问题。 | 在代码中open()函数里,将encoding=’utf-8’改为encoding=’utf-8-sig’。 |
| 只能抓到第一页25条数据 | 我们的代码只请求了第一页的URL。 | 观察豆瓣Top250的翻页规律,第二页URL是?start=25&filter=,第三页是?start=50&filter=。 | 可以使用一个循环,批量生成不同页码的URL,然后重复执行抓取和解析流程。 |
7. 最佳实践与工程建议
当你成功运行第一个爬虫后,如果想走得更远更稳,下面这些建议至关重要。
7.1 遵守Robots协议与法律法规
这是红线,绝对不能碰。
- Robots协议:在网站根目录下通常有一个
robots.txt文件(如https://douban.com/robots.txt)。这个文件规定了哪些页面允许爬取,哪些禁止。虽然技术上可以绕过,但遵守它是基本的网络礼仪和合法性的基础。 - 法律法规:切勿爬取涉及个人隐私、商业秘密、受版权保护或国家法律明令禁止的数据。爬取的数据仅用于个人学习、研究或公益目的,不得用于商业牟利或损害他人利益。
- 控制访问频率:疯狂、高频率地请求一个网站,会对对方服务器造成压力(即“DDOS攻击”),这不仅是非法的,也极易导致你的IP被永久封禁。
7.2 让你的爬虫更“友好”
- 设置请求头(Headers):我们已经做了。除了
User-Agent,有时还需要Referer(来源页)、Cookie(登录状态)等。 - 添加延迟(Delay):在循环请求多个页面时,在每次请求之间使用
time.sleep()函数暂停几秒。这能极大降低对目标网站的压力。import time time.sleep(2) # 暂停2秒 - 处理异常:网络是不稳定的,请求可能超时或失败。使用
try...except语句包裹你的请求代码,确保程序在遇到单个页面失败时不会崩溃,并能记录错误继续运行。try: response = requests.get(url, headers=headers, timeout=5) response.raise_for_status() # 如果状态码不是200,抛出异常 except requests.exceptions.RequestException as e: print(f"请求 {url} 时出错:{e}") continue # 跳过当前页面,继续下一个
7.3 代码组织与扩展
- 函数化:将发送请求、解析页面、保存数据分别写成函数,使代码更清晰、更易复用。
- 分页爬取:分析URL规律,用
for循环构造所有页面的URL列表,然后遍历爬取。 - 存储多样化:除了CSV,可以尝试保存到JSON文件(
json模块)、SQLite数据库(sqlite3模块)或MySQL等。 - 使用Session:如果需要保持登录状态或Cookie,使用
requests.Session()对象,它会在多次请求间自动维持会话。
7.4 下一步学什么?
当你熟练掌握了requests+BeautifulSoup这套组合拳后,可以根据兴趣和需求深入学习:
- 动态网页爬取:学习
Selenium或Playwright,它们可以控制真实浏览器,解决JavaScript渲染问题。 - 大规模爬虫框架:学习
Scrapy,它是一个专业的爬虫框架,提供了项目结构、异步处理、中间件、管道等强大功能,适合复杂、大型的爬取任务。 - 反爬虫与反反爬:研究IP代理池、验证码识别、请求签名等更高级的对抗技术(务必在合法合规的前提下进行)。
- 数据清洗与分析:爬下来的数据往往是“脏”的,学习使用
pandas库进行数据清洗、分析和可视化。
8. 总结与后续学习方向
通过这个不到100行的脚本,你已经掌握了Python爬虫最核心的骨架。我们来回顾一下你究竟学会了什么:
- 建立了核心思维模型:爬虫 = 模拟浏览器请求 + 从HTML中按规律提取数据 + 保存。你不再觉得它神秘。
- 掌握了最小可行技术栈:会用
requests库获取网页,会用BeautifulSoup库解析HTML标签,会用csv模块保存数据。这三者足以应对大量静态网站。 - 完成了完整工作流:从环境搭建、观察网页、编写代码、发送请求、解析数据到保存文件,你独立走通了一个真实项目的全流程。
- 具备了基础排错能力:你知道了状态码403、404意味着什么,知道了乱码如何解决,知道了数据抓不到该如何排查。
这“2小时”的投入,带给你的不是一堆孤立的知识点,而是一个可以立即上手、并能够自我扩展的实用技能。你可以尝试用同样的思路去爬取其他结构类似的网站,比如豆瓣读书榜单、知乎热榜、天气预报网站等。
记住,爬虫技术是工具,关键在于你用他来做什么。始终保持对数据的敬畏,对规则的遵守,将技术用于提升效率、辅助学习,这才是长久之道。建议你将这个项目的代码保存好,作为你爬虫学习的起点。下次当你需要从网上批量获取信息时,你知道该从哪里开始了。