python Web浏览器中的400错误请求

时间:2020-07-23 15:41:27

标签: python sockets server

我是Python的新手,正在尝试从网站打开.txt文件。

我的代码是:

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

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

我得到消息: 错误的请求-您的浏览器发送了此服务器无法理解的请求。

我可以使用urllib读取.txt文件,但我不明白为什么它不能以这种方式工作。

2 个答案:

答案 0 :(得分:1)

您可以只使用请求吗?

# python -m pip install —user requests
import requests
r = requests.get('http://data.pr4e.org/romeo.txt')

print(r.text)

from urllib import request

r = request.urlopen('http://data.pr4e.org/romeo.txt')
text = b''
for line in r:
    text+=line
print(text)

最后一个工作的插座

import socket

uri = 'data.pr4e.org'
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((uri, 80))
    cmd = f'GET /romeo.txt HTTP/1.0\r\nHost: {uri}\r\n\r\n'.encode()
    s.send(cmd)

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

答案 1 :(得分:1)

问题出在您的请求中\ n \ n。

“请求/状态行和标头必须全部以CR LF结尾(即回车后跟换行符)。”

您需要使用\ r \ n

将行更改为此:

cmd = 'GET data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()

此处的答案相同: Getting a 400 Bad Request Error Using Socket in Python 3