gpt4 book ai didi

Python 套接字错误 300 'Moved Permanently'

转载 作者:行者123 更新时间:2023-12-03 12:03:19 25 4
gpt4 key购买 nike

我一直在尝试运行此代码以开始与不同站点的通信,但无法建立一个。有人可以帮我解决我在这里缺少的东西吗?

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)

每次使用不同的站点时,我都会收到此错误消息:
<socket.socket fd=508, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>

151.101.152.223
b'HTTP/1.1 301 Moved Permanently\r\nServer: Varnish\r\nRetry-After: 0\r\nLocation: https://www.python.org/\r\n内容长度:0\r\n接受范围:字节\r\n日期:格林威治标准时间 2018 年 12 月 5 日星期三 17:10:03\r\n通过:1.1 清漆\r\n连接:关闭\r\nX-服务者:cache-bom18222-BOM\r\nX-Cache:HIT\r\nX-Cache-Hits:0\r\nX-Timer:S1544029803.224270,VS0,VE0\r\nStrict-Transport-Security:最大年龄=63072000;包括子域\r\n\r\n'

最佳答案

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

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

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

此外,行和标题分隔符必须是 \r\n而不仅仅是 \n你用过。大多数服务器会忽略差异。

另外, HTTP/1.1隐式启用持久 HTTP 连接(HTTP keep-alive)。这意味着服务器可能不会像您的代码所期望的那样在响应后立即关闭连接,但可能会等待很长时间才能在同一连接中获得更多请求。对于这样简单的请求,最好使用 HTTP/1.0它没有隐式保持事件,并且在其他方​​面也更简单(没有分 block 传输编码)。
.... b'HTTP/1.1 301 Moved Permanently ... Location: https://www.python.org/

这甚至不是错误。这是一个 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 堆栈,那么请研究该标准 - 该协议(protocol)比简单查看几个示例所暗示的要复杂得多。

关于Python 套接字错误 300 'Moved Permanently',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53637607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com