6.1 为什么需要代理?
现在每个国家都有自己的互联网规则。被禁止访问的已经不是个别用户,而是整个网站、域、应用程序甚至国家。这不太好,但如果你是程序员,这就不是问题——网络上有很多代理服务器...
代理服务器(或简而言之代理) 是在客户端(例如您的计算机)和您尝试访问的服务器之间充当中介的中间服务器。代理服务器接受来自客户端的请求,将其转发到目标服务器,获取响应并将其发回给客户端。
每个大型产品至少有几个代理服务器执行不同的有用功能,例如:
- 匿名化:代理服务器可以隐藏客户端的真实IP地址,提供匿名访问互联网资源。IP地址是网络中设备的唯一标识符,隐藏它有助于保护用户隐私。
- 缓存:代理服务器可以缓存经常请求的资源,加快访问速度并减少网络资源负担。例如,如果许多用户请求同一个网页,代理服务器可以保存其副本并直接提供,而不必每次都访问原始服务器。
- 内容过滤:代理服务器可以阻止访问特定网站或内容类型,提供控制和安全性。
- 绕过访问限制:代理服务器可以帮助绕过区域性的内容访问限制,提供对特定地理区域被封锁资源的访问。
- 日志和监控:代理服务器可以记录所有请求和响应,允许跟踪和分析网络流量。
代理服务器的工作原理
- 客户端发送请求:客户端设备(例如计算机或智能手机)向代理服务器发送请求。
- 代理服务器处理请求:代理服务器接收请求,可以修改它(例如,添加或删除头部)并将其转发到目标服务器。
- 目标服务器响应:目标服务器处理请求并将响应发送到代理服务器。
- 代理服务器将响应返回给客户端:代理服务器从目标服务器接收响应,可以缓存以供后续使用,并将其转发给客户端。
使用代理服务器的优势
- 提高安全性:代理服务器可以将内部网络与外部世界隔离,降低攻击风险。
- 加速访问:缓存经常请求的资源减少了访问时间。
- 访问控制:代理服务器可以限制对特定网站或内容类型的访问,确保对网络使用的控制。
- 减少网络负担:通过缓存和流量过滤,代理服务器可以减少整体数据传输量和网络负担。
许多服务器程序为了安全起见没有直接访问互联网的权限。相反,它们通过代理访问互联网,而代理已经有允许的站点和资源列表。所以你的程序也应该能够与代理一起工作。
尽管有许多优点,但使用代理服务器也可能有缺点。例如,由于请求通过额外的环节,可能会导致连接速度下降。此外,一些网站可能会阻止来自已知代理服务器的访问。
6.2 代理和 requests 模块
requests 库支持通过 proxies 参数使用代理服务器。
HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)是互联网数据传输协议。HTTPS 是 HTTP 的安全版本。由于 HTTPS 的加密特性,它们可能需要不同的代理服务器来进行处理。
HTTP 代理的使用示例
通常以一个代理列表作为代理。这非常方便,如果部分代理被封或不可用。
使用代理调用函数 requests.get() 的示例。
import requests
# 要请求的 URL 地址
url = 'http://httpbin.org/ip'
# 代理服务器设置
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', }
# 通过代理发送 GET 请求
response = requests.get(url, proxies=proxies)
print(response.json())
http 请求将通过第一个代理服务器发送,而 https 请求通过第二个。
使用带身份验证的代理示例
许多代理服务器要求先进行身份验证,然后才能使用。我们可以用一个有趣的方法来实现...
当最初设计 URL 时,标准 URL 允许在其中直接传递资源的登录名和密码。它看起来像这样:
http://user:password@domain/path
因此,如果代理服务器要求认证,可以将凭据包含在 URL 中。
示例:
import requests
# 要请求的 URL 地址
url = 'http://httpbin.org/ip'
# 带身份验证的代理服务器设置
proxies = { 'http': 'http://user:password@10.10.1.10:3128',
'https': 'http://user:password@10.10.1.10:1080', }
# 通过代理发送 GET 请求
response = requests.get(url, proxies=proxies)
print(response.json())
我还没有见过在实际应用中使用这种方式的情况,但如果你要搭建自己的测试代理服务器,那就何乐而不为呢。
不过值得注意的是,在 URL 中传递用户名和密码可能不安全,因为 URL 可能会被浏览器的历史记录或服务器日志存储。在实际应用中,应该使用更安全的认证方法。
在实际应用中,记得安全存储代理服务器的凭证。不要在代码或配置文件中以明文形式保存密码。相反,使用环境变量或安全的秘密存储。
6.3 代理和 http.client
使用 http.client 模块与代理服务器交互需要手动设置连接和请求头。
只需在创建连接时指定 host 和 port。
示例:
# 代理服务器设置
proxy_host = '10.10.1.10'
proxy_port = 3128
# 创建代理服务器连接
conn = http.client.HTTPConnection(proxy_host, proxy_port)
然后需要与代理服务器建立隧道,之后再发送请求:
dest_url = 'httpbin.org'
dest_path = '/ip'
# 形成并发送请求
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
为了验证代理服务器是否正常工作,可以对比使用代理前后的 IP 地址。可以使用显示当前 IP 的服务,例如 httpbin.org/ip。
很「简单」。完整的 http.client 使用 HTTP 代理的示例如下:
import http.client
# 代理服务器设置
proxy_host = '10.10.1.10'
proxy_port = 3128
dest_url = 'httpbin.org'
dest_path = '/ip'
# 创建代理服务器连接
conn = http.client.HTTPConnection(proxy_host, proxy_port)
# 形成并发送请求
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
# 获取响应
response = conn.getresponse()
print(response.status, response.reason)
print(response.read().decode('utf-8'))
# 关闭连接
conn.close()
怎么说呢?使用 requests 模块当然会简单一些。但是!许多模块和框架在底层使用的正是 http.client。你需要了解如何与其交互,以便正确配置它们的工作。
尽管有许多优点,使用代理服务器也可能会有缺点。例如,由于请求通过额外的环节,可能会导致连接速度下降。此外,一些网站可能会阻止来自已知代理服务器的访问。因此,当使用代理时,总是需要考虑其优点和潜在的限制。
GO TO FULL VERSION