Webscraping с селеном - PullRequest
       43

Webscraping с селеном

0 голосов
/ 30 января 2019

Я хочу сохранить во фрейме данных все команды для финской флеш-игры НХЛ за $ 30 000 на 2019-01-10.Я могу хранить команду на первой странице только пока.Более того, если пользователь входит в две разные команды, его команда с самым высоким рейтингом сохраняется оба раза ... Вот мой код:

#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()

Но я всегда получаю сообщение об ошибке при добавлении этих шагов.Или, если он работает, он просто пропускает часть, чтобы хранить все команды подряд и быстро закрывает драйвер ...

1 Ответ

0 голосов
/ 30 января 2019

Мои предложения:

Для вас будет достаточно, если вы будете использовать только запросы или любой другой эквивалентный модуль для получения данных с сервера, потому что служба, которую вы хотите удалить, имеет apiсервер например проверьте ссылку .В примере используется первая конечная точка:

Надеюсь, это облегчит вашу задачу.

...