0
votes

Point non cliquable (sélénium)

J'essaie de cliquer sur le bouton "Afficher plus", mais je ne peux pas.

Avez-vous de l'aide? Merci beaucoup.

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('https://www.scorespro.com/basketball/china/cba/results/')
time.sleep(2)
showmore = driver.find_element_by_link_text("Show more")
showmore.click()
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")``




0 commentaires

3 Réponses :


1
votes

La division de la hauteur par un nombre peut diminuer la hauteur du défilement et s'arrêtera là où Afficher plus visible

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('https://www.scorespro.com/basketball/china/cba/results/')
driver.execute_script("window.scrollTo(0, document.body.scrollHeight/1.35);")
time.sleep(2)
driver.find_element_by_class_name("show_more").click()
time.sleep(2)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")


0 commentaires

0
votes

Deux problèmes avec votre code: Tout d'abord, vous essayez de faire défiler après avoir cliqué, où comme il se doit avant. Deuxième Vous utilisez la hauteur de l'écran qui peut fonctionner dans un bit de périphérique pas dans un autre si la taille varie. Le meilleur moyen est de faire défiler jusqu'à l'élément lui-même et le clic. Voir le code ci-dessous. Cela a bien fonctionné:

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


driver = webdriver.Chrome('..\drivers\chromedriver')
driver.get("https://www.scorespro.com/basketball/china/cba/results/")
driver.maximize_window()
# I have accept cookies on page , so below step
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//a[text()='Agree']"))).click()
showMore = driver.find_element_by_link_text("Show more")
driver.execute_script("arguments[0].scrollIntoView();", showMore)
time.sleep(2)
showMore.click()


0 commentaires

1
votes

Si vous êtes après les tables, vous n'avez pas besoin d'utiliser Selenium. vous pouvez extraire les données directement avec des requêtes, et les analyser avec des pandas.

Pour trouver cela, lorsque vous allez sur la page, vous voulez faire un clic droit et 'Inspecter' (ou Shft-Ctrl-I). Cela ouvrira un panneau latéral. Lorsqu'il s'ouvre, vous souhaitez accéder à Réseau et XHR . Et vous voulez trier de parcourir ces demandes (et vous pouvez cliquer sur Aperçu pour voir ce qu'il renvoie. Vous devrez peut-être 1) recharger la page; et 2) cliquez autour de la table. Par exemple, une fois que j'ai cliqué sur "Afficher plus" en bas du tableau, il est apparu.

Une fois que vous l'avez trouvé, cliquez sur En-têtes et vous verrez l'URL et la charge utile, etc. Je l'ai mis en évidence dans la photo pour vous:

print(df.head(10).to_string())
             Date Final Time      Team  Final Score  Q1  Q2  Q3  Q4  Half Time Score  Combined Total Score
0  15.08.20 15:00         FT  Guandong          123  26  28  41  28               54                   238
1  15.08.20 15:00         FT  Liaoning          115  29  18  39  29               47                   238
2  13.08.20 15:00         FT  Liaoning          115  34  24  23  34               58                   228
3  13.08.20 15:00         FT  Guandong          113  38  28  27  20               66                   228
4  11.08.20 15:00         FT  Guandong          110  25  30  25  30               55                   198
5  11.08.20 15:00         FT  Liaoning           88  24  26  23  15               50                   198
6  08.08.20 15:00         FT  Guandong           88  16  21  26  25               37                   173
7  08.08.20 15:00         FT   Beijing           85  13  24  20  28               37                   173
8  07.08.20 15:00         FT  Liaoning          119  22  40  29  28               62                   232
9  07.08.20 15:00         FT  Xinjiang          113  33  22  34  24               55                   232

Sortie:

import requests
import pandas as pd


url = 'https://www.scorespro.com/basketball/ajaxdata_more.php'
headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Mobile Safari/537.36'}


dfList = []
for season in ['2018-2019','2019-2020']:
    continueLoop = True
    page = 1
    while continueLoop == True:
        print ('%s Collecting Page: %s' %(season,page))
        payload = {
        'country': 'china',
        'comp': 'cba',
        'season': season,
        'status': 'results',
        'league': '',
        'page': '%s' %page}
    
    
        response = requests.get(url, headers=headers, params=payload)
        
        try:
            dfs = pd.read_html(response.text)
        except ValueError:
            print ('No more tables found.')
            continueLoop = False
            
        page+=1
        dfList.extend(dfs)

dfList_single = []
cols = ['Date','Final Time', 'Team', 'Final Score','Q1','Q2','Q3','Q4','OT','Half Time Score','Combined Total Score']
for each in dfList:
    each = each.loc[:,[0, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12]]
    each.columns = cols
    teamA = each.iloc[0,:]
    teamB = each.iloc[1,2:]
    temp_df = pd.concat([teamA, teamB], axis=0).to_frame().T
    dfList_single.append(temp_df)


df = pd.concat(dfList_single)
df = df.reset_index(drop=True)


11 commentaires

Merci beaucoup pour la réponse. Que dois-je faire si je veux des saisons ensemble? Par exemple, saison 2018/2019 et 2019/2020.


Vous pouvez utiliser ce paramètre dans la charge utile et effectuer une itération. Je vais vous montrer un exemple. demain


Merci @ chitown88. Si je veux mettre chaque match dans une même ligne, que dois-je faire? Avec le sélénium, je recherche le sélecteur css et je peux mettre chacun dans une colonne, mais avec cette boucle, je ne peux pas le comprendre.


que veux-tu dire? pas sûr que je comprends ce que vous voulez? donc au lieu de 2 lignes par match, juste 1 ligne?


Oui! @ chitown88


@EnriqueRamirezMoreno ok essayez maintenant


Tout simplement merveilleux. @ Chitown88 Je ne savais rien de l'extraction de données depuis ajaxdata_more.php. Puis-je trouver un tutoriel quelque part? Merci beaucoup


J'essaie de faire la même chose avec le «football» mais je ne peux pas. Pourquoi cela ne fonctionne-t-il pas si je change de «basketball» par «soccer»?


Je viens de comprendre comment réussir avec le football. Merci beaucoup pour tout. Une dernière question @ chitown88 Où avez-vous obtenu cette URL: ' scorespro.com/basketball/ajaxdata_more.php '?


@EnriqueRamirezMoreno, content que vous ayez compris le football, j'allais répondre ce matin (je reste généralement loin de l'ordinateur portable pendant le week-end). J'ai ajouté comment trouver l'url dans la solution ci-dessus


Hehe. Je suis censé le faire. Merci beaucoup. Tu m'as été vraiment utile. Content que tu m'aides.