Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';无法使用套接字获取所需内容_Python_Python 3.x_Sockets_Web Scraping - Fatal编程技术网

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更严格、更安全
  • 没有人再使用HTTP/1.0了。所有现代浏览器和其他HTTP客户端都使用HTTP/1.1或HTTP/2。有些服务器将支持HTTP/1.0,但这不是强制性的。请注意HTTP/1.1,即使您将完整URL放在
    GET
    之后
  • HTTP/1.0使用
    \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'