如何将表从.cgi网站抓取到数据框?

问题描述 投票:0回答:1

我想从此页面抓取网球数据:https://www.tennisabstract.com/cgi-bin/leaders.cgi 任务。

我需要在 Jupyter Notebook 中使用

python
库。

当我尝试抓取此 .cgi 页面时,我无法从表中获取任何数据。有没有办法抓取 .cgi 页面?

我正在尝试的代码是:

    url = "https://www.tennisabstract.com/cgi-bin/leaders.cgi"
    response = requests.get(url, headers={"User-Agent": "XY"}) 
    #response
    page = response.content
    scraping = BeautifulSoup(page, "lxml") 
    pd.set_option('display.max_rows', None)
    table = BeautifulSoup(response.content, "lxml") 
    table = table.find_all("table")
    df = pd.read_html(str(table))
    df = df[1]

    df

我得到的结果是(当我使用 df[0] 时它会发生变化,并且在 df[2] 处失败,这适用于网站中 HTML 页面上的其他表:

python pandas dataframe web-scraping python-requests
1个回答
0
投票

数据由 JavaScript 动态加载和呈现,因此您不会从该资源上的静态响应中获取表。

  1. 您可以尝试从https://www.minorleaguesplits.com/tennisabstract/cgi-bin/jsmatches/leadersource.js

    获取并处理数据
  2. 您可以尝试使用例如来模仿浏览器

    selenium
    并使用渲染的源代码版本

示例
from selenium import webdriver
import pandas as pd

driver = webdriver.Chrome()
url = f'https://www.tennisabstract.com/cgi-bin/leaders.cgi'
driver.get(url)

pd.read_html(driver.page_source, attrs={'id':'matches'})[0]
Rk 玩家 M M W-L M W% SPW SPW-InP 王牌 王牌% DF DF% DF/2秒 第 1 次 第 1% 第二% 2%-InP 持有% 分/SG PtsL/SG
0 1 诺瓦克·德约科维奇 [SRB] 58 49-9 84.5% 69.1% 68.4% 436 8.7% 147 2.9% 8.1% 63.9% 76.2% 56.7% 61.6% 87.6% 6.1 1.9
1 2 Jannik Sinner [意大利] 76 65-11 85.5% 69.1% 68.0% 485 8.3% 137 2.4% 6.0% 60.5% 76.8% 57.2% 60.9% 89.6% 6.1 1.9
2 3 卡洛斯·阿尔卡拉斯 [ESP] 76 62-14 81.6% 67.2% 67.3% 319 5.6% 160 2.8% 8.3% 66.1% 72.6% 56.8% 61.9% 85.9% 6.2 2
...
48 49 张志珍 [中国] 50 26-24 52.0% 64.5% 63.3% 340 8.3% 119 2.9% 8.0% 63.9% 72.0% 51.2% 55.6% 80.7% 6.3 2.2
49 50 丹尼尔·埃文斯 [英国] 40 16-24 40.0% 63.4% 64.4% 163 5.3% 135 4.4% 10.4% 57.6% 71.8% 52.1% 58.1% 79.2% 6.3 2.3
50 平均 61.2% 65.7% 64.8% 8.6% 3.3% 9.0% 62.8% 73.7% 52.2% 57.3% 83.2% 6.3 2.2
© www.soinside.com 2019 - 2024. All rights reserved.