如何实现多URL爬取并解决加载更多式分页(仅获第一页)问题?
爬取多个URL并解决“加载更多”分页问题
问题说明
需要爬取欧洲议会MEP(议员)的过往会议数据,涉及100余个不同议员的接口(对应不同memberId),当前代码仅能获取第一页数据,无法处理“加载更多”式的分页。示例目标页面为议员Billy Kelleher的过往会议页面。
原代码问题分析
- URL生成逻辑错误:提前将初始
page=0插入到URL列表中,后续分页时URL不会自动更新页码,始终请求第一页 - 全局分页判断错误:用一个全局变量
isHaveNextPage控制所有议员的分页,只要某一个议员没有下一页,整个循环就会终止,无法完成其他议员的全量爬取 - 分页逻辑未按议员独立处理:所有议员共享同一个分页循环,没有针对每个议员单独遍历其所有分页
修正方案
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
相关产品推荐
相关产品推荐

