【问题标题】:How do you web-scrape past a "show more" button using BeautifulSoup Python?你如何使用 BeautifulSoup Python 抓取“显示更多”按钮?
【发布时间】:2021-11-06 03:28:13
【问题描述】:

我在 python 上使用 BeautifulSoup 从这个网站上抓取足球统计数据:https://www.skysports.com/premier-league-results/2020-21。然而,该网站只显示了本赛季的前 200 场比赛,其余 180 场比赛都在“显示更多”按钮后面。按钮不会更改 url,所以我不能只替换 url。

这是我的代码:

from bs4 import BeautifulSoup
import requests

scores_html_text = requests.get('https://www.skysports.com/premier-league-results/2020-21').text
scores_soup = BeautifulSoup(scores_html_text, 'lxml')

fixtures = scores_soup.find_all('div', class_ = 'fixres__item')

这只会获得前 200 个灯具。

如何通过显示更多按钮访问 html?

【问题讨论】:

  • 你可以试试 Selenium。铬驱动有无头模式,所以你可以找到按钮并点击它!

标签: python web-scraping beautifulsoup


【解决方案1】:

我不知道如何使用 BeautifulSoup 执行此操作,但这是我使用 Selenium 执行此操作的方式(请注意,我对 Selenium 非常陌生,因此可能有更好的方法来执行此操作)。

使用的导入是:

from selenium import webdriver
import time

您还需要下载 Chrome 网络驱动程序(假设您在 Chrome 上),并将其放在与您的脚本相同的目录中,或放在您的库路径中。

会有一个 cookie 弹出窗口,您必须解决它:

# prepare the driver
URL = "https://www.skysports.com/premier-league-results/2020-21"
driver = webdriver.Chrome()
driver.get(URL)
# wait so that driver has loaded before we look for the cookies popup
time.sleep(2)

# accept cookies popup, which occurs in an iframe
# begin by locating iframe
frame = driver.find_element_by_id('sp_message_iframe_533903')
# find the accept button (inspect element and copy Xpath of button)
driver.find_element_by_xpath('//*[@id="notice"]/div[3]/button[1]').click()
time.sleep(2)
driver.refresh()

# find "show more text" button and click
driver.find_element_by_class_name("plus-more__text").click()

【讨论】:

    【解决方案2】:

    我尝试提升了几个级别,这很有效,你可能需要再处理一下。

    from bs4 import BeautifulSoup
    import requests
    
    scores_html_text = requests.get('https://www.skysports.com/premier-league-results/2020-21').text
    scores_soup = BeautifulSoup(scores_html_text,'lxml')
    
    fixtures = scores_soup.find(class_ = 'site-layout-secondary block page-nav__offset grid')
    print(fixtures)

    【讨论】:

      【解决方案3】:

      隐藏的结果在<script>标签内,所以要获得所有380个结果你需要额外解析它:

      import requests
      import pandas as pd
      from bs4 import BeautifulSoup
      
      url = "https://www.skysports.com/premier-league-results/2020-21"
      soup = BeautifulSoup(requests.get(url).content, "html.parser")
      
      script = soup.select_one('[type="text/show-more"]')
      script.replace_with(BeautifulSoup(script.contents[0], "html.parser"))
      
      all_data = []
      for item in soup.select(".fixres__item"):
          all_data.append(item.get_text(strip=True, separator="|").split("|")[:5])
          all_data[-1].append(
              item.find_previous(class_="fixres__header2").get_text(strip=True)
          )
      
      df = pd.DataFrame(
          all_data, columns=["Team 1", "Score 1", "Score 2", "Time", "Team 2", "Date"]
      )
      print(df)
      df.to_csv("data.csv", index=False)
      

      打印:

                             Team 1 Score 1 Score 2   Time                    Team 2                     Date
      0                     Arsenal       2       0  16:00  Brighton and Hove Albion          Sunday 23rd May
      1                 Aston Villa       2       1  16:00                   Chelsea          Sunday 23rd May
      2                      Fulham       0       2  16:00          Newcastle United          Sunday 23rd May
      3                Leeds United       3       1  16:00      West Bromwich Albion          Sunday 23rd May
      
      ...
      
      377            Crystal Palace       1       0  15:00               Southampton  Saturday 12th September
      378                 Liverpool       4       3  17:30              Leeds United  Saturday 12th September
      379           West Ham United       0       2  20:00          Newcastle United  Saturday 12th September
      

      并保存 data.csv(来自 LibreOffice 的屏幕截图):

      【讨论】:

        猜你喜欢
        • 2021-07-26
        • 2020-10-04
        • 2018-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2021-09-26
        • 2020-06-28
        • 1970-01-01
        相关资源
        最近更新 更多