我正在尝试通过python 3中的套接字代理获取页面。我首先建立与https://sslproxies.org上列出的代理的连接,然后发送GET
请求:
GET https://icanhazip.com HTTP/1.1\r\n
但它给出了一个错误,说:
HTTP错误请求400(数据无效)
所以我尝试使用HTTP/1.0
避免使用Host参数,但这也无效。
哪些请求有效?
完整代码:
import socket
s = socket.socket()
host = "xx.xx.xx.xx"
port = 80
s.connect((host, port))
s.sendall("GET https://icanhazip.com HTTP/1.0\r\n".encode("utf-8"))
res = s.recv(10000)
while len(res) > 0:
print(res)
res = s.recv(10000)
答案 0 :(得分:0)
服务器是正确的:您发送的是错误的请求。不幸的是,您的请求有很多问题,这意味着没有简单的单一修复方法。绝对错误的是:
\r\n
)。Host
标头,这是HTTP / 1.1所必需的(正如您在示例中使用的请求看起来如何),标准不要求但大多数服务器仍需要HTTP / 1.0 (正如您在实际代码中使用的那样)。https://
个网址,并假设它会神奇地执行https。相反,您需要连接到服务器,进行SSL握手,然后发送正确的HTTP请求,该请求仅包含路径,但不包含完整的URL。当连接到代理时(您似乎尝试),甚至需要在将套接字升级到SSL之前添加一些CONNECT请求并读取其响应。简而言之:使用HTTP库。如果你不想使用一个研究HTTP标准而不只是看一些例子(如果你到目前为止都这样做)。