检查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
相关产品推荐
相关产品推荐

