大家好,我是python网络爬虫这门课程的主要讲师geo
在正式学习 requests 之前,我们必须先搞清楚一个问题:
爬虫到底在做什么?
人类访问网页的过程
当你在浏览器输入:
https://www.google.com
浏览器会做几件事情:
- 向服务器发出 HTTP 请求
- 服务器接收到请求
- 服务器返回 HTTP 响应
- 浏览器解析 HTML / JSON / 图片
- 渲染页面给你看
爬虫做的事情
爬虫做的事情 一模一样,只是:
| 人类 | 爬虫 |
|---|---|
| 浏览器 | Python requests |
| 眼睛看网页 | 程序解析数据 |
| 手动复制 | 自动保存 |
requests 就是“程序版浏览器”
什么是requests
Python 中一个 非常简单易用的 HTTP 请求库,主要用来与网络上的服务器进行沟通
requests 的官方定义
Requests is a simple, yet elegant HTTP library.
中文解释:
requests 是 Python 中一个非常简单、非常优雅的 HTTP 请求库
为什么爬虫一定要学 requests?
因为:
- 它是 Python 爬虫的第一步
- 几乎 所有爬虫框架(Scrapy / Playwright / Selenium)底层都离不开 HTTP
- 所有 API 抓取、本地测试、量化交易接口,100% 都用到 requests 思维
HTTP 协议基础
什么是 HTTP?
HTTP(HyperText Transfer Protocol)是:
客户端(Client)与服务器(Server)之间的通信规则
请求与响应模型
Client (你 / 爬虫)
↓ 请求(Request)
Server
↑ 响应(Response)
四、HTTP 请求的四大组成部分
| 部分 | 说明 |
|---|---|
| URL | 请求地址 |
| Method | 请求方法(GET / POST / PUT / DELETE) |
| Headers | 请求头(伪装浏览器) |
| Body | 请求数据(表单 / JSON) |
requests 的使用方法
pip install requests
可用于发送各种类型的 HTTP 请求,如 GET、POST、PUT、DELETE 等
发起 GET 请求
该网站会判断客户端是否为GET请求,如果是,那么它将会返回相对应的请求信息
import requests
response = requests.get('https://httpbin.org/get')
print(response.status_code) # 状态码
print(response.text) # 返回的 HTML 内容
response 是什么?
response 是一个 Response 对象
它包含了:
| 属性 | 说明 |
|---|---|
| response.status_code | HTTP 状态码 |
| response.text | 字符串形式的返回内容 |
| response.content | bytes(二进制) |
| response.json() | JSON 数据 |
| response.headers | 响应头 |
状态码 status code
这是通过server端会回传的状态码
为什么状态码这么重要?
爬虫本质是:
判断网页是否成功 → 决定要不要继续处理
服务器对客户端请求的响应结果,用来说明服务器是否成功处理了请求,或者发生了什么错误。
| 状态码 | 含义 | 示例说明 |
|---|---|---|
200 |
OK,请求成功 | 最常见。成功获取网页、API 数据等 |
201 |
Created,资源已创建 | 如 POST 创建资源成功 |
204 |
No Content,无内容返回 | 通常用于 DELETE 操作 |
301 |
永久重定向 | 网址永久搬家 |
302 |
临时重定向 | 网址临时跳转 |
304 |
Not Modified,未修改 | 浏览器缓存使用的响应 |
400 |
Bad Request,请求错误 | 参数格式不对、缺字段 |
401 |
Unauthorized,未授权 | 需要登录或 Token |
403 |
Forbidden,被禁止访问 | 有权限问题 |
404 |
Not Found,资源未找到 | URL 错误或数据不存在 |
429 |
Too Many Requests,过载请求 | 爬虫被封、限流触发 |
500 |
Internal Server Error,服务器内部错误 | 程序崩溃或bug |
502 |
Bad Gateway,网关错误 | 服务中间层出问题 |
503 |
Service Unavailable,服务不可用 | 服务器过载或维护 |
504 |
Gateway Timeout,网关超时 | 响应超时 |
状态码判断示例
if response.status_code == 200:
print("请求成功")
else:
print("请求失败", response.status_code)
带参数的 GET 请求(params)
URL 查询参数
https://example.com/search?q=python&page=2
使用 params
params = {
'q': 'python',
'page': 2
}
response = requests.get(url, params=params)
requests 会自动拼接 URL。
发起 POST 请求(提交表单)
- 登录
- 注册
- 提交表单
- 创建资源
payload = {'username': 'test', 'password': '123456'}
response = requests.post('https://httpbin.org/post', data=payload)
print(response.json())
发送 PUT 请求通常用于更新资源。例如:更新数据库中某条记录的内容。
import requests
url = 'https://httpbin.org/put'
data = {
'id': '123',
'name': 'Boon Hong'
}
response = requests.put(url, data=data)
print(response.status_code)
print(response.text)
发送 JSON 数据
json_data = {
'id': '123',
'status': 'active'
}
response = requests.put(url, json=json_data)
print(response.json())
| 类型 | 使用场景 |
|---|---|
| data | 表单提交 |
| json | API 请求 |
DELETE
发送 DELETE 请求用于删除资源,比如删除一个用户、文章、数据等。
url = 'https://httpbin.org/delete'
params = {'id': '123'}
response = requests.delete(url, params=params)
print(response.status_code)
print(response.json())
超时与异常处理
try:
response = requests.get(url, timeout=5)
except requests.exceptions.RequestException as e:
print(e)
上传文件
files = {'file': open('test.txt', 'rb')}
response = requests.post('https://httpbin.org/post', files=files)
文件下载
response = requests.get(img_url)
with open('img.jpg', 'wb') as f:
f.write(response.content)