4、HTTP协议与网络请求实战
说实话,做数据采集这行,HTTP协议就是你的吃饭家伙。我见过太多新手,代码写得挺溜,结果一遇到请求失败就抓瞎。说白了,就是没搞懂HTTP到底在干什么。
这一章,咱们就把HTTP协议掰开揉碎了讲。我会结合自己踩过的坑,带你真正掌握网络请求的实战技巧。
4.1 HTTP/HTTPS协议详解
HTTP,全称超文本传输协议。你想想看,你在浏览器里输入一个网址,回车,页面就出来了。这背后就是HTTP在干活。
它本质上是一个「请求-响应」模型。客户端发个请求,服务器回个响应。就这么简单。
但这里有个大问题——HTTP是明文传输的。我在项目中遇到过,抓包工具一开,用户名密码全裸奔。这谁受得了?
所以就有了HTTPS。它就是在HTTP外面套了一层SSL/TLS加密。说白了,就是给数据穿了个防弹衣。
核心区别:
- HTTP:端口80,明文传输,容易被中间人攻击
- HTTPS:端口443,加密传输,安全性高
我的建议:做数据采集时,能用HTTPS就别用HTTP。虽然加密解密会多消耗一点性能,但安全第一。我曾经因为用了HTTP,被对方服务器直接封了IP。
4.2 请求方法(GET/POST/PUT/DELETE)
HTTP定义了多种请求方法。但咱们做采集,最常用的就四个:GET、POST、PUT、DELETE。
| 方法 | 用途 | 特点 |
|---|---|---|
| GET | 获取资源 | 参数在URL中,有长度限制,不安全 |
| POST | 提交数据 | 参数在请求体中,无长度限制,相对安全 |
| PUT | 更新资源 | 幂等,多次执行结果相同 |
| DELETE | 删除资源 | 幂等,用于删除指定资源 |
我个人习惯,采集数据时90%的情况用GET和POST就够了。GET用来获取页面内容,POST用来提交表单或登录。
注意:GET请求的参数会暴露在URL里。我曾经见过有人把密码直接写在URL里,结果被日志记录下来。嗯,这很危险。
4.3 请求头与参数设置
请求头,说白了就是告诉服务器「我是谁、我要什么」。很多网站的反爬机制,就是靠检查请求头来识别的。
常见的请求头有:
- User-Agent:标识客户端类型。我建议模拟成真实的浏览器
- Referer:来源页面。有些网站会检查这个
- Cookie:身份凭证。后面会详细讲
- Content-Type:请求体的格式。POST请求时特别重要
举个例子,你想想看,如果你用Python的requests库发请求,默认的User-Agent是「python-requests/2.x」。服务器一看就知道是爬虫,直接给你返回403。
所以,我一般会这样设置:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.example.com/',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
response = requests.get(url, headers=headers)
避坑指南:我曾经因为没设置Referer,被一个电商网站拦截了整整一天。后来发现,它要求Referer必须是首页地址。所以,多观察、多模拟,准没错。
4.4 Session与Cookie管理
HTTP是无状态的。什么意思?就是服务器记不住你是谁。你第一次访问和第二次访问,它都当你是陌生人。
那怎么解决?靠Session和Cookie。
简单来说:
- Cookie:存在客户端,保存用户信息
- Session:存在服务器端,保存会话状态
服务器通过Cookie里的Session ID,来识别你是谁。嗯,这里要注意,很多网站的反爬就是靠检查Session是否连续。
在requests库里,管理Session很简单:
# 创建一个Session对象
session = requests.Session()
# 第一次请求,自动保存Cookie
session.get('https://www.example.com/login')
# 后续请求,自动携带Cookie
response = session.get('https://www.example.com/profile')
我个人习惯,只要是需要登录的网站,一律用Session。它自动帮你管理Cookie,省心省力。
注意:Session对象会保存所有Cookie。如果你同时采集多个网站,记得创建不同的Session实例。我曾经因为共用Session,导致A网站的Cookie被带到了B网站,结果B网站直接报错。
4.5 使用requests库发送请求
requests库,Python里最优雅的HTTP库。没有之一。我用了这么多年,真心推荐。
先安装:
pip install requests
基本用法:
import requests
# GET请求
response = requests.get('https://api.example.com/data')
# POST请求
data = {'username': 'admin', 'password': '123456'}
response = requests.post('https://api.example.com/login', data=data)
# 带参数的GET请求
params = {'page': 1, 'size': 20}
response = requests.get('https://api.example.com/list', params=params)
# 带JSON的POST请求
json_data = {'name': '张三', 'age': 25}
response = requests.post('https://api.example.com/user', json=json_data)
你想想看,如果不用requests,用Python自带的urllib,代码得写多长?
这里有几个实用技巧:
- 超时设置:一定要加timeout参数,防止请求卡死
- 重试机制:网络不稳定时,自动重试
- 代理设置:需要换IP时,用proxies参数
# 带超时和代理的请求
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'http://127.0.0.1:8080'
}
try:
response = requests.get(
'https://api.example.com/data',
timeout=5,
proxies=proxies
)
response.raise_for_status() # 检查状态码
except requests.exceptions.RequestException as e:
print(f'请求失败:{e}')
核心要点:
- 始终设置超时,避免程序卡死
- 使用Session管理Cookie
- 模拟真实浏览器的请求头
- 处理异常,做好重试机制
好了,这一章的内容就到这里。HTTP协议其实不难,关键是多练、多踩坑。下一章,咱们会讲数据解析,到时候你会感谢今天学的这些网络请求知识。