Python Can';无法使用套接字获取所需内容
我试图通过使用Python Can';无法使用套接字获取所需内容,python,python-3.x,sockets,web-scraping,Python,Python 3.x,Sockets,Web Scraping,我试图通过使用socket获取可见内容,但不幸的是,我在执行脚本时出错。由于我对使用socket编写代码非常陌生,所以我不知道我哪里出错了 我的代码: import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host_ip = socket.gethostbyname('data.pr4e.org') s.connect((host_ip,80)) cmd = "GET http://data.pr4e.org/r
socket
获取可见内容,但不幸的是,我在执行脚本时出错。由于我对使用socket
编写代码非常陌生,所以我不知道我哪里出错了
我的代码:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host_ip = socket.gethostbyname('data.pr4e.org')
s.connect((host_ip,80))
cmd = "GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n".encode()
s.send(cmd)
while True:
data = s.recv(1024)
if (len(data) <1 ):
break
print(data.decode())
s.close()
我可以通过在请求命令的末尾添加
\r\n\r\n
而不是原始的\n\n
来获得所需的结果:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostbyname('data.pr4e.org'), 80))
s.sendall("GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n".encode())
print(s.recv(1024))
输出:
...
Content-Type: text/plain\r\n\r\nBut soft what light through yonder window breaks\nIt is the east and Juliet is the sun\nArise fair sun and kill the envious moon\nWho is already sick and pale with grief\n'
这里有多个问题:
http://data.pr4e.org
在获取之后
(请参阅),除非与代理交谈。您通常会编写GET/romeo.txt
,并以。服务器需要支持您使用的表单,但它们可能会违反标准并被阻塞。如果您声称使用的是HTTP/1.0,那么这种情况尤其可能发生,因为HTTP/1.0更严格、更安全GET
之后\r\n
(“CRLF”)作为换行符(请参阅),因此\n
可能并不总是被理解。同样,有些服务器会正确处理它,但它是不符合要求的。CRLF的使用已得到改进print(data.decode())
将在data
的末尾添加一个额外的换行符。如果TCP对大型HTTP响应进行分段,从而使recv()
返回多个非空字符串,则这可能会成为一个问题。改用打印(data.decode(),end='')
此错误来自服务器。您的脚本正在正确读取响应。最好使用请求库。。。。是一个相关的SO问题。这是对该问题的完全有效的批评,但这并不意味着它是一个答案。@barny:
\r\n
问题是OP在本例中出现特定错误的原因,因此我不认为这是“非答案”。只需使用请求
库,这样你就不会碰到很多其他问题,请求
已经解决了。@barny我同意,但是,OP特别尝试使用套接字
。
...
Content-Type: text/plain\r\n\r\nBut soft what light through yonder window breaks\nIt is the east and Juliet is the sun\nArise fair sun and kill the envious moon\nWho is already sick and pale with grief\n'