如何用Python下载需等待5秒才触发的文件?
解决SourceForge延迟跳转文件的下载问题
你遇到的问题是因为SourceForge的这个链接并非直接文件地址,而是一个等待跳转的中间页面,wget和urllib直接请求会下载到页面的HTML代码,而非实际文件。以下是两种可行的解决方案:
方法一:利用requests自动追踪重定向
SourceForge的跳转页面最终会通过HTTP重定向指向真实文件,使用requests库并开启重定向追踪,同时模拟浏览器请求头即可获取文件:
import requests # 目标链接 download_url = "https://sourceforge.net/projects/esp32-s2-mini/files/latest/download" # 模拟浏览器请求头,避免被识别为爬虫 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 发送请求,允许自动重定向 response = requests.get(download_url, headers=headers, allow_redirects=True) # 保存文件到本地 with open("esp32-s2-mini-latest.zip", "wb") as file: file.write(response.content)
方法二:解析跳转页面获取真实链接
如果自动重定向失效,可以手动解析中间页面的跳转指令,等待指定时间后请求真实文件地址:
import requests from bs4 import BeautifulSoup import time download_url = "https://sourceforge.net/projects/esp32-s2-mini/files/latest/download" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } # 获取中间跳转页面 page_response = requests.get(download_url, headers=headers) soup = BeautifulSoup(page_response.text, "html.parser") # 提取页面中的refresh跳转指令 refresh_meta = soup.find("meta", attrs={"http-equiv": "refresh"}) if refresh_meta: # 解析出真实文件链接(格式为 "5; url=真实地址") real_download_url = refresh_meta["content"].split("url=")[1] # 模拟页面等待的5秒 time.sleep(5) # 下载真实文件 file_response = requests.get(real_download_url, headers=headers, allow_redirects=True) with open("esp32-s2-mini-latest.zip", "wb") as file: file.write(file_response.content)
注意事项
- 一定要设置
User-Agent请求头,SourceForge会拦截无标识的爬虫请求,返回错误内容。 - 如果遇到下载失败,可以尝试更换不同的
User-Agent值,或者添加Accept-Language等其他浏览器常用请求头。
内容的提问来源于stack exchange,提问作者Matas Mikelionis
相关产品推荐
相关产品推荐

