如何从终端/Unix Bash、R或Python下载指定网页导出的Excel文件?
当然可以搞定!这个需求本质就是模拟浏览器点击下载按钮的动作,背后其实是发送特定的HTTP请求(可能需要带上会话Cookie、表单数据这些)来触发文件生成和下载。下面我分别给你用Bash(搭配curl)、Python和R的具体实现方案,你可以根据自己熟悉的工具选:
Bash 实现(用curl)
用curl的核心是先获取网站的会话Cookie(这类学术网站通常需要验证会话权限),再发送下载请求:
# 1. 先访问目标搜索结果页面,保存会话Cookie到本地文件 curl -c cookie.txt "http://www.vivc.de/index.php?r=eva-analysis-mikrosatelliten-vivc%2Fresultmsatvar&EvaAnalysisMikrosatellitenVivcSearch%5Bleitname_list%5D=&EvaAnalysisMikrosatellitenVivcSearch%5Bleitname_list%5D%5B%5D=ABADI&EvaAnalysisMikrosatellitenVivcSearch%5BName_in_bibliography%5D=" # 2. 模拟点击EXCEL按钮,发送请求下载文件 # 注意:这里的导出URL是推测的,你需要用浏览器F12抓包看实际请求地址 curl -b cookie.txt -o output.xlsx "http://www.vivc.de/index.php?r=eva-analysis-mikrosatelliten-vivc%2Fexportmsatvar&format=xlsx"
⚠️ 关键提醒:一定要用浏览器开发者工具(F12→网络标签)查看点击“EXCEL Document”时实际发送的请求——比如是GET还是POST,有没有额外的表单参数,把代码里的导出URL替换成抓包到的真实地址。如果是POST请求,要给curl加-d参数传递表单数据。
Python 实现(用requests库)
requests库处理会话和请求非常方便,自动帮你管理Cookie:
import requests # 初始化会话,自动维护Cookie session = requests.Session() # 先访问目标页面,建立有效会话 target_url = "http://www.vivc.de/index.php?r=eva-analysis-mikrosatelliten-vivc%2Fresultmsatvar&EvaAnalysisMikrosatellitenVivcSearch%5Bleitname_list%5D=&EvaAnalysisMikrosatellitenVivcSearch%5Bleitname_list%5D%5B%5D=ABADI&EvaAnalysisMikrosatellitenVivcSearch%5BName_in_bibliography%5D=" session.get(target_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"}) # 发送下载请求(替换为抓包到的真实导出URL) export_url = "http://www.vivc.de/index.php?r=eva-analysis-mikrosatelliten-vivc%2Fexportmsatvar&format=xlsx" response = session.get(export_url) # 保存文件到本地 with open("output.xlsx", "wb") as f: f.write(response.content) print("文件已成功保存为 output.xlsx")
💡 小技巧:如果网站返回403或拒绝请求,大概率是检查了User-Agent,上面代码里已经加了模拟浏览器的UA,你也可以换成自己浏览器的UA。如果导出是POST请求,把session.get()改成session.post(),并传入data={"表单键": "表单值"}。
R 实现(用httr库)
用httr库可以轻松处理会话和HTTP请求:
library(httr) # 初始化会话句柄,维护Cookie session_handle <- handle("http://www.vivc.de") # 先访问目标页面,建立会话 target_url <- "http://www.vivc.de/index.php?r=eva-analysis-mikrosatelliten-vivc%2Fresultmsatvar&EvaAnalysisMikrosatellitenVivcSearch%5Bleitname_list%5D=&EvaAnalysisMikrosatellitenVivcSearch%5Bleitname_list%5D%5B%5D=ABADI&EvaAnalysisMikrosatellitenVivcSearch%5BName_in_bibliography%5D=" GET(target_url, handle = session_handle, add_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")) # 发送下载请求(替换为真实导出URL) export_url <- "http://www.vivc.de/index.php?r=eva-analysis-mikrosatelliten-vivc%2Fexportmsatvar&format=xlsx" response <- GET(export_url, handle = session_handle) # 保存文件 write_disk(response, path = "output.xlsx", overwrite = TRUE) cat("文件已成功保存为 output.xlsx\n")
同样,如果导出是POST请求,把GET()换成POST(),并用body=参数传递表单数据。
内容的提问来源于stack exchange,提问作者LiPaPe
相关产品推荐
相关产品推荐

