如何用Python requests库从指定网站读取Excel?求指导下载URL
解决方法
1. 分析页面触发逻辑
打开目标页面后右键选择「检查」,切换到Elements面板,定位下载按钮的HTML代码:
- 若按钮是
<a>标签但href为空或动态生成,查看绑定的JS事件; - 若存在隐藏表单,记录表单的
action地址和所有input参数(比如基金ID、月份、CSRF令牌等)。
2. 构造请求直接下载
情况1:URL可通过页面参数拼接
先爬取页面中的关键参数,再构造下载链接:
import requests from bs4 import BeautifulSoup 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" } base_url = "https://www.motilaloswalmf.com/download/month-end-portfolio" # 获取页面内容提取参数 resp = requests.get(base_url, headers=headers) soup = BeautifulSoup(resp.text, "html.parser") # 替换为页面实际的下载项选择器(比如带data属性的元素) for item in soup.select(".portfolio-item"): fund_code = item.get("data-fund-code") month_year = item.get("data-month") # 构造下载URL(需根据实际API规则调整) download_url = f"https://www.motilaloswalmf.com/api/portfolio/download?fund={fund_code}&period={month_year}" # 下载并保存文件 file_resp = requests.get(download_url, headers=headers) with open(f"motilal_{fund_code}_{month_year}.xlsx", "wb") as f: f.write(file_resp.content)
情况2:下载通过POST请求触发
若下载是表单提交触发,模拟POST请求:
import requests 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" } post_url = "https://www.motilaloswalmf.com/download/process" # 替换为表单action地址 # 从页面提取的参数(需根据实际表单字段调整) form_data = { "fund_id": "123", "month": "May-2024", "csrf_token": "xxx" # 从页面的meta标签或隐藏input中提取 } resp = requests.post(post_url, headers=headers, data=form_data) with open("portfolio.xlsx", "wb") as f: f.write(resp.content)
情况3:页面是JS渲染(动态加载内容)
若requests无法获取动态生成的下载参数,用Selenium模拟浏览器操作:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 配置Chrome浏览器下载路径(避免弹窗) options = webdriver.ChromeOptions() prefs = {"download.default_directory": "/your/download/path"} options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(options=options) driver.get("https://www.motilaloswalmf.com/download/month-end-portfolio") # 点击所有下载按钮(替换为实际按钮选择器) for btn in driver.find_elements(By.CSS_SELECTOR, ".download-btn"): btn.click() time.sleep(2) # 等待下载完成 driver.quit()
内容的提问来源于stack exchange,提问作者prepmath
相关产品推荐
相关产品推荐

