通过套接字python3获取页面

时间:2018-05-29 19:30:06

标签: python-3.x sockets

我正在尝试通过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)

1 个答案:

答案 0 :(得分:0)

服务器是正确的:您发送的是错误的请求。不幸的是,您的请求有很多问题,这意味着没有简单的单一修复方法。绝对错误的是:

  • 没有标题末尾分隔符(即空行\r\n)。
  • 没有Host标头,这是HTTP / 1.1所必需的(正如您在示例中使用的请求看起来如何),标准不要求但大多数服务器仍需要HTTP / 1.0 (正如您在实际代码中使用的那样)。
  • 您不能在请求中添加https://个网址,并假设它会神奇地执行https。相反,您需要连接到服务器,进行SSL握手,然后发送正确的HTTP请求,该请求仅包含路径,但不包含完整的URL。当连接到代理时(您似乎尝试),甚至需要在将套接字升级到SSL之前添加一些CONNECT请求并读取其响应。
  • 您假设您可以使用端口80进行HTTPS,但默认情况下使用端口443,但是当连接到代理时,您实际上使用相同的HTTP和HTTP端口,尽管它通常类似于8000,8080或类似。
  • 也许更多。

简而言之:使用HTTP库。如果你不想使用一个研究HTTP标准而不只是看一些例子(如果你到目前为止都这样做)。