Python套接字错误300“永久移动”

2024-05-15 17:59:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直试图运行这段代码,以开始与不同的网站通信,但无法建立一个。有人能帮我弥补我在这里缺少的东西吗?在

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(s)

server = 'www.python.org'
port = 80 #defining port / acting like a browser

server_ip = socket.gethostbyname(server)
print(server_ip)

request = "GET / HTTPS/1.1\nHost: "+server+"\n\n"
s.connect((server_ip,port))
s.send(request.encode())
result = s.recv(4096)

while (len(result) > 0):
     print(result)
     result = s.recv(1024)

每次使用不同的站点时,我都会收到以下错误消息:

^{pr2}$

151.101.152.223 b'HTTP/1.1 301永久移动\r\n服务器:Varnish\r\n重试时间:0\r\n位置:https://www.python.org/\r\n内容长度:0\r\n接受范围:字节\r\n日期:星期三,2018年12月5日17:10:03 GMT\r\nVia:1.1 Varnish\r\n连接:关闭\r\nX服务者:cache-bom18222-BOM\r\nX缓存:命中\r\nX缓存命中数:0\r\nX计时器:S1544029803.224270,VS0,VE0\r\n严格传输安全性:最大年龄=63072000;includeSubDomains\r\n\r\n'


Tags: 代码orgimportipserver网站portrequest
1条回答
网友
1楼 · 发布于 2024-05-15 17:59:56

此请求在多个级别上是错误的:

port = 80 #defining port / acting like a browser
...
request = "GET / HTTPS/1.1\nHost: "+server+"\n\n"

没有HTTPS/1.1协议。只有HTTP/1.1。要访问https://..URL,您需要首先连接到站点(默认端口443,而不是您使用的80),upgrade the TCP socket to SSL,并发出一个正确的HTTP请求,即使用HTTP/1.1而不是{}。在

另外,行和标题分隔符必须是\r\n,而不是仅使用\n。不过,大多数服务器会忽略这一区别。在

另外,HTTP/1.1隐式地启用持久的HTTP连接(HTTP保持活动)。这意味着服务器可能不会像代码预期的那样在响应后立即关闭连接,但可能会在同一连接内等待较长时间的更多请求。对于这种简单的请求,最好使用HTTP/1.0,它没有隐式keep-alive,在其他方面也更简单(没有分块传输编码)。在

^{pr2}$

这甚至不是一个错误。这是一个HTTP重定向,它表示您应该使用https://访问站点(您可能尝试过这样做,但方法错误)。在

最后,您的代码可能如下所示:

import socket
import ssl

(server,port) = ('www.python.org',443)
request = "GET / HTTP/1.0\r\nHost: "+server+"\r\n\r\n"

s = socket.socket()
s.connect((server,port))
s = ssl.create_default_context().wrap_socket(s, server_hostname=server)
s.send(request.encode())

result = s.recv(4096)
while (len(result) > 0):
     print(str(result))
     result = s.recv(1024)

不过,即使这段代码正常工作,我还是建议您使用像requests这样的HTTP库。如果你坚持自己编写HTTP协议栈,那么请学习一下这个标准——协议比简单地看几个例子要复杂得多。在

相关问题 更多 >