CodeGym /课程 /Python SELF ZH /使用代理

使用代理

Python SELF ZH
第 24 级 , 课程 0
可用

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 模块与代理服务器交互需要手动设置连接和请求头。

只需在创建连接时指定 hostport

示例:


# 代理服务器设置
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。你需要了解如何与其交互,以便正确配置它们的工作。

尽管有许多优点,使用代理服务器也可能会有缺点。例如,由于请求通过额外的环节,可能会导致连接速度下降。此外,一些网站可能会阻止来自已知代理服务器的访问。因此,当使用代理时,总是需要考虑其优点和潜在的限制。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION