2013-05-12 11 views
13

Ho notato che Google ha rimosso l'API Finanza per Google App Engine. Tutto ciò che voglio è un elenco di ticker azionari che hanno nel proprio portfolio di Google Finance. C'è un modo per estrarre ancora questi dati dal portafoglio dell'utente finale, dato che l'API è stata rimossa? Sto cercando di recuperarlo manualmente dato che conosco il login e la password (ad esempio, è il mio).come accedere al portafoglio di Google Finance dell'utente?

C'è un modo per recuperarlo manualmente tramite arricciatura, accedendo ai servizi di Google? Sembra che dovrebbe essere possibile accedere e andare alla mia pagina portfolio, recuperando la fonte.

Ho provato il seguente codice:

#!/bin/bash 

function ClientLogin() { 
    read -p 'Email> ' email 
    read -p 'Password> ' -s password 
    local service=$1 
    curl -s -d Email=$email -d Passwd=$password -d service=$service https://www.google.com/accounts/ClientLogin | tr ' ' \n | grep Auth= | sed -e 's/Auth=//' 
} 

function GetFinance() { 
    curl -L -s -H "Authorization: GoogleLogin auth=$(ClientLogin finance)" "http://www.google.com/finance/portfolio?action=view&pid=1" &> output.html 
} 

GetFinance 

Tuttavia, questo codice recupera solo una pagina che mi dice di login La soluzione non ha bisogno di usare curl, ma deve essere un recupero automatico utilizzando. qualche linguaggio di scripting.


Grazie a x4avier, ho imparato a conoscere casperjs ed era in grado di scrivere uno script veloce per caricare i servizi di Google pagina di accesso, inserire il nome utente e la password, e poi prendere il portafoglio Google Finance. Sono sicuro che ciò funzionerebbe con qualsiasi altro servizio e pagina di Google. Risparmio l'html del portfolio su portfolio.html. Spero che questo aiuti anche qualcun altro.

var fs = require('fs'); 
var failed = []; 
var links = [ 
    "https://www.google.com/finance/portfolio?action=view&pid=13" 
]; 

var casper = require('casper').create({ 
    verbose: true, 
    logLevel: 'debug', 
    pageSettings: { 
     loadImages: false,   // The WebPage instance used by Casper will 
     loadPlugins: false,   // use these settings 
     userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537 
    } 
}); 

// print out all the messages in the headless browser context 
casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}); 

// print out all the messages in the headless browser context 
casper.on("page.error", function(msg, trace) { 
    this.echo("Page Error: " + msg, "ERROR"); 
}); 

var url = 'https://accounts.google.com/ServiceLogin?service=finance'; 

casper.start(url, function() { 
    // search for 'casperjs' from google form 
    console.log("page loaded"); 
    this.test.assertExists('form#gaia_loginform', 'form is found'); 
    this.fill('form#gaia_loginform', { 
     Email: '[email protected]', 
     Passwd: 'yourpass' 
    }, true); 
}); 

casper.each(links, function(casper, link) { 
    this.then(function() { 
     this.test.comment("Loading " + link); 
     start = new Date(); 
     this.open(link); 
    }); 
    this.then(function() { 
     var message = this.requestUrl + " loaded"; 
     if (failed.indexOf(this.requestUrl) === -1) { 
      this.test.pass(message); 
      fs.write('portfolio.html',this.getPageContent(),'w'); 
     } 
    }); 
}); 

casper.run(); 
+0

Vedere http://stackoverflow.com/questions/10040954/alternative-to-google-finance-api –

+0

Yahoo finance API non consente inoltre l'accesso al portafoglio dell'utente – gnychis

+0

È necessario implementare un client che memorizza i cookie, viene eseguito javascript e gestisce i reindirizzamenti se desideri accedere a un account Google. Perché non esportare i simboli ticker manualmente e quindi raschiare l'API pubblica per ottenere preventivi individuali. L'API pubblica funziona ancora e probabilmente funzionerà per almeno altri 3 anni in base alle norme di Google. https://www.google.com/finance/info?q=NASDAQ:AAPL –

risposta

5

Si consiglia di utilizzare un browser headless come casper.js.

Con esso è possibile accedere a google, andare su google finance e ottenere l'html di una pagina o di un particolare selettore di CSS.

per accedere si vuole utilizzare la funzione fill(), funziona così:

casper.start('http://admin.domain.tld/login/', function() { 
    this.fill('form[id="login-form"]', { 
     'username': 'chuck', 
     'password': 'n0rr1s' 
    }, true); 
}); 

casper.run(); 

Quindi è possibile analizzare la pagina e il contenuto specifico con getHTML(), il lavoro come di seguito:

casper.then(function() { 
    this.echo(this.getHTML('h1#foobar')); // => 'The text included in the <h1 id=foobar>' 
}); 

CasperJs funziona con i cookie ed esplora più di una pagina, dovrebbe adattarsi alle tue esigenze.

Spero che aiuti :)

1

Quali informazioni si desidera recuperare esattamente?

E 'abbastanza facile da fare che usare python urllib e BeautifulSoup http://docs.python.org/2/library/urllib2.html http://www.crummy.com/software/BeautifulSoup/bs4/doc/

ho fatto io per inviare e ricevere messaggi su diversi siti forum. L'unica cosa che non è bella è che devi hardcode l'id di alcuni elementi che vuoi recuperare.

Ecco un esempio di quello che ho fatto per la parte di accesso

#!/usr/bin/python 

import urllib 
import urllib2 
import cookielib 
import BeautifulSoup 

url = "https://accounts.google.com/ServiceLogin?hl=en"; 
values = {'Email': '[email protected]', 'Passwd' : '', 'signIn' : 'Sign in', 'PersistentCookie' : 'yes'} # The form data 'name' : 'value' 

cookie = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) 
data = urllib.urlencode(values) 
response = self.opener.open(url, data) 
print response 

ho riempito alcune delle informazioni necessarie per l'accesso di Google. Ma quando ho controllato la richiesta POST c'erano altri valori che potreste aver bisogno di aggiungere anche nei valori dettati.

Ecco la richiesta POST ho catturato:

dsh:5606788993588 
hl:en 
checkedDomains:youtube 
checkConnection:youtube:47:1,youtube:46:1 
pstMsg:1 
GALX:YU6dyLz2tHE 
pstMsg:0 
dnConn: 
checkConnection: 
checkedDomains:youtube 
timeStmp: 
secTok: 
_utf8:☃ 
bgresponse:!A0LP9ks4H06eS0R0GKgonCCotgIAAAAiUgAAAAkqAOjHBiH2qA-EIczqcDooax5q8bxis... 
Email:****@gmail.com 
Passwd:mypassword 
signIn:Sign in 
PersistentCookie:yes 
rmShown:1 

Credo che si dovrà analizzare la pagina di login utilizzando BeautifulSoup per ottenere questi valori prima di poter effettivamente inviare il modulo. Mi chiedo se l'esempio casper sopra riportato lo faccia automaticamente, se lo si preferisce usarlo e quindi analizzare la pagina del portfolio usando Beatifulsoup di ciò che si desidera.