爬取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加载完成后再提取数据,适合新手快速解决动态页面爬取问题。
步骤:
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如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
相关产品推荐
相关产品推荐

