2017-08-24 3 views
0

Je récupère des données à partir d'une liste de centaines d'URL, chacune contenant une table contenant des données statistiques de baseball. Au sein de chaque URL unique dans la liste, il y a une table pour toutes les saisons d'une seule carrière de joueur de baseball, comme ceci:Récupération de données de table à partir d'une liste d'URL (contenant chacune une table unique) dans le but de l'ajouter à une seule liste/base de données?

https://www.baseball-reference.com/players/k/killeha01.shtml

J'ai réussi à créer un script pour ajouter les données à partir un seul URL dans une seule liste/base de données. Cependant, voici ma question:

Comment dois-je ajuster mon code pour gratter une liste complète des centaines d'URL de ce domaine, puis ajoutez toutes les lignes de table de toutes les URL en une seule liste/dataframe ?

Mon format général pour gratter une seule URL est la suivante:

import pandas as pd 
from urllib.request import urlopen 
from bs4 import BeautifulSoup 

url_baseball_players = ['https://www.baseball-reference.com/players/k/killeha01.shtml'] 

def scrape_baseball_data(url_parameter): 

    html = urlopen(url_parameter) 

    # create the BeautifulSoup object 
    soup = BeautifulSoup(html, "lxml") 

    column_headers = [SCRAPING COMMAND WITH CSS SELECTOR GADGET FOR GETTING COLUMN HEADERS] 

    table_rows = soup.select(SCRAPING COMMAND WITH CSS SELECTOR GADGET FOR GETTING ALL OF THE DATA FROM THE TABLES INCLUDING HTML CHARACTERS) 

    player_data = [] 

    for row in table_rows: 

     player_list = [COMMANDS FOR SCRAPING HTML DATA FROM THE TABLES INTO AN ORGANIZED LIST] 

     if not player_list: 
      continue 

     player_data.append(player_list) 

    return player_data 

list_baseball_player_data = scrape_baseball_data(url_baseball_players) 

df_baseball_player_data = pd.DataFrame(list_baseball_player_data) 

Répondre

1

Si url_baseball_players est une liste de toutes les URL que vous souhaitez gratter, et votre résultat attendu est une trame de données (où vous ajoutez, rangée sage, les données de chaque nouvelle URL), puis il suffit de continuer à ajouter avec concat() que vous itérer sur les URL:

df = pd.DataFrame() 

for url in url_baseball_players: 
    df = pd.concat([df, pd.DataFrame(scrape_baseball_data(url))]) 
+0

Ceci est une telle solution élégante. Je pensais vraiment que je devais changer le code dans la fonction et ne réalisais même pas qu'il était possible de faire une boucle for dans l'appel de la fonction. Merci! – TJE