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

如何实现多URL爬取并解决加载更多式分页(仅获第一页)问题?

爬取多个URL并解决“加载更多”分页问题

问题说明

需要爬取欧洲议会MEP(议员)的过往会议数据,涉及100余个不同议员的接口(对应不同memberId),当前代码仅能获取第一页数据,无法处理“加载更多”式的分页。示例目标页面为议员Billy Kelleher的过往会议页面。

原代码问题分析

  1. URL生成逻辑错误:提前将初始page=0插入到URL列表中,后续分页时URL不会自动更新页码,始终请求第一页
  2. 全局分页判断错误:用一个全局变量isHaveNextPage控制所有议员的分页,只要某一个议员没有下一页,整个循环就会终止,无法完成其他议员的全量爬取
  3. 分页逻辑未按议员独立处理:所有议员共享同一个分页循环,没有针对每个议员单独遍历其所有分页

修正方案

from bs4 import BeautifulSoup
import requests

# 存储所有爬取到的数据
meeting_data = []
# 100+个memberId列表,示例仅列3个
member_ids = ["197506", "124861", "229519"]
base_url = "https://www.europarl.europa.eu/meps/en/loadmore-meetings?meetingType=PAST&memberId={}&termId=9&page={}&pageSize=10"

# 遍历每个议员的memberId
for member_id in member_ids:
    page = 0
    has_next_page = True
    print(f"开始爬取议员ID {member_id} 的数据")
    
    # 针对当前议员循环分页,直到没有下一页
    while has_next_page:
        # 动态生成当前页码的请求URL
        current_url = base_url.format(member_id, page)
        try:
            response = requests.get(current_url)
            response.raise_for_status()  # 捕获HTTP请求错误
            soup = BeautifulSoup(response.text, "lxml")
            items = soup.find_all("div", class_="europarl-expandable-item")
            
            # 提取当前页数据
            for item in items:
                # 用get_text(strip=True)简化处理,加try-except避免字段缺失导致报错
                try:
                    title = item.find(class_="t-item").get_text(strip=True)
                    date = item.find(class_="erpl_document-subtitle-date").get_text(strip=True)
                    address = item.find(class_="erpl_document-subtitle-location").get_text(strip=True)
                    reporter = item.find(class_="erpl_document-subtitle-reporter").get_text(strip=True)
                    author = item.find(class_="erpl_document-subtitle-author").get_text(strip=True)
                    
                    meeting_data.append([author, date, address, reporter, title])
                except AttributeError:
                    # 若某个字段缺失,跳过当前条目或记录错误
                    print(f"议员ID {member_id} 第{page}页某条目字段缺失,跳过")
                    continue
            
            # 判断当前议员是否还有下一页
            load_more_btn = soup.find("button", class_='btn btn-default europarl-expandable-async-loadmore')
            has_next_page = load_more_btn is not None
            
            print(f"议员ID {member_id} 第{page}页爬取完成")
            page += 1
            
        except requests.exceptions.RequestException as e:
            print(f"请求议员ID {member_id} 第{page}页时出错: {e}")
            break

# 可选:将数据保存到CSV
import csv
with open('mep_meetings.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(["作者", "日期", "地点", "报告人", "标题"])
    writer.writerows(meeting_data)

print(f"爬取完成,共获取{len(meeting_data)}条会议数据")

关键改进点

  • 动态生成URL:仅维护memberId列表,每次分页时动态拼接对应页码的请求地址,确保页码正确递增
  • 独立分页循环:每个议员单独进行分页循环,互不干扰,保证所有议员的全量数据都能被爬取
  • 异常处理:增加HTTP请求错误和字段缺失的捕获逻辑,避免单次错误导致整个爬取任务终止
  • 简化数据处理:用get_text(strip=True)直接去除文本前后空格,减少代码冗余

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:50:43