Topic: Web scraping tabelle  (Letto 592 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline keiji11

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Web scraping tabelle
« il: Febbraio 28, 2018, 12:38 »
Salve a tutti,

sono intento a ricavare una tabella csv o excel da un sito calcistico,ossia nello specifico= https://it.soccerway.com/teams/england/liverpool-fc/663/matches/
ho provato a fare il programma in python ma riscontro delle anomalie nella tabella del sito ,ad esempio : spazi vuoti da eliminare,reiterazioni non effettuate dal mio programma,etc.
In realtà non capisco se il sito è dinamico oppure no.

Qualcuno che si accinge a fare il programma? Non deve essere troppo complicato e lungo

Grazie a tutti

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Web scraping tabelle
« Risposta #1 il: Febbraio 28, 2018, 13:59 »
Qualcuno che si accinge a fare il programma? Non deve essere troppo complicato e lungo

No, decisamente no. Cancellero' i commenti in tale direzione.
Questo e' un forum su Python, non un posto dove si fa lavoro su commissione non pagato.

Se vuoi aiuto, comincia con la tua soluzione, la si guarda insieme.

Comunque e' possibile che semplicemente tu stia usando gli strument sbagliati. Per questo tipo di cose vuoi usare lxml (http://lxml.de/).

Un'altra opzione e' scrapy.

Offline keiji11

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping tabelle
« Risposta #2 il: Febbraio 28, 2018, 14:58 »
Mi sono espresso male e chiedo scusa.

Io sto provando a fare il programma e ne ho una bozza su un altro pc. Appena mi è possibile caricherò il file o posterò il programma da me iniziato.

Grazie della comprensione :)

Offline keiji11

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping tabelle
« Risposta #3 il: Febbraio 28, 2018, 18:51 »
import urllib.request
import csv
from bs4 import BeautifulSoup

url = "https://it.soccerway.com/teams/italy/as-roma/1241/matches/"
html = urllib.request.urlopen(url)


outfile = open("table_data.csv","w",newline='')
writer = csv.writer(outfile)

tree = BeautifulSoup(html,"lxml")
table_tag = tree.select("table")[0]
tab_data = [[item.text for item in row_data.select("td")]
                for row_data in table_tag.select("tr")]

for data in tab_data:
    writer.writerow(data)
    print(' '.join(data))


Eccomi. Ho bisogno di eliminare gli spazi in output tra gli elementi e formare una tabella csv o excel con l'elenco delle partite per riga.

output:

dom 13/08/17 AMI 

                    Celta Vigo
                 
 

               
                4 - 1
               
             
 

                  Roma
               
 
Guarda eventi
 
Maggiori informazioni

etc...
« Ultima modifica: Febbraio 28, 2018, 18:53 da keiji11 »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Web scraping tabelle
« Risposta #4 il: Febbraio 28, 2018, 20:31 »
Provato a tirare uno strip su tutti quanti gli elementi?

writer.writerow(s.strip() for s in data)

o analogo

Offline keiji11

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping tabelle
« Risposta #5 il: Marzo 01, 2018, 17:38 »
Provato a tirare uno strip su tutti quanti gli elementi?

writer.writerow(s.strip() for s in data)

o analogo

Così banale che non ci ho pensato...grazie mille,così facendo nel file csv mi elimina gli spazi.
Ora dovrei modificare il file csv perchè mi servono determinate colonne e righe in base ad alcune caratteristiche,ad es. eliminare le ultime due colonne.

Ma prima di tutto volevo chiedere : come posso selezionare automaticamente le ultime 20 partite con risultato e togliere quelle con scritto  solo l'orario in modo più agevole dell'if? Purtroppo a volte torno fuso da lavoro e non riesco a fare le operazioni più semplici(poco tempo e poche energie)

Grazie dell'aiuto :)

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Web scraping tabelle
« Risposta #6 il: Marzo 01, 2018, 17:44 »
Ora dovrei modificare il file csv perchè mi servono determinate colonne e righe in base ad alcune caratteristiche,ad es. eliminare le ultime due colonne.

Smetti di programmare per coincidenza e capisci come funziona il codice che usi.
Passa al csv writer solo quello che vuoi che finisca nel csv.

Citazione
Ma prima di tutto volevo chiedere : come posso selezionare automaticamente le ultime 20 partite con risultato e togliere quelle con scritto  solo l'orario in modo più agevole dell'if? Purtroppo a volte torno fuso da lavoro e non riesco a fare le operazioni più semplici(poco tempo e poche energie)

