Yahoo Quotazioni storiche: non permette più lo scarico automatico dei dati !

icecube

Excel helper
Registrato
21/7/05
Messaggi
4.165
Punti reazioni
904
Yahoo Quotazioni storiche: il sito non permette più lo scarico automatico dei dati !


Come avrete notato, da alcuni giorni (maggio 2017) non funziona più lo scarico delle quotazioni storiche dal sito di Yahoo, che da almeno 10 anni era libero e funzionante, e sfruttato da molti utenti nel mondo, e da programmi e/o fogli Excel anche commerciali (magari non professionali, in quanto questi si appoggiano a database a pagamento).


Se n'è parlato in vari thread, ad es.:
http://www.finanzaonline.com/forum/...prezzi-storici-post48791440.html#post48791440
...ma siccome il problema non riguarda solo gli ETF ho preferito aprire un thread apposito nella sezione Computer, Web, ecc. che sembra più pertinente, anche per evitare di "sporcare" gli altri thread con gli off-topic, e nell'intento di raccogliere e concentrare idee, spunti e suggerimenti in corso di formazione...


Cominciamo col precisare che andando su Yahoo sulla pagina web della quotazione del titolo, Tab "dati storici", c'è sempre il pulsante "Scarica dati" che fornisce quanto promette (il "solito" file .csv).


E' "soltanto" impedito lo scarico AUTOMATICO (ovvero da programma), cosa che però mette in crisi molti utenti che lo utilizzavano all'interno dei propri fogli Excel (o altro).


I vantaggi dei dati Yahoo erano principalmente i seguenti:
- dati free, anche adjusted per dividendi/operaz. sul capitale;
- facilità di accesso (query web);
- facilità di utilizzo (sono forniti in .csv, quindi facilmente elaborabili come testo e anche direttamente importabili in Excel)

Svantaggi:
- convenzione dati "all'americana";
- a volte presenti buchi e/o fattori di rettifica non sempre esatti;


