如何使用BeautifulSoup跨多网页抓取表格并合并为单个DataFrame?
批量抓取多页表格并合并为单个DataFrame
实现思路
循环遍历第0到27页的目标表格,将每页数据抓取为独立的DataFrame,最后合并所有DataFrame得到完整数据集。
完整代码
import requests from bs4 import BeautifulSoup import pandas as pd def fetch_page_data(page_num): """抓取指定页码的表格数据,返回对应的DataFrame""" base_url = 'https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve&field_tdr_date_value=all&page={}' url = base_url.format(page_num) try: page = requests.get(url, timeout=10) page.raise_for_status() # 抛出HTTP请求异常 soup = BeautifulSoup(page.text, 'lxml') # 定位表格 table = soup.find('table', {'class':'views-table views-view-table cols-20'}) if not table: print(f"第{page_num}页未找到目标表格,跳过") return None # 提取表头 headers = [th.text.strip() for th in table.find_all('th')] # 提取行数据 rows = [] for row in table.find_all('tr')[1:]: row_data = [td.text.strip() for td in row.find_all('td')] if row_data: # 跳过空行 rows.append(row_data) # 生成DataFrame df_page = pd.DataFrame(rows, columns=headers) print(f"成功抓取第{page_num}页数据,共{len(df_page)}行") return df_page except Exception as e: print(f"抓取第{page_num}页出错: {str(e)}") return None # 初始化空列表存储各页DataFrame all_dfs = [] # 遍历0到27页 for page in range(0, 28): df_page = fetch_page_data(page) if df_page is not None: all_dfs.append(df_page) # 合并所有DataFrame if all_dfs: final_df = pd.concat(all_dfs, ignore_index=True) print(f"合并完成,总数据行数: {len(final_df)}") # 可选:保存到本地文件 # final_df.to_csv('treasury_yield_curve.csv', index=False, encoding='utf-8-sig') else: print("未抓取到任何有效数据")
代码说明
- 封装
fetch_page_data函数负责单页数据抓取,包含异常处理,避免某一页出错导致整个程序中断。 - 设置请求超时时间,防止请求长时间卡住。
- 用
pd.concat合并所有页的DataFrame,通过ignore_index=True重置索引,避免索引重复。 - 添加日志打印,方便跟踪抓取进度和异常情况。
内容的提问来源于stack exchange,提问作者Ansh Gupta
相关产品推荐
相关产品推荐

