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

如何抓取Soccerdonna网站所有球员Profile,筛选牙买加第二国籍

解决Soccerdonna网站抓取第二国籍为牙买加的女足球员问题

原代码的核心问题

  1. 仅抓取首页无效:首页没有球员列表或国籍数据,根本无法获取目标内容。
  2. 元素定位完全错误:div.table-responsive并非存储球员链接或国籍信息的容器,定位逻辑偏离实际页面结构。
  3. 缺乏批量遍历逻辑:没有处理网站的球员索引页面,无法批量获取球员个人主页链接。

修正后的实现思路

Soccerdonna的女足球员按A-Z字母索引分类,我们可以先遍历所有字母索引页面,抓取每个球员的个人主页链接,再逐个进入主页提取国籍信息,筛选出第二国籍为牙买加的球员。

完整代码实现

import requests
from bs4 import BeautifulSoup
import time
from urllib.parse import urljoin

# 基础配置
BASE_URL = "https://www.soccerdonna.de"
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
TARGET_KEYWORD = "Jamaica"
valid_players = []

def get_player_links_from_alphabet_page(letter):
    """从字母索引页面抓取所有球员链接"""
    url = f"{BASE_URL}/en/spielerinnen/{letter}.html"
    response = requests.get(url, headers=HEADERS)
    if response.status_code != 200:
        print(f"无法访问字母页面 {letter}")
        return []
    
    soup = BeautifulSoup(response.text, "html.parser")
    # 定位球员链接(根据页面实际结构调整)
    player_links = []
    for link in soup.select("a[href*='/profil/spieler_']"):
        full_url = urljoin(BASE_URL, link["href"])
        player_links.append(full_url)
    return player_links

def check_player_nationality(player_url):
    """检查球员个人主页的国籍信息"""
    try:
        response = requests.get(player_url, headers=HEADERS)
        if response.status_code != 200:
            return None
        
        soup = BeautifulSoup(response.text, "html.parser")
        # 定位国籍区域(需根据页面真实结构微调)
        nationality_section = soup.find("div", class_="nationalitaet")
        if not nationality_section:
            return None
        
        nationality_text = nationality_section.text.strip().lower()
        # 判断是否包含牙买加且为第二国籍(根据页面多国籍显示格式调整)
        if TARGET_KEYWORD.lower() in nationality_text and "/" in nationality_text:
            player_name = soup.find("h1").text.strip()
            return {"name": player_name, "url": player_url}
        return None
    except Exception as e:
        print(f"处理球员页面 {player_url} 时出错: {e}")
        return None

def main():
    # 遍历A-Z字母页面
    for letter in "abcdefghijklmnopqrstuvwxyz":
        print(f"正在处理字母 {letter.upper()}...")
        player_links = get_player_links_from_alphabet_page(letter)
        for link in player_links:
            player_info = check_player_nationality(link)
            if player_info:
                valid_players.append(player_info)
            # 添加延迟避免反爬
            time.sleep(1)
    
    # 输出结果
    print(f"\n找到 {len(valid_players)} 名第二国籍为牙买加的球员:")
    for idx, player in enumerate(valid_players, 1):
        print(f"{idx}. {player['name']} - {player['url']}")

if __name__ == "__main__":
    main()

关键说明

  1. 字母索引遍历:通过遍历A-Z字母页面,批量获取所有球员的个人主页链接。
  2. 元素定位微调:代码中的选择器(如a[href*='/profil/spieler_']、div.nationalitaet)需根据网站真实HTML结构调整,建议用浏览器开发者工具查看实际元素属性。
  3. 反爬处理:添加请求头模拟浏览器访问,设置1秒延迟避免请求过于频繁。
  4. 国籍判断逻辑:根据页面多国籍的分隔格式(如"/")调整判断条件,确保筛选出第二国籍为牙买加的球员。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:33:16