Purtroppo questa volta non si tratta solo della classica "rivisitazione" periodica del sito, con cambio di qualche dettaglio nell'URL di accesso (tipo quelli di BorsaItaliana e EuroTLX, per intenderci), ma c'è la vera e propria INTENZIONE di Yahoo di bloccare lo scarico automatizzato dei dati (con l'utilizzo di un "cookie di sessione", come vedremo in seguito), quindi si preannunciano tempi grami, se altri fornitori-dati-free seguiranno l'esempio...
 
Per spiegare la problematica facciamo intanto un passo indietro...


Da ANNI per accedere alle quotazioni storiche su Yahoo era sufficiente costruire una stringa, tipo:
Error


- dove ENI.MI era il ticker del titolo;
- a= b= c=...f= ecc. erano il mese/giorno/anno della data di inizio e data di fine (il mese andava da 0 a 11 perchè gli americani se non fanno gli originali non sono contenti!);
- g=d, dove d era l'intervallo richiesto (d=day, per dati giornalieri).


A quel punto era sufficiente accedere a quell'URL per scaricare il file .csv, e con un unico accesso web si potevano scaricare in un colpo solo e velocemente anche 30 anni di quotazioni !
Poi si doveva leggere ed elaborare il file di testo (.csv), tenendo conto delle particolarità tipo data all'americana, separatori decimali, ecc.



Con Excel era più facile ancora, perchè il .csv è un formato "nativo", e con una semplice Workbook.Open(URL) i dati si caricavano in un nuovo foglio (senza doversi preoccupare di tutte le conversioni, che faceva Excel in automatico), poi bastava Copy-are il range dei dati e incollarlo nel posto giusto nel nostro file !
 
La stringa (che sopra compare come Error) era:

Codice:
ht-tp://ichart.yahoo.com/table.csv?s=ENI.MI&a=0&b=1&c=2016&d=4&e=26&f=2017&g=d&ignore=.csv

(ho messo il trattino per non avere problemi con l'editor del FOL, che ne ha già abbastanza di suo !)
 
Come diventa ora la faccenda ?

L'URL è tipo questa:
https://query1.finance.yahoo.com/v7...&interval=1d&events=history&crumb=jL5lEa4DGxl
Codice:
https://query1.finance.yahoo.com/v7/finance/download/ENI.MI?period1=1493205443&period2=1495797443&interval=1d&events=history&crumb=jL5lEa4DGxl
dove le date iniziali e finali desiderate (period1 e 2) seguono ora la convenzione Unix (in pratica sono i secondi decorsi dalle 00:00 del 01/01/1970, non è difficile fare in VBA le 2 funzioni di conversione), mentre l'intervallo è esplicitato in "1d".

Ma perché se "seguo" il link non mi scarica nulla ???

Il GROSSO problema infatti risiede nella parte finale "crumb=xxxxxxxxxxx" dove quella stringa incomprensibile di lettere è la briciola (crumb) del biscotto (cookie), che è valida solo per quella sessione del browser, e cambia tutte le volte.

Questo, di fatto, impedisce l'ottenimento dei dati da query web, e temo non ci sia soluzione.

Per quanto riguarda il VBA, conto ancora che sia possibile in qualche modo ricavare il cookie e aggirare la gabola, anche se per ora ho letto sui forum americani di molte presunte soluzioni, ma nessuna veramente efficace... :rolleyes:
 
Mmmm... bel link, grazie !!! :)
 

Allegati

  • Historical_Price_Extract_XLAutomation.zip
    32,9 KB · Visite: 757
io valuterei una migrazione a python e l utilizzo di selenium per creare le sessioni web. E' quello che uso da anni per i miei scrapers.
 
Allego estratto dal sito di cui sopra, corretto nella macro di conversione unix, ora funzionante, anche se non ho ancora capito quale uso ne possa derivare ai fini di uno storico dati. Confido in ICE:cool:

Sì, era già stato citato in altro thread, l'ho visto... decine e decine di righe di codice astruso e poco ottimizzato (libreria WinHTTP)... si può fare di meglio ! :cool:

Non è che il file ora sia "velocissimo", è yahoo che fornisce (da...sempre) i dati storici anche a 30 anni con UN UNICO accesso al web ! ...proprio per questo è interessante riuscire a ripristinare il download da Y.

io valuterei una migrazione a python e l utilizzo di selenium per creare le sessioni web. E' quello che uso da anni per i miei scrapers.

Ehh... Haganah, ma tu sei un programmatore, noi semplici praticoni che ci barcameniamo con Excel...
 
Il GROSSO problema infatti risiede nella parte finale "crumb=xxxxxxxxxxx" dove quella stringa incomprensibile di lettere è la briciola (crumb) del biscotto (cookie), che è valida solo per quella sessione del browser, e cambia tutte le volte.

Dài, su... alla fine il problema non era poi così insormontabile come sembrava, e il crumb non cambia nemmeno ad ogni sessione.

In pratica scarica il codice HTML che compone una pagina di quotazioni di un titolo qualunque (ho usato yahoo, tanto per...:censored: ), e poi estrae il "crumb" dal magazzino (CrumbStore !?!)

Sembrerebbe funzionare, quando posso allego un file demo completo...

Purtroppo NO, il crumb da solo non basta........:(
 
Ultima modifica:
Allego il demo.

Per un po' funziona e scarica i dati...

Dopo un (bel) po' però va' in errore... :censored: :angry: ...il problema è che richiedendo un nuovo crumb in realtà la funzione restituisce ancora lo stesso....:mmmm: ..... che non funzia più ! :censored:



(Edit: allegato non funzionante, rimosso.)
 
Ultima modifica:
adoro la ricorsione :D
 
Spiegati meglio... ;) (ti assicuro che in quel codice non c'è ALCUN problema di ricorsione !)

vero, mi son sbagliato, ho letto frettolosamente il codice e ho letto l ultima riga come getCrumb(...) ...avendo utilizzato pochissimo VBA, non sono abituato a non chiamare esplicitamente il return in una funzione
 
...infatti solo sostituendo il crumb non funziona, in quanto yahoo pretende che nella richiesta ci sia anche il cookie di sessione
(questo ovviamente se non interagisci direttamente col browser ma intendi scaricare i dati in modo automatico, in quanto il browser automaticamente salva i cookies)

Eh... ora ho capito...:(

Quindi mi sa che, anche superando il problemi dell'accoppiata crumb+cookie, non sarà possibile aprire direttamente i dati in Excel con Workbooks.Open... :'(

Eccheppalle... vado a farmi una nuotata !!! OK!
 
Dopo un bel pomeriggio in spiaggia, il cervello (e non solo) è più fresco...

Ha ragione homohominilupus, il crumb puoi ottenerlo, ma da solo non basta...

Il codice precedente, inizialmente funzionante, aveva dei problemi:
- non forzava lo scarico "fresco", e la routine restituiva i "soliti" dati, prelevati dalla cache;
- anche forzandolo, si ottiene il nuovo crumb, ma si deve inviare nella richiesta anche il cookie, quindi non si possono scaricare i dati con Workbooks.Open(URL) perchè non si possono passare i dati richiesti.
- infine, la mia libreria preferita pare non supportare i cookies, quindi mi toccherà usare la WinHttp.

Chi la dura la vince... :angry:... mi sto divertendo però... OK!
 
Allego il demo. Per un po' funziona e scarica i dati...
Dopo un (bel) po' però va' in errore... :censored: :angry:

Il codice precedente, inizialmente funzionante, aveva dei problemi:
- non forzava lo scarico "fresco", e la routine restituiva i "soliti" dati, prelevati dalla cache

Non capisco Ice... la demo riesce a scaricare i dati ogni volta che si apre il file?

Non basterebbe mettere una funzione diversa per ogni titolo da scaricare ed eseguirle tutte?
 
Non capisco Ice... la demo riesce a scaricare i dati ogni volta che si apre il file?

Non basterebbe mettere una funzione diversa per ogni titolo da scaricare ed eseguirle tutte?

No, i programmatori di Yahoo sono contorti...

Quando il "crumb" scade, se ne deve "richiedere" un altro, congiuntamente al cookie.
E lo strano è che, a volte, neppure questo nuovo funziona, e bisogna provare a richiederne un altro ancora...
Nel file allegato da gianca53 se ne richiedono fino a 5, prima di rinunciare definitivamente.
 
Comunque dovrei aver risolto (almeno fino ai prossimi problemi), riscrivendo le chiamate http con la WinHttp, e prevedendo fino a 6 tentativi per i newCrumb.

Il file allegato permette di scrivere in col.A la lista dei ticker (al primo ticker vuoto si ferma), di scegliere le date di inizio/fine, e scarica i dati giornalieri.

Anziché mostrare i dati direttamente sul foglio (per un singolo titolo può andare bene, se ce ne sono parecchi è scomodo), ho scelto di salvare i dati di ciascun titolo in un file .csv, con lo stesso nome del ticker, generato nella stessa cartella del file principale.

Ovviamente questi dettagli sono facilmente modificabili da chi mastica VBA, come pure (se non serve) la conversione dei separatori di campo e decimali secondo la convenzione all'italiana.

Ciao ! OK! :cool:
 

Allegati

  • Download Yahoo.xls
    42,5 KB · Visite: 2.030
Indietro