第五课:代理池
在使用 Requests 爬虫 或者在命令行中使用 网络请求命令(比如 curl)时,可以手动指定代理服务器,从而 实现请求被转发的效果。
(一)requests 代理
一个普通的爬取 百度首页 的爬虫如下:
import requests
headers={'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'}
response=requests.get('http://www.baidu.com/',headers=headers)
print("访问结果:",response.status_code)
print(response.text[:500])
但是现在我们直接使用了自己的 IP 去爬。而对于某些网站而言,如果短时间内访问的次数太多,就会触发警报,限制这个 IP 的访问请求,从而导致爬取失败。因此可以使用 **代理(Proxy)**的方式,转发本地的访问请求。例如使用一个网上的公共代理IP地址:43.248.63.89:80
import requests
proxy = "43.248.63.89:80"
headers={'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'}
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}",
}
response=requests.get('http://www.baidu.com/',headers=headers)
print("访问结果:",response.status_code)
print(response.text[:500])
现在,我们对百度的请求就是通过这个节点转发的。同样的道理,如果我们有很多的 代理IP,并在爬虫过程中不停地切换IP,那么就可以大大降低被检测到的概率。这样的 代理IP集合 被称为 代理池(ProxyPool)
(二)代理地址的分类
我们可以从三个维度来划分代理:
1. 按协议类型分类
| 类型 | 描述 | 应用场景 |
|---|---|---|
| HTTP 代理 | 只代理 HTTP 请求,不支持 HTTPS | 适合请求纯 HTTP 网站 |
| HTTPS 代理(也叫 HTTP CONNECT) | 支持 HTTPS,能建立加密隧道 | 最常见,适用于抓 HTTPS 网站,如 Google、百度 |
| SOCKS5 代理 | 底层代理协议,支持任意 TCP(甚至 UDP)连接,不限于 HTTP 协议 | 最强大,适用于翻墙、P2P、SSH、邮件等任意流量 |
| SOCKS4 | SOCKS5 的早期版本,不支持认证 | 基本已淘汰 |
说明:
requests默认支持 HTTP/HTTPSSOCKS5需要用第三方包(如requests[socks]或PySocks)
2. 按 IP 类型分类
| 类型 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| 数据中心代理(Datacenter Proxy) | 来自云服务器(如 AWS、阿里云) | 快速、便宜、易得 | 容易被识别为爬虫 |
| 住宅代理(Residential Proxy) | 分配给真实家庭用户的 IP,ISP(互联网服务供应商) 提供 | 不易被封,模拟真实用户 | 贵,有时较慢 |
| 移动代理(Mobile Proxy) | 来自 3G/4G/5G 蜂窝网络的设备 | 最难识别,非常稳定 | 最贵,资源稀缺 |
一般公开免费代理几乎都是数据中心代理。