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

爬取Pickleball赛事网站数据失败,请求代码实现协助

匹克球赛事数据爬取问题解决

我尝试爬取https://pickleballbrackets.com/pts.aspx上的匹克球赛事信息,该网站收录全球匹克球赛事数据,想把数据导出到电子表格处理。目前用requests、BeautifulSoup和pandas开发,但发现页面数据是隐藏的,之前通过p标签、body标签查找数据都没成功,求代码实现帮助。

当前代码:

import requests
from bs4 import BeautifulSoup
import pandas as pd

# Make a request to the website
r = requests.get('https://pickleballbrackets.com/pts.aspx')

# Parse the HTML content
soup = BeautifulSoup(r.text, 'html.parser')

# Find the data you want to extract. For example, let's say we want to extract all the text within <p> tags.
body_tags = soup.find_all('body')

# Extract the text from each tag and store it in a list
data = [tag.text for tag in body_tags]

# Convert the list into a DataFrame
df = pd.DataFrame(data, columns=['Text'])

# Save the DataFrame to a CSV file
df.to_csv('scraped_data.csv', index=False)

问题原因

你之前的代码失败是因为页面的赛事数据是通过JavaScript动态渲染的,requests只能获取页面的静态HTML源码,无法加载JS生成的动态内容,所以找不到目标数据。

解决方案1:用Selenium模拟浏览器加载动态内容

Selenium可以模拟真实浏览器的行为,等待页面JS加载完成后再提取数据,适合新手快速解决动态页面爬取问题。

步骤:

  1. 安装Selenium:pip install selenium
  2. 下载对应浏览器的驱动(比如Chrome的ChromeDriver,要和浏览器版本匹配),并确保驱动在系统PATH中或指定路径。

代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

# 初始化Chrome浏览器驱动(需提前安装对应版本的ChromeDriver)
driver = webdriver.Chrome()
driver.get('https://pickleballbrackets.com/pts.aspx')

# 等待目标表格加载完成(根据页面实际元素调整等待条件)
try:
    # 等待页面中的赛事表格出现(需自己通过浏览器开发者工具确认表格的实际选择器)
    table = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'pts-table'))
    )
    
    # 提取表格行数据
    rows = table.find_elements(By.TAG_NAME, 'tr')
    data_list = []
    for row in rows:
        cols = row.find_elements(By.TAG_NAME, 'td')
        row_content = [col.text.strip() for col in cols]
        if row_content:  # 跳过空行
            data_list.append(row_content)
    
    # 转换为DataFrame并保存到CSV
    # 假设第一行是表头,需根据实际页面调整
    df = pd.DataFrame(data_list[1:], columns=data_list[0])
    df.to_csv('pickleball_events.csv', index=False)
    
finally:
    # 关闭浏览器
    driver.quit()

解决方案2:直接请求页面的API接口(更高效)

打开浏览器开发者工具(F12),切换到「Network」标签页,刷新页面后筛选「XHR」类型的请求,找到加载赛事数据的API接口,直接用requests请求该接口获取结构化的JSON数据,无需渲染页面。

示例代码(需替换为实际找到的API地址):

import requests
import pandas as pd

# 替换为实际找到的赛事数据API接口
api_url = 'https://pickleballbrackets.com/api/pts-data'
response = requests.get(api_url)
raw_data = response.json()

# 根据API返回的JSON结构转换为DataFrame
df = pd.DataFrame(raw_data['events'])
df.to_csv('pickleball_events.csv', index=False)

注意事项

  • 爬取前请遵守网站的robots.txt规则,控制请求频率避免被封禁IP。
  • 使用Selenium时,务必保证浏览器驱动与浏览器版本匹配,否则会出现启动失败的问题。
  • 页面元素选择器(如类名、ID)和API接口需要你自行通过浏览器开发者工具确认,示例中的选择器为假设值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:35:43