如何区分请求中真实未重定向与重定向链接并记录至DataFrame
区分URL是否真正重定向的解决方案
问题根源
你当前的代码用allow_redirects=True发送请求,response.history会记录所有跳转步骤(包括http→https、www→非www这类域名/协议变更),导致原本只是协议跳转的链接也被标记为“重定向”,不符合你对“真正未重定向”的定义。
针对性解决方案
根据你对“重定向”的不同判定标准,提供三种实现方式:
1. 检测HTTP级别的重定向(含协议/域名跳转)
这种方式直接检查服务器返回的HTTP状态码,判断是否触发了3xx系列的重定向响应:
import requests def check_http_redirect(_url): headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36"} try: # 禁止自动跳转,直接获取原始响应 response = requests.get(_url, headers=headers, allow_redirects=False, timeout=10) # 301/302/303/307/308均为标准重定向状态码 return 1 if response.status_code in (301, 302, 303, 307, 308) else 0 except Exception: # 异常情况标记为-1(可根据需求调整) return -1 # 遍历DataFrame写入结果 for idx, row in _df.iterrows(): _df.at[idx, 'Is_Redirected'] = check_http_redirect(row['URL'])
2. 排除协议/域名跳转,只检测路径变更的重定向
如果你认为http→https、www与非www的跳转不属于“真正的重定向”,只需要对比原始URL和最终URL的路径部分:
import requests from urllib.parse import urlparse def check_path_change_redirect(_url): headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36"} try: response = requests.get(_url, headers=headers, allow_redirects=True, timeout=10) # 解析URL,拆分协议、域名、路径 original_url_parts = urlparse(_url) final_url_parts = urlparse(response.url) # 仅对比路径部分,忽略协议和域名差异 return 1 if original_url_parts.path != final_url_parts.path else 0 except Exception: return -1 # 写入结果 for idx, row in _df.iterrows(): _df.at[idx, 'Is_Redirected'] = check_path_change_redirect(row['URL'])
3. 检测所有类型的重定向(含HTML/JS跳转)
部分网站会用HTML meta标签或JS实现跳转(无HTTP 3xx状态码),这种情况需要结合页面内容检测:
import requests from bs4 import BeautifulSoup def check_all_redirects(_url): headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36"} try: # 先检查HTTP级重定向 response = requests.get(_url, headers=headers, allow_redirects=False, timeout=10) if response.status_code in (301, 302, 303, 307, 308): return 1 # 检查HTML meta刷新跳转 soup = BeautifulSoup(response.content, 'html.parser') meta_refresh = soup.find('meta', attrs={'http-equiv': 'refresh'}) if meta_refresh and 'url=' in meta_refresh.get('content', ''): return 1 # 检查基础JS跳转(复杂JS跳转难以完全检测) page_text = response.text.lower() if 'window.location' in page_text or 'location.href' in page_text: return 1 # 无任何跳转 return 0 except Exception: return -1 # 写入结果 for idx, row in _df.iterrows(): _df.at[idx, 'Is_Redirected'] = check_all_redirects(row['URL'])
内容的提问来源于stack exchange,提问作者Mostafa Bouzari
相关产品推荐
相关产品推荐

