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

如何通过循环遍历指定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("未收集到任何有效数据")

代码说明

  1. 函数封装:extract_match_data函数负责单个URL的请求和解析,返回结构化字典数据,同时捕获请求和解析过程中的异常
  2. URL生成:用f-string拼接URL,简洁直观
  3. 数据提取优化:原代码第二个循环逻辑冗余,改用列表推导式提取有效数据,同时过滤空的title值
  4. 异常处理:添加timeout避免请求卡住,用raise_for_status捕获HTTP错误,同时捕获其他通用异常
  5. 数据保存:将收集到的所有数据写入CSV,方便用表格软件打开查看

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:01:02