使用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
相关产品推荐
相关产品推荐

