Topic: Web scraping  (Letto 172 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline decimox

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Web scraping
« il: Novembre 02, 2020, 01:43 »
Ciao a tutti,
Non sono esperto di programmazione e non conosco affatto python, e vi chiedo un consiglio. Vi spiego subito qual è il mio obiettivo: richiedere dati ad un sito web e scaricare sul mio pc le risposte ( in formato excel o access ). In pratica si tratta di simulare l'immissione manuale di una decina di parametri e ottenere una risposta. Ho un file excel con migliaia di righe, ognuna delle quali con la decina di parametri che mi interessano ( con valori diversi per ogni riga ). Ogni tot tempo dovrei andare a interrogare il sito leggendo una ad una queste migliaia di righe. Mi son fatto fare un programmino in VBA, ma la risposta è molto lenta, circa 3 secondi per ogni riga, passano ore ed ore...
Nel frattempo vorrei pure imparare qualcosa a livello informatico, e magari mettere mani ad una necessità del genere mi darebbe anche un obiettivo su cui concentrarmi per rendere l'apprendimento di un linguaggio più concreto...
Voi cosa mi consigliate: di studiare VBA e tentare di vedere se posso fare qualcosa, o  VBA ha dei limiti oggettivi ed è inutile allo scopo? Oppure sarebbe meglio puntare su python, che offrirebbe ben di più, da quel che mi pare di capire...
Una cosa che non mi è chiara, per esempio, è se i 3 secondi di attesa ci sarebbero anche con python, è un limite oggettivo di VBA o dipende dal sito web stesso, fatta salva la velocità della connessione internet...
Grazie

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Web scraping
« Risposta #1 il: Novembre 02, 2020, 19:03 »
E' sempre la stessa domanda... ti interessa imparare o ti interessa ottenere un risultato specifico?

Se ti interessa imparare Python, il consiglio è sempre quello di seguire un buon libro passo-passo, partendo da pagina 1. Il Lutz è sempre una buona idea.

Se ti interessa fare scraping di un sito (dopo esserti accertato che sia legale... ripeto: dopo esserti accertato che sia legale), resta con VBA, visto che quello che hai scritto funziona, o cercati un software apposito.

Offline decimox

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping
« Risposta #2 il: Novembre 02, 2020, 20:47 »
Mi interessa imparare inseguendo un risultato specifico... Sono indeciso tra VBA e python, e volevo capire quale era più performante per il caso specifico. Il programma in VBA non l'ho scritto io. 

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Web scraping
« Risposta #3 il: Novembre 02, 2020, 21:25 »
> Mi interessa imparare inseguendo un risultato specifico.

Sorry, purtroppo questo non è possibile.

>  quale era più performante per il caso specifico.

Nessuno dei due, o entrambi. Non ha senso misurare la performance di un linguaggio su casi del genere.

Offline decimox

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping
« Risposta #4 il: Novembre 02, 2020, 22:33 »
Mah, tieni presente che si tratta di imparare non per lavoro ma per hobby, se non hai un qualche obiettivo "pratico" la vedo dura ... già lo è se ce l'hai ( ovviamente si tratta sempre di partire da pagina 1 ). Ci deve essere assolutamente un qualche scopo specifico.

Deduco, quindi, che, ponendo eguale bravura nel programmatore VBA e in quello Python, un linguaggio rispetto all'altro non dà nessun vantaggio nell'estrapolare dati da un sito. Speravo in altra risposta, ma ne prendo atto...

Grazie

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Web scraping
« Risposta #5 il: Novembre 03, 2020, 12:26 »
Guarda, per esperienza ormai decennale so che non è così. "Avere un obiettivo pratico" è una zavorra, non è uno stimolo. Si impara quando la mente è sgombra da pre-occupazioni e la si lascia libera di assimilare i concetti nell'ordine giusto, lasciandosi guidare con pazienza da un (buon) percorso didattico. Se invece hai un obiettivo in mente, a ogni piccolo nuovo concetto che ti viene proposto, subito la tua mente pensa "come posso usare questo per il mio progetto?, mi serve per quello che ho in mente di fare?"... e senza accorgertene scarti tutto quello che sembra "lontano" dal tuo obiettivo (e dai troppa importanza a ciò che sembra vicino). E' inevitabile.

Se guardi i messaggi di questo forum, è pieno di persone che chiedono aiuto su cose come "scrapare il sito del fantacalcio" o progetti del genere (piuttosto complessi, quindi) e ti propongono del codice totalmente sballato ("aiuto raga non mi funzia!!!!1!!!") dove vedi che non hanno capito cose del tutto basilari... ma quando gli fai notare che prima di scrapare il sito del fantacalcio dovrebbero aver capito come funziona un ciclo "for", quelli ti rispondono arrabbiati che "io lo so benissimo come funziona il for, senti se non vuoi aiutarmi non stare qui a farmi la lezione!!!!1!!!!".
Ma il problema è che *davvero* loro pensano di aver capito tutto quello che c'è da capire sui cicli "for"... è solo che hanno studiato il "for" con il fantacalcio saldamente conficcato nella testa. Perché hanno un obiettivo pratico, loro.
Tutto questo è talmente comune da essere una vera e propria FAQ della didattica di Python... così per togliermi il pensiero ho scritto un articolo per spiegare questi concetti, e adesso rimando sempre a quello, per fare prima: https://pythoninwindows.blogspot.com/2020/03/come-imparare-python-senza-studiare.html
E' lungo (orrore!) ma spiega tutto questo e altro ancora.

Offline Script

  • python unicellularis
  • *
  • Post: 1
  • Punti reputazione: 0
    • Mostra profilo
Re:Web scraping
« Risposta #6 il: Novembre 13, 2020, 16:18 »
Ciao a tutti,

mi accodo anch'io a questo thread essendo interessato allo stesso argomento.

Premetto che sono un neofita di Python: lo sto studiando da un paio di mesi abbondanti tra corsi online anche a pagamento e libri di settore e sono interessato ad apprenderlo per impiegarlo profittevolmente nel mio lavoro, quindi specializzandomi nel Data Scientist e nel Machine Learning (anche se, per il momento, questi temi mi sembrano ancora lontani anni luce da dove sono. Ma pian piano ci arriveremo...  :P ).

Detto ciò, sto da qualche tempo lavorando su uno script per fare web scraping con l'impiego combinato di requests e di BeautifolSoup ma nonostante gli sforzi, non riesco a trovare soluzione al mio attuale intoppo. Espongo di seguito il problema.

Il sito "fonte" da cui attingere i dati che  mi interessano ha, ad un certo punto, una struttura di questo tipo (opportunamente alterata in alcune parole per non ricondurre al sito reale) :

<div class="im-mainFeatures">

<ul class="nd-list nd-list--pipe"><li class="nd-list__item im-mainFeatures__price"><div class="im-mainFeatures__title"> Variabile_1</div></li><li class="nd-list__item"><span class="im-mainFeatures__value" >3               

<svg viewBox="0 0 16 16" width="16" height="16" class="nd-icon im-mainFeatures__symbol " ><use class="nd-icon__use" xlink:href="/assets-au/sito-it/images/common/sprite-main-features___80243d0e.svg#planimetry"></use></svg></span><span class="im-mainFeatures__label">locali</span></li><li class="nd-list__item"><span class="im-mainFeatures__value" ><span>&nbsp;</span>100<span class="im-mainFeatures__symbol">m²</span></span><span class="im-mainFeatures__label">Variabile_2</span></li><li class="nd-list__item"><span class="im-mainFeatures__value" >2

<svg viewBox="0 0 16 16" width="16" height="16" class="nd-icon im-mainFeatures__symbol " ><use class="nd-icon__use" xlink:href="/assets-au/sito-it/images/common/sprite-main-features___80243d0e.svg#bathroom"></use></svg></span><span class="im-mainFeatures__label">Viariabile_3</span></li><li class="nd-list__item"><span class="im-mainFeatures__value" data-text="3">3

<svg viewBox="0 0 16 16" width="16" height="16" class="nd-icon im-mainFeatures__symbol " ><use class="nd-icon__use" xlink:href="/assets-au/sito-it/images/common/sprite-main-features___80243d0e.svg#stairs"></use></svg></span><span class="im-mainFeatures__label">Variabile_4</span></li></ul></div>


A me interessa estrapolare solo il dato evidenziato in rosso, solamente quel 2 (si, beh, da questo stralcio di codice, non in generale da tutto il sito :D ). Il problema è che il relativo percorso nei nodi è in comune con altri tag ed il "parametro" (non so se è il termine corretto) im-mainFeatures__value si ripete più volte, impedendomi di raggiungere quello specifico valore.

Il mio script è questo:

X = contenuto.find('span', attrs = {'class':'im-mainFeatures__value'})
Y = X.text
Y = Y.replace(" ","").replace("\n","")
print (Y)


Con questa impostazione, il programma mi manda in output (print) il valore 3, situato alla stringa precedente rispetto a quello di mio interesse, ipotizzo per via di una mera sequenzialità di ricerca che fa fermare il programma al primo risultato. E qui arriviamo al dunque: come faccio ad indirizzare l'estrazione verso il dato di mio interesse e non al primo che incontra?

Spero di essere stato abbastanza chiaro da farmi almeno comprendere :D

Grazie in anticipo per l'aiuto.

P.S.:
Il Lutz è sempre una buona idea.
Ti riferisci a "Imparare Python" di Mark Lutz, quello con il titolo blu e il topo in copertina? Se non sbaglio, l'edizione italiana è ferma alla IV datata 2011, ormai ben 9 anni orsono. Dici che vale ancora la pena o ormai è un pò troppo vecchiotta?
« Ultima modifica: Novembre 13, 2020, 16:40 da Script »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.144
  • Punti reputazione: 9
    • Mostra profilo
Re:Web scraping
« Risposta #7 il: Novembre 16, 2020, 21:53 »
prima di tutto, se hai un problema diverso dovresti aprire un thread diverso.

per il lutz, va benissimo la versione che c'è... non è che python 3 sia cambiato poi molto nel frattempo...

per il tuo problema... non so che dire... è come se tu chiedessi: ho una lista di voci "mela mela mela mela mela mela mela" e vorrei selezionare proprio quel "mela" che piace a me... come posso fare? Ehm... non lo so?...
Se c'è qualcosa (un attributo, qualcosa...) che differenzia il nodo che vuoi dai suoi simili, allora cerca quel qualcosa con beautifulsoup... viceversa, se tutti i nodi sono uguali, ma tu sai, per esempio, che a te serve il quarto nell'ordine, allora seleziona tutti i nodi e iteraci sopra fino ad arrivare al quarto. Ma altrimenti... non è facile immaginare che cosa contraddistingue il nodo che ti interessa da tutti gli altri.