如何从CAG网站下载2018-2022年3月的月度关键指标PDF文件
解决方案:按日期区间筛选下载PDF
核心逻辑是从PDF文件名中提取年月信息,判断是否在2018年3月-2022年3月区间内,符合条件才下载。
步骤1:处理日期解析
观察CAG网站的月度关键指标PDF文件名,通常包含Mar_2018这类英文月份+年份格式,先定义月份映射表,把英文缩写转成数字:
month_map = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12' }
步骤2:修改下载逻辑,添加日期筛选
在原代码循环中加入日期判断逻辑,完整代码如下:
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin # 基础配置 url = "https://cag.gov.in/en/state-accounts-report?defuat_state_id=64" folder_location = "./cag_pdfs" tabID = "#tab-360" # 用数值形式定义日期区间(YYYY*100 + MM),方便比较 start_date = 201803 end_date = 202203 # 创建存放文件夹(不存在则新建) if not os.path.exists(folder_location): os.makedirs(folder_location) # 页面请求与解析 response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') month_map = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12' } for link in soup.select(f"{tabID} a[href$='.pdf']"): filename = link['href'].split('/')[-1] # 解析文件名中的年月(示例适配格式:"Monthly_Key_Indicators_Mar_2018.pdf") name_parts = filename.replace('.pdf', '').split('_') try: # 根据实际文件名结构调整索引,这里假设最后两位是月份缩写和年份 month_abbr = name_parts[-2] year = name_parts[-1] month_num = month_map[month_abbr] file_date = int(f"{year}{month_num}") except (IndexError, KeyError): print(f"无法解析日期,跳过文件:{filename}") continue # 判断是否在目标区间内,符合则下载 if start_date <= file_date <= end_date: full_path = os.path.join(folder_location, filename) with open(full_path, 'wb') as f: f.write(requests.get(urljoin(url, link['href'])).content) print(f"已下载:{filename}") else: print(f"不在目标区间,跳过:{filename}")
注意事项
- 如果文件名格式是数字形式(如
201803_Key_Indicators.pdf),可以直接取文件名前6位转成整数,无需月份映射表。 - 建议先打印几个文件名,确认解析逻辑匹配实际格式,避免因文件名结构变化导致筛选失败。
- 可添加
time.sleep(1)这类延时,避免频繁请求触发网站反爬机制。
内容的提问来源于stack exchange,提问作者NoobCoderPy
相关产品推荐
相关产品推荐

