Python 如何使用Selenium.click

Python 如何使用Selenium.click,python,selenium,selenium-webdriver,web-scraping,selenium-chromedriver,Python,Selenium,Selenium Webdriver,Web Scraping,Selenium Chromedriver,所以我正努力从他那里得到一些文件。我正在使用selenium和chrome webdriver。我不太明白如何点击“获取统计数据”。我可以手动完成,但希望通过html和selenium完成 我试过这个: browser = webdriver.Chrome() browser.get('https://www.pbpstats.com/totals/nba/player') element = browser.find_elements_by_tag_name('button') element

所以我正努力从他那里得到一些文件。我正在使用selenium和chrome webdriver。我不太明白如何点击“获取统计数据”。我可以手动完成,但希望通过html和selenium完成

我试过这个:

browser = webdriver.Chrome()
browser.get('https://www.pbpstats.com/totals/nba/player')
element = browser.find_elements_by_tag_name('button')
element.click()

但什么也没发生。我不知道如何理解find_elements_by_tag_name的输出。获取类似于“this selenium.webdriver.remote.webelement.webelement(session=“14bacd9bab4b484952ba872ea037663”,element=“4ef4e9da-b193-46a8-8209-265b8bef3f05”(等号后不同)

您可以执行如下单击:

browser = webdriver.Chrome()
browser.get('https://www.pbpstats.com/totals/nba/player')
time.sleep(5)
element = browser.find_elements_by_xpath('//* 
 [@id="totals"]/main/div[3]/div/button[1]')[0]
element.click()

尝试一下,应该会有帮助:

import time

browser = webdriver.Chrome()
browser.get('https://www.pbpstats.com/totals/nba/player')
time.sleep(4)
element = browser.find_element_by_xpath("//button[text()='Get Stats']")
element.click()
或者可以显式使用wait,如下所示:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait


timeout = 30
browser = webdriver.Chrome()
browser.get('https://www.pbpstats.com/totals/nba/player')
myElem = WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Get Stats']")))
myElem.click()

Selenium在这里有点过分,因为数据是从api返回的。只需从那里获取数据。您还可以获得所有数据,而不必通过每个下拉列表来获取得分、助攻、篮板等(全部248列)

如果您想要每场比赛和/或每100次占有,那么只要在拥有数据帧后,将数值int列除以
'GP'
'appoints'*100
列即可

import requests
import pandas as pd

url = 'https://api.pbpstats.com/get-totals/nba'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'}
payload = {
'Season': '2020-21',
'SeasonType': 'Regular+Season',
'Type': 'Player'}

jsonData = requests.get(url, headers=headers, params=payload).json()
df = pd.DataFrame(jsonData['multi_row_table_data'])

df.to_csv('pbpstats_export.csv', index=False)
数据将以alpha顺序随列而来,因此,如果您想在写入文件之前移动这些数据,您可以将您想要的列放在第一位。我只选择名称和团队,因为它们通常是运动表中的前两列:

# If you want to reorder the first few columns. Otherwise columns are i alpha order
reorder = ['Name','TeamAbbreviation']
for col in reversed(reorder):
    col = df.pop(col)
    df.insert(0, col.name, col)
输出:

print(df)
                  Name TeamAbbreviation  2pt And 1 Free Throw Trips  \
0        Julius Randle              NYK                        35.0   
1         Nikola Jokic              DEN                        24.0   
2          Buddy Hield              SAC                         3.0   
3     Domantas Sabonis              IND                        32.0   
4           RJ Barrett              NYK                        21.0   
..                 ...              ...                         ...   
495      Jontay Porter              MEM                         NaN   
496  Ty-Shon Alexander              PHX                         NaN   
497      Rayjon Tucker              PHI                         NaN   
498     Brian Bowen II              IND                         1.0   
499       Jared Harper              NYK                         NaN   

     Arc3Accuracy  Arc3Assists  ...  BlockedCorner3  Period3Fouls5Minutes  \
0        0.408284         90.0  ...             NaN                   NaN   
1        0.422360         87.0  ...             NaN                   NaN   
2        0.365796         22.0  ...             NaN                   NaN   
3        0.281818        101.0  ...             NaN                   NaN   
4        0.318681         32.0  ...             NaN                   NaN   
..            ...          ...  ...             ...                   ...   
495      0.500000          NaN  ...             NaN                   NaN   
496           NaN          NaN  ...             NaN                   NaN   
497      1.000000          NaN  ...             NaN                   NaN   
498           NaN          NaN  ...             NaN                   NaN   
499           NaN          NaN  ...             NaN                   NaN   

     HeaveMakes  Period1Fouls3Minutes  Period2Fouls4Minutes  
0           NaN                   NaN                   NaN  
1           NaN                   NaN                   NaN  
2           NaN                   NaN                   NaN  
3           NaN                   NaN                   NaN  
4           NaN                   NaN                   NaN  
..          ...                   ...                   ...  
495         NaN                   NaN                   NaN  
496         NaN                   NaN                   NaN  
497         NaN                   NaN                   NaN  
498         NaN                   NaN                   NaN  
499         NaN                   NaN                   NaN  

[500 rows x 248 columns]

当您使用
find\u elements\u by\u tag\u name
(注意元素中的s)时,这将不起作用它返回一个列表。啊,我的错。我尝试了元素。单击,但没有发生任何事情。webdriver不更新。尝试使用xpath它现在应该可以工作了谢谢它-它帮助了。如果它工作了,那么你应该接受它作为答案。啊,好的,使用元素*。只是一个问题。根据以前的答案尝试了类似的方法。你怎么知道我t是“text()=get stats”-在html中,它没有显示文本?嗯,好吧,只是一些例子,我看到它在哪里是明确的,它是什么样子的id=somthing。数据-v-…有什么重要意义吗?不确定要确认在哪里:/啊,当然谢谢。最后一部分超时似乎不起作用。哦,我不太知道什么是api。我的计划是获取统计数据,然后单击“导出统计”我不知道这与使用api相比是否太不合法。好吧,两种方法都可以完成工作。这取决于你想做什么。有点像你想钉钉子。大锤和普通锤都可以,但考虑到选项,其中一种可能是更好的选择。在在这种情况下,API是一种更有效的方法,并且会更健壮(它不依赖于html结构)。我还添加了写入文件的部分,这基本上就是导出到csv的部分。可以看出我的工作更有效,但是你怎么知道如何用python编写它?你的意思是什么?不确定你在这里问什么。如果你是指我是如何知道api的。如果你在浏览器上转到开发工具,然后转到网络->XHR,你可以看到提出的请求。只需从那里拉出url并查看预览选项卡即可查看返回的内容。