前言
网络爬虫(Web Crawler)是互联网数据获取的重要工具。学习爬虫需要掌握一定的 Python 基础语法,包括变量、函数、面向对象编程等。本文将带你系统了解爬虫的基本原理、工作流程以及如何使用 Python 的 requests 库进行数据采集。
初识爬虫
什么是爬虫?
从本质上来说,爬虫就是利用程序自动抓取网络上对我们有价值的数据。爬虫的应用场景非常广泛:
- 商业分析:例如分析北京近两年二手房成交均价、深圳 Python 工程师平均薪资、某电商平台商品价格趋势等。
- 生活助手:查询天气、新闻聚合、比价工具等。
- 搜索引擎核心:百度、谷歌等搜索引擎的核心技术之一就是超级爬虫,它们源源不断地爬取全网网页并存储在服务器上,用户搜索时实际上是在服务器索引中检索信息。
人工智能的发展离不开海量数据,而爬虫正是获取这些数据的关键源头。从搜索巨头到人工智能巨头,爬虫技术在其中扮演了基础性的角色。
为什么需要爬虫?
手动通过浏览器上网下载数据效率低下且难以规模化。爬虫可以模拟人类行为,自动化完成以下任务:
- 批量访问目标网站。
- 自动解析页面结构。
- 提取特定字段数据。
- 将数据存储到本地或数据库。
明确学习目标对于学习爬虫至关重要。建议在学习过程中记录自己的需求,如'我想抓取某类商品数据'或'我想分析某社交媒体舆情',这将帮助你在遇到技术瓶颈时保持动力。
浏览器的工作原理
要理解爬虫,首先需要理解浏览器是如何工作的。现代浏览器(以 Chrome 为例)采用多进程架构,以提高稳定性和安全性。
主要进程功能
- 浏览器进程:负责界面显示、用户交互、子进程管理以及存储功能。
- 渲染进程:核心任务是将 HTML、CSS 和 JavaScript 转换为用户可见的网页。排版引擎 Blink 和 JavaScript 引擎 V8 运行在该进程中。出于安全考虑,渲染进程通常运行在沙箱模式下,限制其对操作系统的直接访问。
- GPU 进程:负责图形绘制,用于加速 3D CSS 效果和 UI 渲染。
- 网络进程:负责页面的网络资源加载,独立出来后能更好地管理网络连接。
- 插件进程:隔离插件运行,防止插件崩溃影响主浏览器。
浏览器与服务器交互流程
完整的交流过程涉及人、浏览器、服务器三者:
- 请求:用户在地址栏输入 URL,浏览器向服务器发起 HTTP 请求。
- 响应:服务器处理请求后返回数据(通常是 HTML、JSON 或图片等)。
- 解析:浏览器接收数据,将其翻译成可读的页面。
- 提取与存储:用户可以从中挑选有用数据并保存。
爬虫的工作原理与浏览器类似,但去除了图形界面部分,专注于数据的获取与处理。
爬虫的工作原理
爬虫可以代劳浏览器工作过程中的关键步骤。其核心工作流程分为四步:
-
第 0 步:获取数据 爬虫程序根据提供的网址(URL),向服务器发起 HTTP 请求,获取服务器返回的原始数据(Response)。
-
第 1 步:解析数据 将服务器返回的原始数据(如 HTML 源码、JSON 字符串)解析成结构化格式,便于程序读取。
-
第 2 步:提取数据 根据预设规则,从解析后的数据中提取出需要的具体字段(如标题、价格、作者等)。
-
第 3 步:储存数据 将提取到的数据保存到本地文件(如 TXT、CSV、JSON)或数据库中,以便后续分析和使用。
无论后续学习内容如何深入,这四大步骤始终是爬虫的核心逻辑。
体验爬虫:Requests 库
在 Python 中,requests 是最常用的 HTTP 请求库。它封装了底层复杂的网络细节,提供了简洁的 API。
安装与引入
如果本地未安装,可通过终端命令安装:
pip install requests
在代码中引入库:
import requests
requests.get() 方法
requests.get() 用于发送 GET 请求。基本用法如下:
# 发送请求,参数为 URL
res = requests.get('https://example.com')
- URL:统一资源定位符,指示网页在网络上的地址。
- 返回值:一个
Response对象,包含服务器返回的所有信息。
Response 对象的常用属性
Response 对象是处理数据的核心。以下是四个最常用的属性:
1. status_code(状态码)
检查请求是否成功。常见的状态码包括:
200:请求成功。404:资源未找到。500:服务器内部错误。403:禁止访问。
print(res.status_code)
2. content(二进制内容)
返回响应的二进制数据,适用于下载图片、音频、视频等非文本文件。
# 下载图片示例
pic = res.content
with open('image.jpg', 'wb') as f:
f.write(pic)
3. text(文本内容)
返回响应的文本内容,适用于网页源代码、API 返回的 JSON 字符串等。
# 获取小说内容
novel = res.text
print(novel[:800])
注意:如果编码识别不正确,可能会出现乱码。
4. encoding(编码设置)
当 text 出现乱码时,可手动指定编码格式。
res.encoding = 'utf-8'
novel = res.text
进阶:Headers 与 User-Agent
许多网站会检测请求头中的 User-Agent,如果检测到是 Python 脚本而非真实浏览器,可能会拒绝服务(返回 403)。因此,设置请求头非常重要。
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'
}
res = requests.get('https://example.com', headers=headers)
进阶:异常处理
网络请求可能因超时、断网等原因失败,必须添加异常处理机制。
try:
res = requests.get(url, timeout=10)
res.raise_for_status() # 如果状态码不是 200,抛出异常
except Exception as e:
print(f"请求失败:{e}")
进阶:数据存储
除了保存为文本,还可以将数据保存为 CSV 或 JSON 格式,方便数据分析。
保存为 CSV:
import csv
with open('data.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['Title', 'Price'])
writer.writerow(['Example Book', '100'])
保存为 JSON:
import json
data = {'name': 'Spider', 'version': '1.0'}
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
总结
本文介绍了爬虫的基本概念、浏览器与爬虫的工作流程差异,并详细讲解了如何使用 Python 的 requests 库获取数据、解析响应以及处理常见编码问题。掌握了这些基础知识后,你可以进一步学习正则表达式、BeautifulSoup、XPath 等解析工具,构建更强大的爬虫系统。
在实际开发中,请遵守相关法律法规及网站的 robots.txt 协议,合理控制请求频率,避免对目标服务器造成过大压力。

