一、为什么要学习爬虫
在互联网时代,大量数据都隐藏在网页中,例如商品信息、新闻内容、评论数据等。
如果我们能够用程序自动获取这些数据,就可以用于:
- 数据分析
- 商业决策
- 自动化处理
本篇文章将带你从 0 开始认识什么是爬虫,并使用 Python 发送第一个网络请求,获取网页数据。
补充:爬虫的典型应用场景
- 电商:抓取商品价格、评价做比价或趋势分析
- 舆情:抓取新闻/评论做情感分析
- 招聘:抓取岗位信息做薪资/技能统计
- 学术:抓取论文/引用数据做分析
法律与合规提示(重要)
在实际使用爬虫时,需要注意:
- 遵守网站的 robots 协议
- 不要对网站造成过高压力(控制频率)
- 不抓取隐私或受限数据
二、什么是爬虫
简单来说:
爬虫就是用程序模拟浏览器去访问网站,并获取数据。
举个例子:
我们在浏览器中搜索商品:
- 输入关键词
- 浏览器发送请求
- 服务器返回数据
- 页面展示结果
而爬虫做的事情是一样的,只不过是用代码来完成。
补充:浏览器与爬虫的区别
- 浏览器:展示页面(HTML + CSS + JS 渲染)
- 爬虫:只关心数据(通常获取 HTML/JSON 后自行解析)
补充:静态页面 vs 动态页面
- 静态页面:HTML 中直接包含数据(requests/urllib 即可)
- 动态页面:需要 JS 执行后才有数据(需 Selenium 或接口抓取)
三、爬虫的核心流程
所有爬虫都离不开这四个步骤:
- 发送请求(Request)
- 获取响应(Response)
- 解析数据(Parse)
- 保存数据(Storage)
本篇我们重点学习前两步。
每一步的职责说明
- Request:构造 URL、参数、请求头(headers)
- Response:接收服务器返回(HTML/JSON/图片等)
- Parse:用 XPath/BS/正则提取需要的数据
- Storage:保存到文件/数据库
可以记住一句话:
👉 爬虫 = 请求 + 解析
四、第一个爬虫程序
下面我们写一个最简单的爬虫程序:
import urllib.request
url = 'http://www.baidu.com'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
print(content)
代码解释
url:要访问的网站地址urlopen():向服务器发送请求response:服务器返回的数据read():读取网页内容(字节)decode():将字节转为字符串
运行后,你会看到一整页 HTML,这就是网页源码。
运行结果说明
- 打印的是网页的原始 HTML 源码
- 浏览器中看到的页面,是在此基础上经过 CSS/JS 渲染后的结果
常见问题
- 乱码:需要正确
decode('utf-8') - 连接慢:可以增加超时参数(见后续章节)
增强示例(带超时与异常处理)
# 导入库
import urllib.request
url = 'http://www.baidu.com'
try:
# 发送请求(设置超时)
response = urllib.request.urlopen(url, timeout=5)
# 读取并解码
content = response.read().decode('utf-8')
# 输出部分内容
print(content[:200])
except Exception as e:
print('请求失败:', e)
五、Response 对象常用方法
我们可以通过 response 获取更多信息:
response.read() # 获取网页内容
response.getcode() # 状态码
response.geturl() # 当前 URL
response.getheaders() # 响应头
状态码说明(常见)
- 200:请求成功
- 301/302:重定向
- 403:禁止访问(可能被反爬)
- 404:页面不存在
示例:打印状态码与 URL
print('状态码:', response.getcode())
print('最终URL:', response.geturl())
六、为什么要伪装浏览器(User-Agent)
有些网站会检测请求来源,如果发现不是浏览器,就会拒绝访问。
因此我们需要伪装请求头。
import urllib.request
url = 'http://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
本质:让服务器认为你是正常浏览器访问
补充:常见请求头字段
- User-Agent:标识浏览器类型
- Referer:来源页面
- Cookie:会话信息
示例:添加更多请求头
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://www.baidu.com'
}
七、GET 请求参数
1. quote(单参数)
import urllib.parse
keyword = '周杰伦'
url = 'https://www.baidu.com/s?wd=' + urllib.parse.quote(keyword)
2. urlencode(推荐)
import urllib.parse
data = {
'wd': '周杰伦'
}
query = urllib.parse.urlencode(data)
url = 'https://www.baidu.com/s?' + query
多参数示例
import urllib.parse
params = {
'wd': 'Python 爬虫',
'pn': 10
}
query = urllib.parse.urlencode(params)
url = 'https://www.baidu.com/s?' + query
注意事项
- 中文参数需要编码
- 推荐统一使用 urlencode
八、GET 和 POST 的区别
GET:
- 参数在 URL 上
- 适合查询
POST:
- 参数在请求体中
- 适合提交数据
(后续文章会详细讲解 POST)
如何在浏览器中判断请求类型
- 打开开发者工具(F12)
- 切换到 Network
- 点击请求
- 查看 Method 字段
小结
- GET:简单、可见、适合查询
- POST:更安全、适合提交数据
九、爬虫前需要掌握的 Python 基础
真正开始写爬虫之前,不需要把 Python 所有内容都学完,但下面这些基础最好先掌握。
| 基础内容 | 在爬虫中的作用 |
|---|---|
| 变量与字符串 | 保存 URL、请求头、响应内容 |
| 列表与字典 | 保存多条数据、请求参数、请求头、Cookie |
| 条件判断 | 根据状态码、返回内容判断是否继续处理 |
| 循环 | 翻页抓取、多 URL 批量请求 |
| 函数 | 封装请求、解析、保存逻辑 |
| 文件读写 | 保存 HTML、图片、JSON、CSV |
| 异常处理 | 处理超时、连接失败、解析失败 |
例如,一个简单的翻页抓取通常就会用到循环、字典和函数:
from urllib import request, parse
def build_url(keyword, page):
params = {
'wd': keyword,
'pn': page * 10
}
return 'https://www.baidu.com/s?' + parse.urlencode(params)
for page in range(3):
url = build_url('Python 爬虫', page)
response = request.urlopen(url, timeout=10)
html = response.read().decode('utf-8')
print(page, len(html))
这里虽然代码不长,但已经包含了几个爬虫中很常见的动作:
- 用函数封装 URL 构造逻辑。
- 用字典保存查询参数。
- 用循环控制分页。
- 用
timeout避免请求一直阻塞。
如果这些 Python 基础不熟悉,后面学习 requests、Selenium、Scrapy 时会很容易把问题混在一起。
十、本篇总结
本篇我们完成了爬虫入门的第一步:
- 了解什么是爬虫
- 理解爬虫的核心流程
- 使用 urllib 发送第一个请求
- 学会查看 Response 信息
- 掌握基本的 GET 参数处理
请记住:
👉 爬虫的本质就是:请求 + 解析
后续我们会继续学习:
- urllib 更高级用法
- requests 库(更常用)
- 数据解析(XPath / BeautifulSoup)