You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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请求报文告诉服务器。步骤很清晰:

  1. 先用纯域名连接到服务器的80端口(HTTP默认端口)
  2. 连接成功后,发送包含目标路径的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:22:21