【问题标题】:Retrieve data from http using socket libfrary in python在python中使用socket libfrary从http中检索数据
【发布时间】:2020-07-13 15:30:07
【问题描述】:

我正在使用以下代码从该 URL 打印数据 http://data.pr4e.org/romeo.txt

我已经在 windows 10.1 系统上尝试过这段代码。是否有任何修改需要我在 cmd 中转义 (400 Bad Request) 结果。

#代码

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org',80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if len(data) < 1:
        break
    print(data.decode())

mysock.close()

输出:

C:\Users\Taufique\Desktop\p4e>python socket1.py HTTP/1.1 400 错误请求 日期:2020 年 7 月 13 日星期一 15:08:08 GMT 服务器:Apache/2.4.18 (Ubuntu) 内容长度:308 连接:关闭 内容类型:文本/html;字符集=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at do1.dr-chuck.com Port 80</address>
</body></html>

【问题讨论】:

    标签: python sockets http-headers httprequest


    【解决方案1】:

    首先,您的代码目前对我有效,即使它是错误的。但许多服务器试图解决损坏的客户端。

    这是您当前的 HTTP 请求(为清楚起见添加了换行符)

    GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n
    \r\n
    

    这应该是您的 HTTP 请求

    GET /romeo.txt HTTP/1.0\r\n
    Host: data.pr4e.org\r\n
    \r\n
    

    有关更多信息,请参阅标准 - 这就是标准的用途。不要认为 HTTP 很简单,因为它都是基于文本的。实际上,它可能是一个复杂的协议。如果错误代码(如您的代码)不再能够解决这种特定类型的损坏代码,它们可能会在同一台服务器或其他服务器上正常运行并在以后中断。

    【讨论】:

    • 给定的 HTTP 请求显示语法错误。 SyntaxError:扫描字符串文字时 EOL。我在对象 cmd 中使用了这些请求。请再次查看代码。
    • @TaufiqueRahman:我只能猜测你做错了什么,因为你没有提供你实际所做的任何代码。
    【解决方案2】:

    我弄错了。代码如下。

    import socket
    
    mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    mysock.connect(('data.pr4e.org',80))
    cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
    mysock.send(cmd)
    
    while True:
        data = mysock.recv(512)
        if len(data) < 1:
            break
        print(data.decode(),end='')
    
    mysock.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 2015-12-21
      • 2019-01-20
      • 1970-01-01
      • 2016-07-31
      • 2018-10-16
      • 2014-02-05
      相关资源
      最近更新 更多