我有一个功能可以通过 Rotowire 获取每个 NBA 球员的预计上场时间。它运行良好,但周末该网站似乎添加了某种 Google Ads iFrame,现在导致我的程序抛出“ElementClickInterceptedException:在点 (x,y) 处不可点击。”
我使用“execute_script”(滚动到视图/强制单击)进行了一些调整,以尝试解决此异常,并最终设法再次访问分钟投影,但现在程序仅返回每个团队中的一个团队的值对决(客队)。
def get_nba_lineups():
driver = gs.Chrome()
## Some code to login
# Navigate to NBA Lineups
driver.get('https://www.rotowire.com/basketball/nba-lineups.php')
time.sleep(3)
data = []
buttons = WebDriverWait(driver, 3).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "see-proj-minutes")))
for button in buttons:
driver.execute_script("arguments[0].scrollIntoView(true);", button)
time.sleep(1)
WebDriverWait(driver, 3).until(EC.element_to_be_clickable(button))
driver.execute_script("arguments[0].click();", button)
time.sleep(1)
team = WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.CLASS_NAME, 'lineups-viz')))
teamName = team.find_element(By.TAG_NAME, 'img').get_attribute('alt')
players = driver.find_elements(By.CLASS_NAME, 'lineups-viz__player')
for player in players:
name = player.find_element(By.TAG_NAME, 'a').text
projMin = player.find_element(By.CLASS_NAME, "minutes-meter__proj")
projMin = int(projMin.text.split(' ')[0])
data.append({'Team': teamName, 'Player': name, 'Projected Minutes': projMin})
close_button = WebDriverWait(driver, 3).until(
EC.element_to_be_clickable((By.CLASS_NAME, "lineups-viz__close"))
)
driver.execute_script("arguments[0].click();", close_button)
time.sleep(1)
driver.quit()
df = pd.DataFrame(data)
return df
有谁知道为什么这不再获取所有数据以及我该如何修复它?或者,如何绕过阻止按钮的 iFrame,以便我可以再次使用以前的工作代码?我尝试扩大驱动程序窗口并添加额外的暂停,但到目前为止没有任何效果。预先感谢您的任何建议。
您的代码应该可以正常工作。我没有登录,所有家庭统计数据都被隐藏并要求订阅。 检查您登录的用户是否可以正确访问它。
否则,您应该能够使用代码抓取数据。
最好使用js点击按钮而不是关闭广告iframe。