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
我假设您从上述所有答案中找到了解决方案,但我只是回答让您知道这一点。 :)
从关于堆栈溢出的其他帖子来看,这应该有效
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
andurllib2
out there, but I can't use those for this project (it's for school). I have to use thesocket
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 我假设您从上述所有答案中找到了解决方案,但我只是回答让您知道这一点。 :)