You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Rajya Sabha网站表格结果不符问题求助

修正Rajya Sabha气候变化辩论数据爬取代码

问题分析

原代码的核心问题:

  • 未更新页面解析结果:循环请求新页面后,没有重新用BeautifulSoup解析新页面,始终复用初始页面的table1对象,导致反复爬取第一页数据
  • 分页参数错误:每页显示100条数据(rpp=100),start参数应按100递增(0、100、200...),而非从0到96逐个累加
  • 数据写入逻辑混乱:表头被重复写入,且每次循环都追加行数据,容易造成数据重复或格式异常

修正后的代码

import requests
import pandas as pd
from bs4 import BeautifulSoup
import lxml

# 初始化存储容器
all_rows = []
table_headers = []

# 基础URL模板,通过替换start参数实现分页
base_url = "https://rsdebate.nic.in/simple-search?query=climate+change&sort_by=dc.identifier.sessionnumber_sort&order=asc&rpp=100&etal=0&start={}"

# 先获取表头(仅需一次)
first_response = requests.get(base_url.format(0))
first_soup = BeautifulSoup(first_response.text, 'lxml')
target_table = first_soup.find('table', id='sam_table')
for th in target_table.find_all('th'):
    table_headers.append(th.text.strip())

# 分页爬取(按每页100条,共96页计算,可根据实际数据量调整范围)
for start_num in range(0, 9600, 100):
    current_url = base_url.format(start_num)
    response = requests.get(current_url)
    soup = BeautifulSoup(response.text, 'lxml')
    current_table = soup.find('table', id='sam_table')
    
    # 提取当前页的行数据(跳过表头行)
    for row in current_table.find_all('tr')[1:]:
        row_content = [td.text.strip() for td in row.find_all('td')]
        all_rows.append(row_content)
    
    print(f"已完成第 {start_num//100 + 1} 页爬取")

# 转换为DataFrame并写入CSV
final_data = pd.DataFrame(all_rows, columns=table_headers)
final_data.to_csv('rs_debate_data.csv', index=False)
print("数据爬取完成,已保存至rs_debate_data.csv")

代码说明

  • 分页逻辑优化:用range(0, 9600, 100)生成正确的分页参数,匹配每页100条的设置
  • 页面解析更新:每次请求新页面后,重新生成soup和table对象,确保处理当前页的最新内容
  • 数据收集优化:先将所有数据存入列表,最后统一转换为DataFrame写入CSV,减少IO操作次数,避免表头重复
  • 文本清理:用strip()去除文本中的多余空格和换行,保证数据整洁

内容的提问来源于stack exchange,提问作者zzzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:50:18