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);")``
3 Réponses :
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);")
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()
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)
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.