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

检查URL响应与WHOIS记录一致性时遇requests连接错误求助

解决连接错误及代码逻辑问题

一、连接错误(gaierror)的直接解决方案

  • 验证域名有效性:www.list.tmall.com大概率是无效域名,先用命令行执行nslookup www.list.tmall.com或在浏览器访问,确认能否正常解析。若解析失败,说明数据集里存在错误URL,需先清理。
  • 排查网络环境:检查本地网络是否能正常访问公网,是否有防火墙、代理拦截DNS请求,可切换网络(如手机热点)测试。
  • 校验URL格式:确保数据集里的URL完整(带http://或https://前缀),缺少协议头会导致requests误将其当作域名处理,触发解析失败。

二、代码核心逻辑修复

原代码中response.text == domain的逻辑完全错误:whois.whois()返回的是包含域名注册信息(注册商、所有者、过期时间等)的对象,而response.text是网页HTML内容,两者没有可比性。正确思路是验证域名WHOIS信息与网站实际主体是否匹配(如备案信息、域名所有者一致性)。

三、优化后的完整代码

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
from urllib.parse import urlparse
import whois

def create_retry_session():
    # 创建带重试机制的session,处理临时网络波动
    session = requests.Session()
    retry_strategy = Retry(
        total=3,
        backoff_factor=1,
        status_forcelist=[429, 500, 502, 503, 504],
        allowed_methods=["GET"]
    )
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount("https://", adapter)
    session.mount("http://", adapter)
    return session

def abnormal_url(url):
    # 先校验URL格式合法性
    parsed_url = urlparse(url)
    if not parsed_url.scheme or not parsed_url.netloc:
        return 1  # 无效URL,标记为异常
    
    session = create_retry_session()
    domainname = parsed_url.netloc
    
    try:
        # 添加超时避免请求卡住
        response = session.get(url, verify=False, timeout=10)
        response.raise_for_status()  # 主动触发HTTP状态码错误
        
        # 获取WHOIS域名信息
        domain_info = whois.whois(domainname)
        
        # 示例校验逻辑:对比域名所有者与网页内容(需根据实际需求调整)
        if hasattr(domain_info, 'registrant_name'):
            registrant = domain_info.registrant_name.strip().lower()
            # 实际场景需用HTML解析/正则提取网页中的主体信息,这里简化处理
            if registrant in response.text.lower():
                return 0  # 合法
            else:
                return 1  # 异常
        else:
            return 1  # 无法获取WHOIS所有者信息,标记异常
            
    except requests.exceptions.RequestException as e:
        print(f"请求URL {url} 出错: {str(e)}")
        return 1
    except whois.parser.PywhoisError as e:
        print(f"查询WHOIS {domainname} 出错: {str(e)}")
        return 1
    except Exception as e:
        print(f"处理URL {url} 时发生未知错误: {str(e)}")
        return 1

# 应用到DataFrame
df['abnormal url'] = df['url'].apply(abnormal_url)

四、额外优化建议

  • 不要禁用SSL验证(verify=False),存在安全风险,建议安装正确的CA证书。
  • 批量处理前先预处理数据集:过滤格式错误、无法解析的URL,减少无效请求。
  • 批量请求时添加延迟(如time.sleep(1)),避免被目标网站封禁IP。
  • 采用更精准的校验逻辑:比如对比SSL证书中的域名、网站备案号与WHOIS信息的一致性。

内容的提问来源于stack exchange,提问作者wong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:10:27