隧道代理的两种写法和差异,选择更加保护真实IP的写法

scrapy中隧道代理的以下两种写法有什么不同?

写法1

tunnel_host = ""
tunnel_port = 
# # 隧道id和密码
tid = ''
passw = ""
proxies = {
    "http": "http://%s:%s@%s:%s/" % (tid, pw, tunnel_host, tunnel_port),
    "https": "http://%s:%s@%s:%s/" % (tid, password, tunnel_host, tunnel_port)
}
request.meta['proxy'] = proxies["http"]
request.headers["User-Agent"] = UserAgent().random
# request.headers["Connection"] = "close"

写法2

proxy = "tps.kdlapi.com:-----"
request.meta['proxy'] = "http://%(proxy)s" % {'proxy': proxy}
# # 用户名密码认证
request.headers['Proxy-Authorization'] = basic_auth_header('', '')  # 白名单认证可注释此行
# request.headers["Connection"] = "close"

这两种写法的主要区别在于代理服务器的形式和认证方式。

第一种写法使用了隧道代理,代理服务器的形式是 http://username:password@host:port/,其中 username 和 password 是代理服务器的用户名和密码,host 和 port 是代理服务器的主机名和端口号。这种写法需要在 request.meta[‘proxy’] 中设置代理服务器,同时需要设置 User-Agent 请求头,以避免被目标网站识别为爬虫。

第二种写法则直接指定了代理服务器的主机名和端口号,代理服务器的形式是 http://host:port/,没有使用隧道代理。这种写法需要在 request.meta[‘proxy’] 中设置代理服务器,并且需要设置 Proxy-Authorization 请求头,以进行基本认证(白名单认证)。

总的来说,第一种写法使用了隧道代理,可以更好地隐藏客户端的真实 IP 地址,但需要在代理服务器上进行认证。第二种写法则直接指定了代理服务器的地址,认证方式比较简单,但客户端的真实 IP 地址可能会暴露。根据具体的需求和代理服务器的配置,选择合适的写法。

为什么不论哪种写法这里都是使用http请求

隧道代理(Tunneling Proxy)是一种代理服务器,其作用是在客户端和目标服务器之间建立一条通道,使得客户端可以通过代理服务器与目标服务器进行通信。这种代理服务器通常用于代理 HTTPS 流量,因为 HTTPS 流量使用加密的 SSL/TLS 协议进行传输,代理服务器无法对其进行解密和篡改。

在建立隧道时,客户端会向代理服务器发送一个 CONNECT 请求,请求连接到目标服务器的指定端口。代理服务器接收到 CONNECT 请求后,会建立一条与目标服务器的 TCP 连接,并将该连接的数据转发给客户端。此后,客户端和目标服务器之间的通信就会通过这条 TCP 连接进行,代理服务器只负责转发数据,不会对其进行解密或修改。

HTTP隧道是使用一个更高层的协议(HTTP)来传输一个更低层的协议(TCP)。HTTP协议定义了一个叫做CONNECT的请求方法,它可以启动与请求资源的双向通信,并且可以用来打开一个隧道。参考链接如下1 2。

只有初始的连接请求是HTTP的,之后,服务器只是代理已经建立的TCP连接。这种机制是客户端在HTTP代理后面如何访问使用SSL或TLS(即HTTPS)的网站的方式。参考链接如下3 4。

因为建立隧道需要使用 CONNECT 请求,而 CONNECT 请求是一个 HTTP 请求,所以隧道代理通常使用 HTTP 协议进行通信。当然,代理服务器也可以使用其他协议(如 SOCKS)来实现隧道代理,但 HTTP 协议比较常用,因为它是互联网上最常用的协议之一,且能够通过大多数防火墙和代理服务器。

request.headers[“Connection”] = "close"是什么意思

request.headers[“Connection”] = “close” 是设置 HTTP 请求头的一个操作,其作用是告诉目标服务器在完成响应后关闭与客户端的连接。

在 HTTP/1.1 中,连接默认是持久化的,即同一个客户端可以发送多个请求,而不需要每次都建立新的连接。这样可以提高性能,但也可能导致一些问题,比如服务器无法判断客户端的请求是否已经结束,从而无法及时释放资源。为了解决这个问题,HTTP/1.1 规定可以使用 Connection 请求头来控制连接的行为。

当客户端发送一个带有 Connection: close 请求头的请求时,它告诉服务器在完成响应后关闭连接。这样,服务器就可以及时释放资源,避免出现一些问题,比如资源泄漏、连接超时等等。当然,这也意味着客户端需要为每个请求建立新的连接,可能会降低性能。

在使用隧道代理时,由于代理服务器会在客户端和目标服务器之间建立一条 TCP 连接,因此需要使用 Connection: close 请求头来告诉目标服务器在完成响应后关闭连接,否则连接可能会一直保持,导致资源浪费。

你可能感兴趣的:(tcp/ip,服务器,scrapy,网络协议,python)