python 套接字获取

python socket GET

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

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

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

p.s. I know this isn't the best way to do it and that there are library like httplib and urllib2 out there, but I can't use those for this project (it's for school). I have to use the socket library

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

s.sendall("GET / HTTP/1.1\r\n\r\n")

此外,HTTP 1.1 指定您应该添加 Host header 字段,如 Host section in the HTTP 1.1 RFC.

中所述
s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n")

尝试替换此行:

s.sendall("GET / HTTP/1.1\r\n")

与:

s.sendall("GET / HTTP/1.1\r\n\r\n")
                             ^^^^

此外,我认为您需要将 s.close 替换为 s.close(),因为它是一个函数。

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

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

GET / HTTP/1.1

所以你的代码应该是:

s.sendall('GET / HTTP/1.1\r\n\r\n')

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

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

''')

抱歉浪费大家的时间。我刚刚在 Stack Overflow 上找到了这个解决方案 here(只是在我的 Google 搜索中进行了一些改写以找到)

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)

所有关于结尾 \r\n\r\n 的答案都是正确的,但是那些返回 301 状态。这个解决方案似乎以某种方式遵循重定向?不管怎样,这个解决方案对我有用

我正在清理 Python 3 的示例。我们需要 bytes/string 转换,我们还可以使用 with:

自动关闭连接
#!/usr/bin/env python3

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:

    s.connect(("example.com" , 80))
    s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nAccept: text/html\r\n\r\n")
    print(str(s.recv(4096), 'utf-8'))

@james:你在没有意识到的情况下在那里进行了 SlowLoris 攻击。我无法比这里更好地解释,https://www.youtube.com/watch?v=XiFkyR35v2Y 我假设您从上述所有答案中找到了解决方案,但我只是回答让您知道这一点。 :)