[英]Webscraping with selenium
我想在2019年1月10日在數據框中存儲所有用於NHL $ 30K芬蘭語Flash的團隊。 到目前為止,我只能將團隊存儲在首頁上。 此外,如果用戶進入了兩個不同的團隊,則兩次都存儲了他最高排名的團隊……這是我的代碼:
#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
import time
# Driver
chromedriver =("C:/Users/Michel/Desktop/python/package/chromedriver_win32/chromedriver.exe")
driver = webdriver.Chrome(chromedriver)
# DF taht will be use later
results = pd.DataFrame()
calendar=[]
calendar.append("2019-01-10")
for d in calendar:
driver.get("https://rotogrinders.com/resultsdb/date/"+d+"/sport/4/")
time.sleep(10)
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()
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)
c=contest_list[2]
driver.get(c)
WebDriverWait(driver, 60).until(ec.presence_of_element_located((By.XPATH, './/tbody//tr//td//span//a[text() != ""]')))
# 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]
# 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)
results = results.reset_index(drop=True)
driver.close()
所以,我想:
1)遍歷所有頁面:
我確實找到了next_page
按鈕; 與:
next_button = driver.find_elements_by_xpath("//button[@type='button']")
但是,我無法在我的for循環中添加該步驟。
2)如果用戶多次參加比賽,則可以訪問不同的user_link。 我認為也許可以使用這樣的用戶頻率通過for循環來做到這一點:
users_df.groupby("User").count()
for i in range(users_df[user,"Number"]):
user_link = driver.find_elements(By.XPATH, "//a[text()='%s']" %(user))[i]
user_link.click()
但是,添加這些步驟時,我總是收到一些錯誤消息。 或者,如果工作正常,只需跳過該部分即可逐行存儲所有團隊,然后迅速關閉駕駛員...
我的建議:
對您來說,僅使用請求或任何其他等效模塊從服務器獲取數據就足夠了,因為要剪貼的服務具有api服務器,例如, 檢查鏈接 。 該示例使用第一個端點:
希望這會使您的任務更輕松。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.