使用Python Socket获取指定HTML页面遇[Errno 11001]错误的解决方法
问题解决:socket.connect() 带路径导致 getaddrinfo failed 错误
老哥,你踩的坑是对socket.connect()的参数用法理解偏差啦!
错误原因
socket.connect(host, port)里的host参数只能填域名(比如www.reddit.com)或者IP地址,绝对不能带URL路径(就是你写的/r/AccidentalRenaissance/...那一串)。你把完整页面路径拼进host里,系统会把整个字符串当成域名去解析,这显然找不到对应的IP,所以就抛出[Errno 11001] getaddrinfo failed错误了。
正确的操作逻辑
Socket只是负责建立TCP连接,具体要访问哪个页面,得通过HTTP请求报文告诉服务器。步骤很清晰:
- 先用纯域名连接到服务器的80端口(HTTP默认端口)
- 连接成功后,发送包含目标路径的HTTP GET请求
修改后的Python2.6代码
import socket import sys # 拆分域名和目标路径 host = 'www.reddit.com' target_path = '/r/AccidentalRenaissance/comments/8ciibe/mr_fluffies_betrayal/' port = 80 try: # 创建socket并连接服务器 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) # 构造符合HTTP规范的GET请求(Python2字符串格式,结尾必须加\r\n\r\n) request = "GET %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n" % (target_path, host) s.send(request) # 接收服务器响应内容 response = '' while True: data = s.recv(1024) if not data: break response += data # 这里可以根据需求处理响应,比如提取HTML部分 print(response) except socket.error as e: print("Socket错误:", e) sys.exit(1) finally: s.close()
关键细节提醒
- HTTP请求必须符合规范:请求行(
GET 目标路径 HTTP/版本)之后要加请求头,最后必须用\r\n\r\n结束头信息,服务器才会正确处理你的请求。 Host请求头是必填项,像reddit这类虚拟主机部署的网站,服务器需要通过这个头判断你要访问的具体站点。
内容的提问来源于stack exchange,提问作者beetle
相关产品推荐
相关产品推荐

