使用Python检测房产链接重定向,验证链接有效性
解决requests.head无法检测重定向的问题
问题分析
你的失效链接在浏览器中访问会触发重定向,但用requests.head()却返回原URL,核心原因有两点:
- 目标网站对HEAD请求的处理逻辑与GET请求不同:不少网站为了节省服务器资源或反爬,不会对HEAD请求执行重定向流程,甚至直接返回200状态但跳过重定向。
- 缺少必要的请求头标识:浏览器访问时会携带
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
相关产品推荐
相关产品推荐

