Python 爬虫入门教程:从零开始,轻松上手
目录
- 什么是爬虫?
- 爬虫的基本原理
- 准备工作:安装 Python 和必要的库
- 实战篇一:爬取静态网页(最简单的例子)
requests库:获取网页内容BeautifulSoup4库:解析网页内容- 完整代码与解析
- 实战篇二:爬取动态网页(JavaScript 渲染的页面)
Selenium库:模拟浏览器操作- 完整代码与解析
- 爬虫进阶:应对反爬机制
- 设置请求头
- 使用代理 IP
- 处理验证码
- 控制爬取速度
- 数据存储:如何保存你爬取的数据
- 保存为 TXT 文本
- 保存为 CSV 文件(推荐)
- 保存到数据库(SQLite 简介)
- 爬虫的“道”与“术”:法律与道德
- 总结与下一步学习方向
什么是爬虫?
网络爬虫,也叫网络蜘蛛,是一种按照一定规则,自动地抓取万维网信息的程序或脚本。爬虫就是一只在互联网上自动抓取数据的“机器人”。

它可以做什么?
- 搜索引擎:Google、百度等搜索引擎的核心就是巨大的爬虫系统,它们抓取全网网页,建立索引。
- 价格监控:电商网站可以用爬虫监控竞争对手的商品价格变化。
- 舆情分析:抓取社交媒体、新闻网站上的信息,分析公众对某个事件或产品的看法。
- 数据收集:学术研究、市场分析等需要大量数据时,爬虫是最高效的工具。
爬虫的基本原理
爬虫的工作流程可以简化为以下几个步骤:
- 发起请求:爬虫向目标网站的服务器发送一个 HTTP 请求。
- 获取响应:服务器收到请求后,会返回一个 HTTP 响应,其中包含了网页的源代码(HTML)。
- :爬虫解析 HTML 源代码,从中提取出自己感兴趣的数据(比如标题、正文、链接等)。
- 存储数据:将提取出的数据保存到本地文件(如 TXT, CSV)或数据库中。
- 循环发现:从当前页面中提取出新的链接,然后对这些新链接重复以上步骤,实现遍历整个网站(或部分网站)的功能。
准备工作:安装 Python 和必要的库
安装 Python
如果你还没有安装 Python,请先访问 Python 官网 下载并安装。安装时请务必勾选 "Add Python to PATH" 选项,这样你就可以在命令行中直接使用 python 命令。
打开命令行工具(Windows 是 cmd 或 PowerShell,macOS/Linux 是 Terminal),输入以下命令检查是否安装成功:

python --version
或
python3 --version
安装必要的库
我们将使用三个核心库:
requests:用于发送 HTTP 请求,获取网页内容,它是 Python 最流行的 HTTP 库。beautifulsoup4:用于解析 HTML 和 XML 文档,方便地提取数据。lxml:一个更快的 HTML/XML 解析器,BeautifulSoup可以用它作为解析器。
在命令行中,使用 pip(Python 的包管理器)来安装它们:
pip install requests pip install beautifulsoup4 pip install lxml
注意:如果上述命令报错,可以尝试使用 pip3 命令。

