如何通过循环遍历指定matchID范围的URL批量提取网页数据?
批量处理URL数据提取实现方案
核心思路
把单URL的解析逻辑封装成可复用的函数,遍历指定范围的matchID生成目标URL,逐个请求并收集数据,同时加入异常处理避免脚本中途崩溃,最后可将数据保存到本地文件方便后续查看。
具体实现步骤
- 封装解析函数:将单个URL的HTML解析、数据提取逻辑打包成函数,输入URL返回提取到的有效数据
- 生成目标URL列表:利用
range生成46271到46394的所有matchID,拼接成完整URL - 批量遍历处理:循环每个URL,调用解析函数,收集所有数据
- 异常防护:针对网络请求失败的情况添加捕获逻辑,避免单个URL出错导致整个脚本终止
- 数据持久化:把收集到的数据保存为CSV文件,方便后续分析
修改后的完整代码
from bs4 import BeautifulSoup import requests import csv # 封装单个URL的数据提取函数 def extract_match_data(url): try: page = requests.get(url, timeout=10) page.raise_for_status() # 触发HTTP错误状态码的异常 soup = BeautifulSoup(page.content, 'html.parser') # 提取img的title属性(过滤空值) img_titles = [img.get('title') for img in soup.find_all('img') if img.get('title')] # 提取points类div的文本内容 points_data = [div.get_text(strip=True) for div in soup.find_all('div', class_="points")] return { 'url': url, 'img_titles': img_titles, 'points': points_data } except Exception as e: print(f"处理URL {url} 时出错: {str(e)}") return None # 主逻辑:批量处理所有matchID if __name__ == "__main__": # 生成matchID范围:46271到46394(range左闭右开,结束值设为46395) match_ids = range(46271, 46395) all_data = [] for match_id in match_ids: url = f"https://ktarena.com/fr/207-dofus-world-cup/match/{match_id}/1" print(f"正在处理: {url}") data = extract_match_data(url) if data: all_data.append(data) # 将数据保存到CSV文件 if all_data: with open('match_data.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['url', 'img_titles', 'points'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for item in all_data: # 列表类型数据转字符串保存 writer.writerow({ 'url': item['url'], 'img_titles': ', '.join(item['img_titles']), 'points': ', '.join(item['points']) }) print("数据已保存到 match_data.csv") else: print("未收集到任何有效数据")
代码说明
- 函数封装:
extract_match_data函数负责单个URL的请求和解析,返回结构化字典数据,同时捕获请求和解析过程中的异常 - URL生成:用
f-string拼接URL,简洁直观 - 数据提取优化:原代码第二个循环逻辑冗余,改用列表推导式提取有效数据,同时过滤空的title值
- 异常处理:添加
timeout避免请求卡住,用raise_for_status捕获HTTP错误,同时捕获其他通用异常 - 数据保存:将收集到的所有数据写入CSV,方便用表格软件打开查看
内容的提问来源于stack exchange,提问作者Joost
相关产品推荐
相关产品推荐

