Как я могу просматривать необработанный контент с помощью HTTP-запроса? - PullRequest
0 голосов
/ 09 апреля 2019

Я не могу заставить скрипт распечатать ПРОСТО содержимое, просматриваемое страницей

Я бы хотел использовать модуль сокетов. Нет других библиотек, таких как запросы или urllib

Я не могу много попробовать. Поэтому я сразу совершил грех и пришел первым ^^ '

Мой код:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("pastebin.com", 80))
sock.sendall(b"GET /raw/yWmuKZyb HTTP/1.1\r\nHost: pastebin.com\r\n\r\n")
r = sock.recv(4096).decode("utf-8")
print(r)

sock.close()

Я хочу, чтобы напечатанный результат был:

test
test1
test2
test3

но я получаю

HTTP/1.1 200 OK
Date: Tue, 09 Apr 2019 14:20:45 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=xxx; expires=Wed, 08-Apr-20 14:20:45 GMT; path=/; domain=.pastebin.com; HttpOnly
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Vary: Accept-Encoding
X-XSS-Protection: 1; mode=block
CF-Cache-Status: MISS
Server: cloudflare
CF-RAY: 4c4d1f9f685ece41-LHR

19
test
test1
test2
test3

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вы выполняете запрос HTTP / 1.1, и, следовательно, веб-сервер может ответить телом ответа в кодированной передаче. В этом режиме каждому чанку предшествует размер в шестнадцатеричном формате. Вам либо нужно реализовать этот режим, либо вы можете просто выполнить запрос HTTP / 1.0, в этом случае сервер не будет использовать кодирование передачи по частям, поскольку это было введено только в HTTP / 1.1.

В любом случае, если вы не хотите использовать какие-либо существующие библиотеки, но используете свой собственный HTTP, ожидается, что вы действительно понимаете HTTP. Понимание означает, что вы прочитали соответствующие стандарты, потому что для этого и нужны стандарты. Для HTTP / 1.1 это изначально RFC 2616 , который позже был немного переработан в RFC 7230-7235. Как только вы начнете читать эти стандарты, вы, вероятно, поймете, что существуют библиотеки, которые работают с этими протоколами, поскольку они далеко не тривиальны.

0 голосов
/ 09 апреля 2019

Просто извлеките содержимое после \ r \ r \ n \ n с помощью string.split и напечатайте его

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("pastebin.com", 80))
sock.sendall(b"GET /raw/yWmuKZyb HTTP/1.1\r\nHost: pastebin.com\r\n\r\n")
r = sock.recv(4096).decode("utf-8")
#Extract the content after splitting the string on \r\n\r\n
content_list = r.split('\r\n\r\n')[1].split('\r\n')
content = '\r\n'.join(content_list)
print(content)
#19
#test
#test1
#test2
#test3
sock.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...