如何使用python套接字获取html页面

如何使用python套接字获取html页面,python,sockets,networking,Python,Sockets,Networking,我发现通过socket.connect(主机,端口),我可以得到这个页面。但是主机的格式有一些限制。例如,我可以从www.reddit.com获得,但如果我想获得一个特定的网页,如www.reddit.com/r/AccidentalRenaissance/comments/8ciibe/mr_fluffies_seasure/(随机选择一个页面),我会得到[Errno 11001]getaddrinfo failed error。如何解决这个问题? 我的代码是:(在python2.6下) 对于

我发现通过socket.connect(主机,端口),我可以得到这个页面。但是主机的格式有一些限制。例如,我可以从www.reddit.com获得,但如果我想获得一个特定的网页,如www.reddit.com/r/AccidentalRenaissance/comments/8ciibe/mr_fluffies_seasure/(随机选择一个页面),我会得到[Errno 11001]getaddrinfo failed error。如何解决这个问题? 我的代码是:(在python2.6下)

对于上述网站,我将获得:

<class 'socket.gaierror'>
[Errno 11001] getaddrinfo failed

[Errno 11001]getaddrinfo失败

有人知道如何只使用套接字包来解决这个问题吗

嗯,兄弟你应该知道。 什么样的段落是主机而不是html

    host must be a “host”

GET的格式不正确。您需要连接到插座:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
request = "GET /r/AccidentalRenaissance/comments/8ciibe/mr_fluffies_betrayal/ HTTP/1.1\r\nHost: www.reddit.com\r\n\r\n"
s.connect(("www.reddit.com", 80))
s.sendall(request.encode())
contest = s.recv(1024).decode()
s.close()
print(contest)
感谢您的支持,它修复了
[Errno 11001]getaddrinfo失败的
错误

测试问题中提供的示例时,即使在修复
[Errno 11001]getaddrinfo失败后,我也无法连接,原因是reddit需要SSL连接

通过SSL连接可实现以下功能:

import socket
import ssl

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
request = "GET /r/AccidentalRenaissance/comments/8ciibe/mr_fluffies_betrayal/ HTTP/1.1\r\nHost: www.reddit.com\r\n\r\n"

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
s = context.wrap_socket(sock, server_hostname = "www.reddit.com")

s.connect(("www.reddit.com", 443))
s.sendall(request.encode())

contest = s.recv(1024).decode()

s.close()
print(contest)

谢谢你的代码,我想我真的知道它是怎么工作的。我会努力修好我的
import socket
import ssl

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
request = "GET /r/AccidentalRenaissance/comments/8ciibe/mr_fluffies_betrayal/ HTTP/1.1\r\nHost: www.reddit.com\r\n\r\n"

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
s = context.wrap_socket(sock, server_hostname = "www.reddit.com")

s.connect(("www.reddit.com", 443))
s.sendall(request.encode())

contest = s.recv(1024).decode()

s.close()
print(contest)