2013-05-12 9 views
13

Ich habe festgestellt, dass Google die Finance API für Google App Engine entfernt hat. Ich möchte nur eine Liste der Börsenticker, die sie in ihrem Google Finance-Portfolio haben. Gibt es eine Möglichkeit, diese Daten aus dem Portfolio des Endbenutzers zu ziehen, wenn die API entfernt wurde? Ich versuche, es manuell abzurufen, da ich das Login und das Passwort kenne (z. B. es ist mein eigenes).Möglichkeit, auf das Google Finance-Portfolio von Nutzern zuzugreifen?

Gibt es eine Möglichkeit, sie manuell durch curl abzurufen, indem Sie sich bei den Google-Diensten anmelden? Es scheint so, als ob es möglich sein sollte, sich anzumelden und zu meiner Portfolio-Seite zu gehen, um die Quelle abzurufen.

ich den folgenden Code versucht:

#!/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 

jedoch ruft dieser Code nur eine Seite, die mir sagt, eingeloggt Die Lösung muss nicht curl verwenden, aber es muss ein automatisierter Abruf werden. einige Skriptsprache.


Dank x4avier lernte ich casperjs und konnte eine schnelle Skript schreiben, die Google-Services Seite anmelden, geben Sie den Benutzernamen und das Passwort zu laden und dann die Google Finance-Portfolio zu holen. Ich bin mir sicher, dass dies mit jedem anderen Google-Dienst und jeder Seite funktionieren würde. Ich speichere den HTML-Code des Portfolios in portfolio.html. Hoffentlich hilft das auch jemand anderem.

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

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

+0

Yahoo Finance API erlaubt auch keinen Zugriff auf das Benutzerportfolio – gnychis

+0

Sie müssen einen Client implementieren, der Cookies speichert, läuft JavaScript und behandelt Weiterleitungen, wenn Sie sich bei einem Google-Konto anmelden möchten. Warum nicht einfach die Tickersymbole manuell exportieren und dann die öffentliche API abkratzen, um individuelle Angebote zu erhalten. Das öffentliche API funktioniert immer noch und wird nach den Richtlinien von Google wahrscheinlich noch mindestens 3 Jahre lang funktionieren. https://www.google.com/finance/info?q=NASDAQ:AAPL –

Antwort

5

Sie sollten einen kopflosen Browser wie casper.js verwenden.

Mit ihm können Sie sich in Google anmelden, google Finanzen und erhalten Sie die HTML einer Seite oder eines bestimmten CSS-Selektors.

anzumelden Sie werden die fill() Funktion zu verwenden, funktioniert es wie folgt aus:

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

casper.run(); 

Dann können Sie die Seite und den spezifischen Inhalt mit getHTML() analysieren, arbeiten wie folgt:

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

CasperJs arbeitet mit Cookies und erkunden mehr als eine Seite, sollte es Ihren Bedürfnissen entsprechen.

Hope it :)

1

Welche Informationen helfen Sie Ihnen genau abrufen möchten?

Es ist ziemlich einfach, dass urllib mit Python zu tun und http://docs.python.org/2/library/urllib2.html http://www.crummy.com/software/BeautifulSoup/bs4/doc/

BeautifulSoup ich es getan habe ich Nachrichten auf verschiedenen Foren Website zu veröffentlichen und abrufen. Das einzige, was nicht cool ist, ist, dass Sie die ID einiger Elemente, die Sie abrufen möchten, fest codieren müssen.

Hier ist ein Beispiel dessen, was ich für den Login-Teil hat

#!/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 

ich ein Teil der erforderlichen Informationen für den Google-Login gefüllt. Aber als ich die POST-Anfrage überprüfte, gab es einige andere Werte, die Sie möglicherweise auch in den Werten dict hinzufügen müssen.

Hier ist die POST-Anfrage ich gefangen:

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 

Ich denke, Sie werden die Login-Seite mit BeautifulSoup analysieren müssen, um diese Werte zu erhalten, bevor Sie das Formular tatsächlich senden kann. Ich frage mich, ob das obige Casper-Beispiel das automatisch ausführt, wenn Sie es lieber verwenden und dann die Portfolio-Seite mit Beatifulsoup analysieren, was immer Sie wollen.

Verwandte Themen