我注意到Google删除了Google App Engine的Finance API。我想要的只是他们在Google财经投资组合中的股票代码清单。有没有办法从最终用户的产品组合中提取这些数据,因为已经删除了API?我正在尝试手动检索它,因为我知道登录名和密码(例如,它是我自己的)。
有没有办法通过curl手动检索它,登录到Google服务?看起来应该可以登录并转到我的投资组合页面,检索来源。
我尝试过以下代码:
#!/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
但是,此代码仅检索告诉我登录的页面。解决方案不需要使用curl,但它必须是使用某种脚本语言的自动检索。
感谢x4avier,我了解了casperjs,并且能够编写一个快速脚本来加载Google服务登录页面,输入用户名和密码,然后获取Google财经投资组合。我相信这适用于任何其他谷歌服务和页面。我将投资组合的html保存到portfolio.html。希望这也有助于其他人。
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: 'youraccount@gmail.com',
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 :(得分:6)
您应该考虑使用像casper.js这样的无头浏览器。
有了它,你可以登录谷歌,去谷歌财经,获取页面或特定的CSS选择器的HTML。
要登录,您将使用fill()功能,它的工作方式如下:
casper.start('http://admin.domain.tld/login/', function() {
this.fill('form[id="login-form"]', {
'username': 'chuck',
'password': 'n0rr1s'
}, true);
});
casper.run();
然后,您可以使用getHTML()解析页面和特定内容,工作方式如下:
casper.then(function() {
this.echo(this.getHTML('h1#foobar')); // => 'The text included in the <h1 id=foobar>'
});
CasperJs使用cookie并浏览多个页面,它应该符合您的需求。
希望有所帮助:)
答案 1 :(得分:1)
您想要准确检索哪些信息?
使用python urllib和beautifulsoup很容易做到这一点 http://docs.python.org/2/library/urllib2.html http://www.crummy.com/software/BeautifulSoup/bs4/doc/
我自己完成了在不同论坛网站上发布和检索邮件。唯一不酷的是你必须硬编码你想要检索的一些元素的id。
以下是我为登录部分所做的示例
#!/usr/bin/python
import urllib
import urllib2
import cookielib
import BeautifulSoup
url = "https://accounts.google.com/ServiceLogin?hl=en";
values = {'Email': 'me@mymail.fr', '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
我填写了谷歌登录所需的一些信息。但是当我检查POST请求时,您可能还需要在值dict中添加一些其他值。
这是我捕获的POST请求:
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
我猜你必须使用Beautifulsoup解析登录页面,才能在实际发送表单之前获取这些值。我想知道上面给出的casper示例是否会自动执行,如果是,您宁可使用它,然后使用任何您想要的Beatifulsoup解析投资组合页面。