Ancora una volta: scrivi in Python quello che hai detto (che sara' non banale, visto che non si capisce una mazza).
Ma ancora una volta, se hai capito come funziona il fatto che certe cose finiscano nel csv (ovvero quali operazioni fai perche' avvenga), modifica quelle operazioni in modo che succeda quello che vuoi tu.

Offline keiji11

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping tabelle
« Risposta #7 il: Marzo 02, 2018, 10:03 »
Ciao riko,

ancora grazie per òla pazienza.Ho modificato un po' il programma ,non so se ho operato nel miglior modo (sicuramente no) ma non sono esperto e me ne scuso.
Detto questo ho dell'altro lavoro da fare e perciò sto andando per gradi,ora sono a questo punto:
import requests
import pandas as pd
from bs4 import BeautifulSoup
import csv

def estrapola_sorgente(url):
    if 'https://' in url:
        sorgente = requests.get(url).text
        return(sorgente)
    else:
        return("L'url non è valido")

def estrapola_tabella(sorgente):
    outfile = open("table_data.csv", "w", newline='')
    writer = csv.writer(outfile)

    soup = BeautifulSoup(sorgente,"lxml")
    table_tag = soup.select("table")[0]
    tab_data = [[item.text for item in row_data.select("td")[0:6]]
                for row_data in table_tag.select("tr")]

    for data in tab_data:
        writer.writerow(s.strip() for s in data)



def seleziona_partite_H(tabella_csv,lega,squadra):
    df = pd.read_csv('table_data.csv',names=['Day','Date','League','HomeTeam','Score','AwayTeam'])
    df = pd.DataFrame(df)
    df = df[df['League']==lega]
    df = df[df['HomeTeam']==squadra]
    df = df[df['Score'].str.contains("-")]
    df = df[len(df)::-1]

    print(df)

s = estrapola_sorgente("https://it.soccerway.com/teams/italy/as-roma/1241/matches/")
v = estrapola_tabella(s)
seleziona_partite_H(v,"SEA","Roma")


Il problema è che io dal DataFrame df dovrei estrapolare le prime 20 righe,ma lì ce ne sono di meno perciò dovrei rimettere mano allo scraping dal sito visto che nella pagina di quest'ultimo ci sono dei filtri tabella.Io dovrei filtrare "Serie A" (o "SEA) e "In casa".

Nel programma come potrei fare quest'operazione?
« Ultima modifica: Marzo 02, 2018, 12:00 da keiji11 »

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:Web scraping tabelle
« Risposta #8 il: Marzo 02, 2018, 13:42 »
Senti, non so da dove partire. Cioe' uno comincia a guardare "estrapola_sorgente" e vede (in quattro righe):
1. nomi in italiano (lol)
2. return con parentesi (perche'?)
3. una funzione che se ha successo ti ritorna una stringa con dei dati, se fallisce ti tira un'eccezione a seconda di quello che fallisce dentro requests *oppure* ti ritorna sempre una stringa che cerca di essere un messaggio di errore.

Ora una funzione del genere e' inutile perche' si fa piu' fatica ad usarla correttamente che a non averla, poiche' e' completamente rotta e priva di senso.

Possiamo andare avanti... apri files senza curarti di nulla (context managers? pulire le risorse che usi? rings a bell?).
Per il resto hai completamente mischiato la logica business, quella di acquisizione di dati... tutto.
Hai due funzioni che comunicano... tramite un file su disco (il tutto con la gestione degli errori completamente mancante).

Il che vuole dire che *qualunque* cosa puo' succedere. Quindi non ho idea davvero di perche' le cose non funzionino: non funzionano perche' hai implementato una serie di cattive idee.
Potremmo anche metterci a debuggare il problema, ma e' come fare le pulizie in un edificio che deve essere demolito la mattina dopo.

Perche' non cerchi di capire i fondamenti piu' basilari della programmazione? Vedrai che tutte queste domande che fai troveranno risposta automaticamente nella tua testa.
Saprai perche' certe cose succedono. Saprai cosa fare per non farle succedere. Saprai editare il codice.

Ma davvero... salvare in csv (con csv) su file e poi ricaricarlo con pandas e' una delle cose piu' assurde che puoi fare (e aggiunge un layer di complicazione e fonte di errori inutile).
Piuttosto davvero, leggi i dati, ficcali in un cavolo di dataframe, salvalo come e quando ti serve, prima o dopo (o entrambi) averlo processato.

Poi si potrebbe dire che usare un dataframe e poi fare operazioni a mano sulle righe una ad una e' un'altra cosa priva di senso. Pandas esiste per fare queste cose in modo migliore.
Pero' credo che un tutorial su pandas sia un pochetto oltre quello che sai fare ora. E visto che non lo usi... che lo tiri a mano a fare? Fammi indovinare, hai fatto copy and paste di qualcuno che lo usava?