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