2017-09-04 1 views
-2

J'essaie d'obtenir les informations de chaque coureur de this 2017 marathon. Le problème est que pour obtenir l'information que je veux, je devrais cliquer sur le nom de chaque coureur pour obtenir son partial splits.Conseils sur l'utilisation d'une boucle à travers les paramètres d'une demande d'obtention

Je sais que je peux utiliser une requête get pour obtenir les informations de chaque coureur. Par exemple, pour le coureur Josh Griffiths, je peux utiliser request.get en utilisant les paramètres de l'URL.

Mon problème est que je ne sais pas comment déterminer le terme idp car ce terme change avec chaque coureur.

Mes questions sont les suivantes:

  1. Est-il possible d'utiliser une boucle pour obtenir l'information de tous les coureurs utilisant une demande get? Comment puis-je résoudre le problème avec le `idp? Je veux dire, le fait que je ne sais pas comment ce terme est déterminé et je ne sais pas comment définir une boucle en l'utilisant. Y a-t-il une meilleure méthode pour obtenir l'information de chaque coureur? J'ai pensé à utiliser Selenium-Webdriver, mais ce serait très lent.

Un conseil serait apprécié!

+0

Les liens sont rompus. – Tico

+0

@Tico Ils fonctionnent dans mon navigateur. – Belisario

+0

Eh bien ... maintenant ils travaillent ..:/Bizarre ... Avant il y avait une page twitter cassée. Très étrange. Sry à propos de ça. – Tico

Répondre

1

Vous aurez besoin d'utiliser quelque chose comme BeautifulSoup pour analyser le HTML pour les liens dont vous avez besoin, de cette façon, il n'est pas nécessaire d'essayer de comprendre comment construire la requête.

import requests 
from bs4 import BeautifulSoup 

base_url = "http://results-2017.virginmoneylondonmarathon.com/2017/" 
r = requests.get(base_url + "?pid=list") 
soup = BeautifulSoup(r.content, "html.parser") 
tbody = soup.find('tbody') 

for tr in tbody.find_all('tr'): 
    for a in tr.find_all('a', href=True, class_=None): 
     print 
     print a.parent.get_text(strip=True)[1:] 
     r_runner = requests.get(base_url + a['href']) 
     soup_runner = BeautifulSoup(r_runner.content, "html.parser") 

     # Find the start of the splits 
     for h2 in soup_runner.find_all('h2'): 
      if "Splits" in h2: 
       splits_table = h2.find_next('table') 

       splits = [] 
       for tr in splits_table.find_all('tr'): 
        splits.append([td.text for td in tr.find_all('td')]) 

       for row in splits: 
        print ' {}'.format(', '.join(row)) 

       break 

Pour chaque lien, vous devez ensuite le suivre et analyser les séparations du code HTML renvoyé. Le script affiche à partir comme suit:

Boniface, Anna (GBR) 

    5K, 10:18:05, 00:17:55, 17:55, 03:35, 16.74, - 
    10K, 10:36:23, 00:36:13, 18:18, 03:40, 16.40, - 
    15K, 10:54:53, 00:54:44, 18:31, 03:43, 16.21, - 
    20K, 11:13:25, 01:13:15, 18:32, 03:43, 16.19, - 
    Half, 11:17:31, 01:17:21, 04:07, 03:45, 16.04, - 
    25K, 11:32:00, 01:31:50, 14:29, 03:43, 16.18, - 
    30K, 11:50:44, 01:50:34, 18:45, 03:45, 16.01, - 
    35K, 12:09:34, 02:09:24, 18:51, 03:47, 15.93, - 
    40K, 12:28:43, 02:28:33, 19:09, 03:50, 15.67, - 
    Finish, 12:37:17, 02:37:07, 08:35, 03:55, 15.37, 1 

Griffiths, Josh (GBR) 

    5K, 10:15:52, 00:15:48, 15:48, 03:10, 18.99, - 
    10K, 10:31:42, 00:31:39, 15:51, 03:11, 18.94, - 
    .... 

Pour mieux comment comprendre comment cela fonctionne, vous devez d'abord jeter un oeil à la source HTML pour chacune des pages. L'idée étant de trouver quelque chose d'unique sur ce que vous cherchez dans la structure de la page pour vous permettre de l'extraire à l'aide d'un script.

Ensuite, je vous recommande de lire la page de documentation de BeautifulSoup. Cela suppose que vous comprenez la structure de base d'un document HTML. Cette bibliothèque vous fournit de nombreux outils pour vous aider à rechercher et extraire des éléments du HTML. Par exemple, trouver où sont les liens. Toutes les pages Web ne peuvent pas être analysées comme cela, car l'information est souvent créée en utilisant Javascript. Dans ces cas, vous devrez utiliser quelque chose comme selenium mais dans ce cas, requests et beautifulsoup font bien le travail.