如何使用HTTP请求查看原始内容?

时间:2019-04-09 14:40:15

标签: python-3.x sockets

我似乎无法让脚本仅打印页面所查看的内容

我希望这是使用套接字模块。没有其他库,例如请求或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 :(得分:0)

只需使用string.split提取\ r \ r \ n \ n之后的内容并打印

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()

答案 1 :(得分:0)

您正在执行HTTP / 1.1请求,因此Web服务器可能会以分块的传输编码使用响应正文进行回复。在此模式下,每个块均以十六进制的大小作为前缀。您要么需要实现此模式,要么可以简单地执行HTTP / 1.0请求,在这种情况下,服务器将不使用分块传输编码,因为这是仅在HTTP / 1.1中引入的。

无论如何,如果您不想使用任何现有的库,而是使用自己的HTTP,那么您应该可以真正理解HTTP。理解意味着您已经阅读了相关标准,因为这就是标准的目的。对于HTTP / 1.1,它最初是RFC 2616,后来稍作修改就成为RFC 7230-7235。一旦开始阅读这些标准,您可能会发现现有的库可以处理这些协议,因为它们远非易事。