如何抓取Soccerdonna网站所有球员Profile,筛选牙买加第二国籍
解决Soccerdonna网站抓取第二国籍为牙买加的女足球员问题
原代码的核心问题
- 仅抓取首页无效:首页没有球员列表或国籍数据,根本无法获取目标内容。
- 元素定位完全错误:
div.table-responsive并非存储球员链接或国籍信息的容器,定位逻辑偏离实际页面结构。 - 缺乏批量遍历逻辑:没有处理网站的球员索引页面,无法批量获取球员个人主页链接。
修正后的实现思路
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()
关键说明
- 字母索引遍历:通过遍历A-Z字母页面,批量获取所有球员的个人主页链接。
- 元素定位微调:代码中的选择器(如
a[href*='/profil/spieler_']、div.nationalitaet)需根据网站真实HTML结构调整,建议用浏览器开发者工具查看实际元素属性。 - 反爬处理:添加请求头模拟浏览器访问,设置1秒延迟避免请求过于频繁。
- 国籍判断逻辑:根据页面多国籍的分隔格式(如"/")调整判断条件,确保筛选出第二国籍为牙买加的球员。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

