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

使用Python检测房产链接重定向,验证链接有效性

解决requests.head无法检测重定向的问题

问题分析

你的失效链接在浏览器中访问会触发重定向,但用requests.head()却返回原URL,核心原因有两点:

  1. 目标网站对HEAD请求的处理逻辑与GET请求不同:不少网站为了节省服务器资源或反爬,不会对HEAD请求执行重定向流程,甚至直接返回200状态但跳过重定向。
  2. 缺少必要的请求头标识:浏览器访问时会携带User-Agent等信息,而requests默认的HEAD请求头会被网站识别为非浏览器请求,从而不触发重定向规则。

解决方案

方案1:用GET请求+stream模式(推荐)

用GET请求替代HEAD,同时设置stream=True避免下载完整页面内容,既保证触发重定向逻辑,又能保持高效:

import requests

def check_link_validity(url):
    # 模拟浏览器请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    # 发送GET请求,允许重定向,stream=True不下载完整响应体
    response = requests.get(url, allow_redirects=True, headers=headers, stream=True)
    response.close()  # 关闭连接释放资源
    # 判断是否发生重定向
    is_invalid = response.url != url
    return is_invalid, response.url

# 测试失效链接
invalid_url = "https://www.habitaclia.com/comprar-piso-poblenou_la_vila_olimpica_del_poblenou-barcelona-i3118004333089.htm?pag=413&f=&geo=c&from=list&lo=55"
is_invalid, final_url = check_link_validity(invalid_url)
print(f"链接是否失效:{is_invalid},最终跳转地址:{final_url}")

# 测试有效链接
valid_url = "https://www.habitaclia.com/comprar-piso-oportunidad_grande_de_4_habitaciones_con_balcon_en_plena_ra_el_clot-barcelona-i45207000000035.htm?pag=1001&f=&geo=c&from=list&lo=55"
is_invalid_valid, final_url_valid = check_link_validity(valid_url)
print(f"链接是否失效:{is_invalid_valid},最终地址:{final_url_valid}")

方案2:手动追踪HEAD请求的重定向

如果网站对HEAD请求返回30x状态码但requests未自动处理,可以手动解析响应头中的Location字段追踪重定向:

import requests

def follow_head_redirects(url, max_redirects=5):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    current_url = url
    # 限制最大重定向次数,避免死循环
    for _ in range(max_redirects):
        response = requests.head(current_url, allow_redirects=False, headers=headers)
        # 检查是否是重定向状态码
        if 300 <= response.status_code < 400:
            current_url = response.headers.get('Location', current_url)
        else:
            break
    return current_url != url, current_url

# 测试失效链接
is_redirected, final_url = follow_head_redirects(invalid_url)
print(f"是否发生重定向:{is_redirected},最终地址:{final_url}")

关键提示

  • 一定要添加User-Agent请求头:模拟浏览器身份是避免网站特殊处理的核心,否则即使使用GET请求也可能无法触发重定向。
  • 优先选择方案1:GET请求+stream模式的兼容性更强,绝大多数网站都会对GET请求执行正常的重定向逻辑,同时stream=True不会下载页面内容,性能和HEAD请求相近。

内容的提问来源于stack exchange,提问作者José Carlos Rojas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:51:04