Как я могу просмотреть необработанное содержимое с помощью HTTP-запроса?

#python-3.x #sockets

#python-3.x #сокеты

Вопрос:

Кажется, я не могу заставить скрипт распечатывать ТОЛЬКО содержимое, просматриваемое страницей

Я бы хотел, чтобы это использовало модуль sockets. Нет других библиотек, таких как requests или 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.1rnHost: pastebin.comrnrn")
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
  

Комментарии:

1. Тело ответа следует за первым появлением rnrn (19 является частью ответа), поэтому найдите это, а затем прочитайте прошлое до конца.

Ответ №1:

Просто извлеките содержимое после 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.1rnHost: pastebin.comrnrn")
r = sock.recv(4096).decode("utf-8")
#Extract the content after splitting the string on rnrn
content_list = r.split('rnrn')[1].split('rn')
content = 'rn'.join(content_list)
print(content)
#19
#test
#test1
#test2
#test3
sock.close()
  

Комментарии:

1. но это включает в себя 19, которые являются частью ответа. и я не могу просто использовать функцию replace, потому что, если я выберу другую ссылку pastebin, включая эти номера, она будет удалена

2. Я уже знаю о запросах и материалах urllib… Я хочу сделать это с помощью сокетов xD

3. Ооо, вы хотите сделать это сложным способом, а не использовать простую в использовании библиотеку, такую как requests, позвольте мне посмотреть

4. Я обновил свою логику замены, она должна работать с любой другой ссылкой pastebin. Попробуйте и дайте мне знать, если это не сработает

5. все еще получаю 19 :/

Ответ №2:

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

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