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

如何区分请求中真实未重定向与重定向链接并记录至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:17:05