Получение данных из http с помощью socket libfrary в python - PullRequest
0 голосов
/ 13 июля 2020

Я использую приведенный ниже код для печати данных с этого URL-адреса http://data.pr4e.org/romeo.txt

Я пробовал этот код в системе windows 10.1. Есть ли какие-либо изменения, которые мне нужны, чтобы избежать результата (400 Bad Request) в cmd.

# Код

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 Bad Request Date: Mon, 13 Jul 2020 15:08:08 GMT Сервер: Apache / 2.4.18 (Ubuntu) Content-Length: 308 Connection: close Тип содержимого: текст / 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>

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Во-первых, ваш код в настоящее время у меня работает, хотя он и неправильный. Но многие серверы пытаются обойти сломанных клиентов.

Это ваш текущий 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 прост, потому что он полностью текстовый. На самом деле это может быть сложный протокол. И неправильный код (например, ваш) может показаться работающим и сломаться позже с тем же или другим сервером, если они больше не работают с этим специфическим c типом неработающего кода.

0 голосов
/ 14 июля 2020

Я ошибся. Код ниже.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...