实战篇一:爬取静态网页
我们的第一个目标是爬取 豆瓣电影 Top250 的电影名称、评分和一句话简介,这是一个非常经典的静态网页案例。
requests 库:获取网页内容
requests 库非常简单,用一行代码就能获取网页源码。
import requests
# 目标网址
url = 'https://movie.douban.com/top250'
# 发送 GET 请求
response = requests.get(url)
# 检查请求是否成功 (状态码 200 表示成功)
if response.status_code == 200:
# 打印网页源码的前 500 个字符
print(response.text[:500])
else:
print(f"请求失败,状态码: {response.status_code}")
运行这段代码,你会得到一堆 HTML 代码,我们的任务就是从这堆代码中“捞出”我们需要的信息。
BeautifulSoup4 库:解析网页内容
直接看 HTML 代码很痛苦,BeautifulSoup 能让我们用更直观的方式来定位元素。
我们用浏览器打开豆瓣 Top250 页面,右键点击一部电影的标题,选择“检查”,你会看到类似这样的 HTML 结构:
<span class="title">肖申克的救赎</span> <span class="rating_num">9.7</span> <span class="inq">希望让人自由</span>
我们发现:
- 电影名称都在
<span class="title">标签里。 - 评分都在
<span class="rating_num">标签里。 - 一句话简介都在
<span class="inq">标签里。
我们用 BeautifulSoup 来提取它们。
完整代码与解析
import requests
from bs4 import BeautifulSoup
# 1. 发送请求,获取网页内容
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)
# 2. 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'lxml')
# 3. 定位并提取数据
# find_all('ol') 找到所有 class 为 'ol' 的 <ol> 标签,这里就是电影列表
movie_list = soup.find_all('ol', class_='grid_view')
for movie_item in movie_list:
# find_all('li') 找到列表中的每一个电影条目
movies = movie_item.find_all('li')
for movie in movies:
# 提取电影名称 (可能有中文和外文名,这里取第一个)
title = movie.find('span', class_='title').text
# 提取评分
rating_num = movie.find('span', class_='rating_num').text
# 提取一句话简介 (注意,可能没有)
quote = movie.find('span', class_='inq')
if quote:
quote = quote.text
else:
quote = "暂无简介"
print(f"电影: {title}, 评分: {rating_num}, 简介: {quote}")
代码解析:
headers:这是一个请求头,User-Agent字段用来模拟浏览器访问,有些网站会拒绝没有User-Agent的请求,所以加上它是个好习惯。BeautifulSoup(response.text, 'lxml'):将requests获取到的文本内容交给BeautifulSoup,并指定使用lxml解析器来生成一个对象soup。soup.find_all('ol', class_='grid_view'):find_all是查找所有符合条件的元素,这里我们查找所有class属性为grid_view的<ol>标签,它返回一个列表。movie.find('span', class_='title'):find是查找第一个符合条件的元素,这里我们在一个电影条目内查找class为title的<span>.text:获取标签内部的文本内容。
实战篇二:爬取动态网页
很多现代网站(如淘宝、微博)的内容是通过 JavaScript 动态加载的,直接用 requests 获取到的 HTML 可能是空的,或者只包含一个框架,这时我们需要一个能“运行” JavaScript 的工具——Selenium。
Selenium 库:模拟浏览器操作
Selenium 可以模拟用户在浏览器中的各种操作,如点击、输入、滚动等,并获取最终渲染完成的页面内容。
准备工作
-
安装 Selenium:
pip install selenium
-
下载浏览器驱动: Selenium 需要一个“驱动程序”来控制你的浏览器,你需要下载与你浏览器版本匹配的驱动。
- ChromeDriver: https://googlechromelabs.github.io/chrome-for-testing/
- GeckoDriver (Firefox): https://github.com/mozilla/geckodriver/releases
- 注意:下载的驱动版本要与你安装的浏览器版本大致匹配。
- 放置驱动:将下载好的
chromedriver.exe(Windows) 或chromedriver(macOS/Linux) 文件放到你的 Python 脚本所在的同一个目录下,或者放到系统环境变量PATH包含的目录中(如C:\Windows\System32)。
完整代码与解析(以爬取今日头条热榜为例)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
# 1. 设置 ChromeDriver 路径 (如果不在环境变量中)
# s = Service(executable_path='C:/path/to/your/chromedriver.exe')
# driver = webdriver.Chrome(service=s)
# 如果驱动在脚本同目录下,可以这样写
driver = webdriver.Chrome()
# 2. 打开目标网页
url = 'https://www.toutiao.com/hotboard/'
driver.get(url)
# 3. 等待页面加载完成
# 动态页面需要时间加载,我们等待几秒,或者使用更智能的等待方式
# 这里简单使用 time.sleep()
time.sleep(3) # 等待 3 秒
# 4. 获取渲染后的页面源码
page_source = driver.page_source
# 5. 使用 BeautifulSoup 解析
soup = BeautifulSoup(page_source, 'lxml')
# 6. 提取数据
hot_items = soup.find_all('div', class_='HotItem-content')
for item in hot_items:= item.find('a').text.strip()
print(title)
# 7. 关闭浏览器
driver.quit()
代码解析:
webdriver.Chrome():启动一个 Chrome 浏览器实例。driver.get(url):让浏览器打开指定的网址。time.sleep(3):非常重要! 给浏览器足够的时间去加载和执行 JavaScript,在实际项目中,推荐使用WebDriverWait进行“显式等待”,但这对于入门来说,time.sleep更简单直观。driver.page_source:获取浏览器当前页面的完整 HTML 源码(是 JS 渲染后的)。- 后续步骤:获取到源码后,就和静态网页的解析方法完全一样了。
driver.quit():关闭浏览器,释放资源。一定要记得关闭!
爬虫进阶:应对反爬机制
网站并不喜欢被爬虫“光顾”,所以会有各种反爬措施,一个成熟的爬虫需要学会应对它们。
设置请求头
除了 User-Agent,还可以设置 Referer(表示请求从哪里来)、Cookie(维持登录状态)等,让请求看起来更“正常”。
headers = {
'User-Agent': '...',
'Referer': 'https://movie.douban.com/',
'Cookie': 'some_cookie_value' # 如果需要登录
}
response = requests.get(url, headers=headers)
使用代理 IP
当你的 IP 访问过于频繁时,可能会被网站封禁,使用代理 IP 可以更换你的出口 IP,继续访问。
proxies = {
'http': 'http://your_proxy_ip:port',
'https': 'https://your_proxy_ip:port',
}
response = requests.get(url, proxies=proxies)
处理验证码
对于复杂的验证码(如滑动、点选),可能需要使用第三方打码平台,对于简单的图片验证码,可以使用 Tesseract-OCR 等工具进行识别,但准确率不高。
控制爬取速度
在两次请求之间加入随机延时,避免请求过于密集。
import random import time time.sleep(random.uniform(1, 3)) # 随机等待 1 到 3 秒
数据存储
保存为 TXT 文本
最简单的方式,适合少量数据。
with open('movies.txt', 'w', encoding='utf-8') as f:
f.write(f"电影: {title}, 评分: {rating_num}\n")
保存为 CSV 文件(推荐)
CSV(逗号分隔值)是存储表格数据的理想格式,可以用 Excel 直接打开。
import csv
# 第一次写入时,需要写入表头
with open('movies.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['电影名称', '评分', '简介']) # 写入表头
# 追加数据
with open('movies.csv', 'a', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow([title, rating_num, quote])
注意:utf-8-sig 编码可以避免用 Excel 打开 CSV 文件时中文乱码的问题。
保存到数据库(SQLite 简介)
对于海量数据,数据库是最佳选择,Python 自带了轻量级的 SQLite 数据库,无需额外安装。
import sqlite3
# 连接到数据库 (如果不存在则创建)
conn = sqlite3.connect('movies.db')
cursor = conn.cursor()
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS douban_top250 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
rating REAL,
quote TEXT
)
''')
# 插入数据
cursor.execute("INSERT INTO douban_top250 (title, rating, quote) VALUES (?, ?, ?)", (title, rating_num, quote))
# 提交事务
conn.commit()
# 关闭连接
conn.close()
爬虫的“道”与“术”:法律与道德
技术是中立的,但使用技术的人需要承担责任。
- 查看
robots.txt:大多数网站根目录下都有一个robots.txt文件(如https://www.douban.com/robots.txt),它规定了哪些页面可以爬,哪些不可以,在爬取前最好先查看。 - 尊重网站意愿:如果网站明确禁止爬取,就不要强行突破。
- 控制访问频率:不要对服务器造成过大压力,
robots.txt中通常也提到了Crawl-delay(爬取延时)的建议。 - 不要用于商业用途或非法活动:爬取的数据仅用于个人学习或研究,切勿滥用。
总结与下一步学习方向
恭喜你!你已经掌握了 Python 爬虫的核心技能。
下一步可以学习什么?
- Scrapy 框架:当爬虫项目变得复杂时,使用
Scrapy框架可以让你更高效地构建、管理和运行爬虫,它集成了数据提取、请求调度、数据存储等众多功能。 - 异步爬虫:使用
aiohttp和asyncio可以实现异步请求,大幅提升爬取效率,尤其是在爬取大量独立页面时。 - 数据清洗与分析:学习
Pandas库,可以对爬取到的数据进行清洗、转换、分析和可视化。 - 分布式爬虫:对于超大规模的数据抓取,可以学习使用
Scrapy-Redis等工具,将爬虫任务分发到多台机器上并行执行。 - 更高级的反反爬技术:如使用
Selenium模拟登录、处理更复杂的验证码、使用 Headless Chrome(无头浏览器)等。
爬虫的世界非常广阔,希望这份入门教程能为你打开一扇门。多动手实践,多思考,你将成为一名出色的爬虫工程师!
