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

使用Python requests库无法获取重定向状态码的问题排查

问题:无法捕获URL的301/302重定向状态码

我尝试通过代码检测URL的存活、重定向、失效状态,但无法获取重定向状态码。经浏览器网络面板确认目标URL返回302状态码,但代码却记录为200;即使单独指定状态码而非使用范围判断也无效。代码可正常检测200、500等状态码,但批量检测URL时无法捕获301、302等重定向状态码。

原代码如下:

import csv
import requests

def check_url_status(url):
    """Checks the status of a URL and returns a descriptive status string."""
    try:
        response = requests.get(url, timeout=5)
        status_code = response.status_code
        if status_code in range(200, 299):
            return f"Alive ({status_code})"
        elif status_code == 300:
            return f"Multiple Choices Redirected ({status_code})"
        elif status_code == 301:
            return f"Moved Permanently Redirected ({status_code})"
        elif status_code == 302:
            return f"Temporarily Moved Redirected ({status_code})"
        elif status_code in range(303, 400):
            return f"Redirected ({status_code})"
        else:
            return f"Not Found ({status_code})"
    except Exception as e:
        return f"Error: {e}"

# Read URLs from CSV file
urls = []
with open("urls.csv", "r") as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        urls.append(row[0])

# Check each URL and write results to new file
with open("url_status.csv", "w", newline="") as outfile:
    writer = csv.writer(outfile)
    writer.writerow(["URL", "Status"])
    for url in urls:
        status = check_url_status(url)
        writer.writerow([url, status])

print("URL status successfully written to url_status.csv!")

原因分析

requests.get()方法默认开启自动跟随重定向(allow_redirects=True),当遇到301/302等重定向状态码时,会自动跳转到目标地址,并返回最终跳转页面的状态码,因此你拿到的是200而非原始的302。

解决方法

在requests.get()中添加allow_redirects=False参数,关闭自动重定向,即可获取到URL返回的原始状态码。如果需要同时获取重定向目标地址,可以通过response.headers.get('Location')获取。

修改后的代码:

import csv
import requests

def check_url_status(url):
    """Checks the status of a URL and returns a descriptive status string."""
    try:
        # 关闭自动跟随重定向
        response = requests.get(url, timeout=5, allow_redirects=False)
        status_code = response.status_code
        if status_code in range(200, 299):
            return f"Alive ({status_code})"
        elif status_code == 300:
            redirect_target = response.headers.get('Location', '未知地址')
            return f"Multiple Choices Redirected ({status_code}) -> {redirect_target}"
        elif status_code == 301:
            redirect_target = response.headers.get('Location', '未知地址')
            return f"Moved Permanently Redirected ({status_code}) -> {redirect_target}"
        elif status_code == 302:
            redirect_target = response.headers.get('Location', '未知地址')
            return f"Temporarily Moved Redirected ({status_code}) -> {redirect_target}"
        elif status_code in range(303, 400):
            redirect_target = response.headers.get('Location', '未知地址')
            return f"Redirected ({status_code}) -> {redirect_target}"
        else:
            return f"Not Found ({status_code})"
    except Exception as e:
        return f"Error: {e}"

# Read URLs from CSV file
urls = []
with open("urls.csv", "r") as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        urls.append(row[0])

# Check each URL and write results to new file
with open("url_status.csv", "w", newline="") as outfile:
    writer = csv.writer(outfile)
    writer.writerow(["URL", "Status"])
    for url in urls:
        status = check_url_status(url)
        writer.writerow([url, status])

print("URL status successfully written to url_status.csv!")

内容的提问来源于stack exchange,提问作者Nasir Uddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:06:27