如何用Python或R批量下载微软投资者页面的docx格式年报?
批量下载微软投资者页面的所有DOCX年报文件
Python 实现方案
先安装所需依赖包:
pip install requests beautifulsoup4
代码实现:
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin # 目标页面URL base_url = "https://www.microsoft.com/en-us/Investor/annual-reports.aspx" # 本地保存文件夹,不存在则自动创建 save_dir = "microsoft_annual_reports" os.makedirs(save_dir, exist_ok=True) # 模拟浏览器请求头,规避反爬拦截 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(base_url, headers=headers) response.raise_for_status() # 检查请求是否成功 # 解析HTML页面 soup = BeautifulSoup(response.text, "html.parser") # 提取所有DOCX文件链接 docx_links = [] for a_tag in soup.find_all("a", href=True): href = a_tag["href"] if href.endswith(".docx"): # 转换为绝对URL full_url = urljoin(base_url, href) docx_links.append(full_url) # 批量下载文件 for link in docx_links: filename = os.path.join(save_dir, link.split("/")[-1]) print(f"正在下载: {filename}") file_response = requests.get(link, headers=headers) file_response.raise_for_status() with open(filename, "wb") as f: f.write(file_response.content) print(f"{filename} 下载完成") print("所有DOCX文件下载完成")
R 实现方案
先安装所需依赖包:
install.packages(c("rvest", "httr"))
代码实现:
library(rvest) library(httr) library(stringr) # 目标页面URL base_url <- "https://www.microsoft.com/en-us/Investor/annual-reports.aspx" # 本地保存文件夹,不存在则自动创建 save_dir <- "microsoft_annual_reports" if (!dir.exists(save_dir)) { dir.create(save_dir) } # 模拟浏览器请求头 headers <- add_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 <- GET(base_url, headers) stop_for_status(page) # 检查请求是否成功 # 解析HTML页面 html <- content(page, "html") # 提取所有DOCX文件链接 docx_links <- html_elements(html, "a[href]") %>% html_attr("href") %>% str_subset("\\.docx$") %>% url_absolute(base_url) # 转换为绝对URL # 批量下载文件 for (link in docx_links) { filename <- file.path(save_dir, basename(link)) cat(paste0("正在下载: ", filename, "\n")) file_response <- GET(link, headers) stop_for_status(file_response) writeBin(content(file_response, "raw"), filename) cat(paste0(filename, " 下载完成\n")) } cat("所有DOCX文件下载完成\n")
补充说明
之前参考的PDF下载代码失效,主要原因是未设置合法请求头被反爬拦截,或是链接筛选逻辑不适配DOCX文件。上述代码通过模拟正常浏览器访问,并针对性筛选DOCX后缀链接,同时处理了相对路径转绝对路径的问题,确保能正确获取并下载目标文件。
内容的提问来源于stack exchange,提问作者lovestacksflow
相关产品推荐
相关产品推荐

