Python requests.get未处理HTTP重定向致爬虫应用崩溃求助
解决Requests模块处理重定向时的崩溃问题
嘿,我帮你排查下这个爬虫重定向的问题!你的代码里有几个潜在的坑,导致处理像http://www.yahoo.com这类重定向URL时崩溃,咱们一步步来修复:
问题分析
- URL拼接错误:你手动给输入的URL加
http://,如果用户输入的URL已经包含http://或https://(比如用户直接输入https://www.yahoo.com),就会变成http://https://www.yahoo.com,这种无效URL会直接导致请求失败。 - 缺少异常捕获:requests请求过程中可能遇到各种错误(比如重定向次数过多、网络问题、无效URL),没有异常处理的话,程序直接崩溃。
- 虽然requests默认自动处理重定向(
allow_redirects=True是默认值),但错误的URL会让这个机制根本无法启动。
修复后的代码示例
我把你的代码修改一下,解决这些问题:
from urllib.parse import urlparse # 导入URL解析工具 import requests if request.method == 'POST' and form.validate(): # 获取表单数据 url = form.url.data email = form.email.data # 插入数据库的逻辑不变 mymsg = [{ "url": url, "email": email, }] x = mycol.insert_many(mymsg) print("inserting this item: ", mymsg, "in the database called ", mycol) # 修复URL协议头问题 parsed_url = urlparse(url) if not parsed_url.scheme: # 如果URL没有协议头(http/https) url1 = f"http://{url}" else: url1 = url # 已有协议头,直接使用 try: # 显式指定重定向(默认就是True,写出来更清晰) result = requests.get(url1, allow_redirects=True, timeout=10) # 加超时避免挂起 result.raise_for_status() # 抛出HTTP错误状态码的异常(比如4xx、5xx) print("原始请求URL: ", url1) print("重定向后的最终URL: ", result.url) # 查看重定向后的地址 print("状态码: ", result.status_code) print("响应头: ", result.headers) except requests.exceptions.RequestException as e: # 捕获所有requests相关异常,避免程序崩溃 print(f"请求出错: {str(e)}") # 这里可以添加错误提示给用户的逻辑,比如返回错误页面
关键改进点
- URL协议头处理:用
urlparse检查输入URL是否已有协议,避免重复拼接导致的无效URL。 - 异常捕获:用
try-except包裹请求逻辑,捕获所有RequestException,即使出错也能优雅处理,不会直接崩溃。 - 超时设置:给
requests.get加timeout参数,避免请求长时间挂起占用资源。 raise_for_status():主动抛出HTTP错误(比如404、500),方便你排查请求失败的具体原因。
这样修改后,再测试http://www.yahoo.com这类重定向URL,就不会崩溃了,还能看到最终重定向到的地址~
内容的提问来源于stack exchange,提问作者user11733473
相关产品推荐
相关产品推荐

