python socket GET

jam*_*ith 8 python python-sockets

从堆栈溢出的其他帖子来看,这应该是有效的

import socket

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

s.connect(("www.cnn.com" , 80))
s.sendall("GET / HTTP/1.1\r\n")
print s.recv(4096)
s.close
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它只是挂起(at recv)并且从不打印.我知道对www.cnn.com的请求会将数据分块,但我至少应该从中读取一些内容recv,对吧?

PS我知道这是不是做到这一点的最好办法,而且有像库httpliburllib2在那里,但我不能使用那些为这个项目(这是学校).我必须使用该socket

Tak*_*kis 14

您忘记在请求行后发送空行:

s.sendall("GET / HTTP/1.1\r\n\r\n")
Run Code Online (Sandbox Code Playgroud)

此外,HTTP 1.1指定您应该添加Host标头字段,如HTTP 1.1 RFC中的Host部分所述.

s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n")
Run Code Online (Sandbox Code Playgroud)


mha*_*wke 5

您的代码几乎是正确的,但您需要发送2个\r\n序列以满足HTTP协议.

有效的GET请求将如下所示(注2行):

GET / HTTP/1.1

所以你的代码应该是:

s.sendall('GET / HTTP/1.1\r\n\r\n')
Run Code Online (Sandbox Code Playgroud)

此外,有效的HTTP 1.1请求还需要额外的标头,例如Host:.您需要将它们添加到您的请求中,如下所示:

s.sendall('''GET / HTTP/1.1
Host: cnn.com

''')
Run Code Online (Sandbox Code Playgroud)


jam*_*ith 5

很抱歉浪费大家的时间。我刚刚发现这个解决方案在这里对堆栈溢出(只是把我在谷歌的一些措词搜索找到)

import socket
request = b"GET / HTTP/1.1\nHost: www.cnn.com\n\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("cnn.com", 80))
s.send(request)
result = s.recv(10000)
while (len(result) > 0):
    print(result)
    result = s.recv(10000)
Run Code Online (Sandbox Code Playgroud)

关于结局,所有答案都是正确的,\r\n\r\n但是返回的301状态是正确的。此解决方案似乎以某种方式遵循重定向?无论如何,这个解决方案对我有用