如何使用BeautifulSoup抓取页面?页面源不匹配检查元素

时间:2018-10-20 22:09:06

标签: python web-scraping beautifulsoup

我正在尝试从this fantasy basketball page中抓取一些东西。我正在Python 3.5+中使用BeautifulSoup来做到这一点。

source_code = requests.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975')
plain_text = source_code.text
soup = BeautifulSoup(plain_text, 'lxml')

首先,我想将9个类别的标题刮到Python列表中。所以我的列表应该看起来像categories = [FG%, FT%, 3PM, REB, AST, STL, BLK, TO, PTS]

我希望做的事情如下:

tableSubHead = soup.find_all('tr', class_='Table2__header-row')
tableSubHead = tableSubHead[0]
listCats = tableSubHead.find_all('th')
categories = []
for cat in listCats:
  if 'title' in cat.attrs:
  categories.append(cat.string)

但是,soup.find_all('tr', class_='Table2__header-row')返回一个空列表,而不是我想要的表行元素。我怀疑这是因为当我查看页面源代码时,它与Chrome Dev Tools中的Inspect Element完全不同。我了解这是因为Javascript动态更改了页面上的元素,但我不确定解决方案是什么。

2 个答案:

答案 0 :(得分:1)

这可能并不是您所要查找的,但是由于页面源没有任何内容,因此它并不是真的有用。但是,很明显,在加载记分板时,该站点会进行几次API调用,这些API很可能具有您要查找的所有数据。

其中一个API call here似乎具有您所需要的所有信息。

import requests
payload = {"view":["mMatchupScore","mScoreboard","mSettings","mTeam","modular","mNav"]}
r = requests.get("http://fantasy.espn.com/apis/v3/games/fba/seasons/2019/segments/0/leagues/633975", params=payload).json()

# r is a json object with all the data in it

答案 1 :(得分:1)

您面临的问题是因为该网站是一个Web应用程序,这意味着必须运行javascript以生成您所看到的内容,而不能使用request运行javascript,这就是我确实使用selenium来获得结果,它打开了一个无头浏览器,并通过等待一段时间来使javascript首先运行:

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time

# source_code = requests.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975')

options = webdriver.ChromeOptions()
options.add_argument('headless')
capa = DesiredCapabilities.CHROME
capa["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(chrome_options=options, desired_capabilities=capa)
driver.set_window_size(1440,900)
driver.get('http://fantasy.espn.com/basketball/league/standings?leagueId=633975')
time.sleep(15)

plain_text = driver.page_source
soup = BeautifulSoup(plain_text, 'lxml')

soup.select('.Table2__header-row') # Returns full results.

len(soup.select('.Table2__header-row')) # 8

这种方法将允许您运行设计为Web应用程序的网站,并大大扩展您的功能。 -您甚至可以添加要执行的命令,例如滚动或单击以加载广告投放中的更多来源。

使用pip install selenium安装硒。如果愿意,还可以使用Firefox。