我想提取过去参加比赛的所有幻想队。要遍历日期,我只更改了URL的一小部分,如下面的代码所示:
#Packages:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
import pandas as pd
# Driver
chromedriver =("C:/Users/Michel/Desktop/python/package/chromedriver_win32/chromedriver.exe")
driver = webdriver.Chrome(chromedriver)
# Dataframe that will be use later
results = pd.DataFrame()
best_lineups=pd.DataFrame()
opti_lineups=pd.DataFrame()
#For loop over all DATES:
calendar=[]
calendar.append("2019-01-10")
calendar.append("2019-01-11")
for d in calendar:
driver.get("https://rotogrinders.com/resultsdb/date/"+d+"/sport/4/")
然后,要访问当天的不同比赛,您需要单击contest
标签。我使用以下代码查找并单击它。
# Find "Contest" tab
contest= driver.find_element_by_xpath("//*[@id='root']/div/main/main/div[2]/div[3]/div/div/div[1]/div/div/div/div/div[3]")
contest.click()
我只是检查并复制选项卡的xpath。但是,大多数情况下它都在工作,但有时我会收到错误消息“无法找到元素...”。而且,它似乎仅在我的日历循环中的第一个日期有效,并且在下一次迭代中始终会失败...我不知道为什么。我尝试以不同的方式定位它,但是我感觉缺少以下内容:
contests=driver.find_element_by_xpath("//*[@role='tab']
一旦成功单击了“竞赛”选项卡,便会显示当天的所有竞赛,您可以单击链接来访问该竞赛的所有条目。我存储了比赛以迭代所有步骤,如下所示:
list_links = driver.find_elements_by_tag_name('a')
hlink=[]
for ii in list_links:
hlink.append(ii.get_attribute("href"))
sub="https://rotogrinders.com/resultsdb"
con= "contest"
contest_list=[]
for text in hlink:
if sub in text:
if con in text:
contest_list.append(text)
# Iterate through all the entries(user) of a contest and extract the information of the team entered by the user
for c in contest_list:
driver.get(c)
然后,我想提取所有参加比赛的参赛队并将其存储在数据框中。我能够在比赛的第一页成功完成比赛。
# Waits until tables are loaded and has text. Timeouts after 60 seconds
while WebDriverWait(driver, 60).until(ec.presence_of_element_located((By.XPATH, './/tbody//tr//td//span//a[text() != ""]'))):
# while ????:
# Get tables to get the user names
tables = pd.read_html(driver.page_source)
users_df = tables[0][['Rank','User']]
users_df['User'] = users_df['User'].str.replace(' Member', '')
# Initialize results dataframe and iterate through users
for i, row in users_df.iterrows():
rank = row['Rank']
user = row['User']
# Find the user name and click on the name
user_link = driver.find_elements(By.XPATH, "//a[text()='%s']" %(user))[0]
user_link.click()
# Get the lineup table after clicking on the user name
tables = pd.read_html(driver.page_source)
lineup = tables[1]
#print (user)
#print (lineup)
# Restructure to put into resutls dataframe
lineup.loc[9, 'Name'] = lineup.iloc[9]['Salary']
lineup.loc[10, 'Name'] = lineup.iloc[9]['Pts']
temp_df = pd.DataFrame(lineup['Name'].values.reshape(-1, 11),
columns=lineup['Pos'].iloc[:9].tolist() + ['Total_$', 'Total_Pts'] )
temp_df.insert(loc=0, column = 'User', value = user)
temp_df.insert(loc=0, column = 'Rank', value = rank)
temp_df["Date"]=d
results = results.append(temp_df)
#next_button = driver.find_elements_by_xpath("//button[@type='button']")
#next_button[2].click()
results = results.reset_index(drop=True)
driver.close()
但是,还有其他页面,要访问它,您需要单击底部的小箭头next button
。此外,您可以无限期地单击该按钮。即使没有更多条目。因此,我希望能够遍历所有带有条目的页面,并在没有更多条目和更改比赛时停止。我尝试实现一个while循环来实现,但是我的代码不起作用...
答案 0 :(得分:0)
在执行该页面上的任何操作之前,您必须真正确保该页面完全加载。
此外,它似乎仅适用于我的日历循环中的第一个日期 并总是在下一次迭代中失败
通常,当硒加载浏览器页面时,即使没有完全加载,它也会尝试查找该元素。我建议您重新检查要单击的元素的 xpath 。
还尝试查看页面何时完全加载并使用time.sleep(number of seconds)
确保您点击了该元素,或者可以检查某个特定元素或该元素的属性,以使您知道页面已加载。
另一个建议是,您可以使用driver.current_url
来查看要定位的页面。我在处理多个选项卡时遇到了这个问题,我不得不告诉python / selenium手动切换到该选项卡