我一直试图运行这段代码,以开始与不同的网站通信,但无法建立一个。有人能帮我弥补我在这里缺少的东西吗?在
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'
此请求在多个级别上是错误的:
没有}。在
HTTPS/1.1
协议。只有HTTP/1.1
。要访问https://..
URL,您需要首先连接到站点(默认端口443,而不是您使用的80),upgrade the TCP socket to SSL,并发出一个正确的HTTP请求,即使用HTTP/1.1
而不是{另外,行和标题分隔符必须是
\r\n
,而不是仅使用\n
。不过,大多数服务器会忽略这一区别。在另外,
^{pr2}$HTTP/1.1
隐式地启用持久的HTTP连接(HTTP保持活动)。这意味着服务器可能不会像代码预期的那样在响应后立即关闭连接,但可能会在同一连接内等待较长时间的更多请求。对于这种简单的请求,最好使用HTTP/1.0
,它没有隐式keep-alive,在其他方面也更简单(没有分块传输编码)。在这甚至不是一个错误。这是一个HTTP重定向,它表示您应该使用
https://
访问站点(您可能尝试过这样做,但方法错误)。在最后,您的代码可能如下所示:
不过,即使这段代码正常工作,我还是建议您使用像requests这样的HTTP库。如果你坚持自己编写HTTP协议栈,那么请学习一下这个标准——协议比简单地看几个例子要复杂得多。在
相关问题 更多 >
编程相关推荐