0

我想在 python 中访问一个 url,它基本上返回 csv 数据。问题是它位于需要 javascript 的登录页面后面(它在登录页面上没有做任何有用的事情,它只是为了确保后续页面有 javascript)。我已经在我的开发机器(一个 Fedora 桌面)上用 ghost 成功地做到了这一点。现在的问题是,生产机器是无头的centos 6.2机器(旧软件)。所以我让幽灵在那里运行的追求让我陷入了依赖和向后移植地狱(我在尝试向后移植 qt 时放弃了......)。

我尝试使用 mechanize,但登录页面拒绝了,因为没有启用 javascript...

所以我想知道我的选择是什么:

  • 我可以以某种方式欺骗网站,让其认为我可以使用 mechanize 来编写 javascript 吗?(因为 javascript 对我没有任何用处)
  • 是否有任何 python 屏幕抓取工具可以执行 javascript 但不需要显示并在 centos 6.2 上工作而无需大量反向移植?

这是登录页面上的javascript:

 <script type="text/javascript">
    var fname = window.self.name || '';
    var shash = window.self.location.hash || '';
    if ( fname == "foobar_frame" && shash.indexOf("login-reload") < 0 ) {
        window.parent.location.replace(window.parent.location.href +'#login-reload');
        window.parent.location.reload();
    }
  </script>
<div id='login_form_div'>
... html login form - I can handle that ...
</div>

<script type="text/javascript">
document.login_form.login_username.focus();

... more javascript embedding social media stuff - i guess unrelated

</script>

欢迎任何提示。

4

1 回答 1

0

所以我终于绕过了 javascript 的要求。我尝试访问的站点是 opsview 安装。Opsview 是 nagios 的商业版本 - 并提供了一个rest api,它允许您检索一个 one_time_token,它对登录 Web 用户界面是有效的。所以我设法在没有 javascript 的情况下进行身份验证,然后使用该令牌来查询我感兴趣的 url:

#!/usr/bin/python

import mechanize
import json

username = 'foobar'
password = 'password'

# in my application, this urls gets composed so that I can choose my parameters
url = 'http://opsview.acme.org/cgi-bin/avail.cgi?show_log_entries=&host=all&timeperiod=custom&smon=07&sday=1&syear=2014&shour=0&smin=0&ssec=0&emon=08&eday=1&eyear=2014&ehour=24&emin=0&esec=0&rpttimeperiod=24x7&assumeinitialstates=yes&assumestateretention=yes&assumestatesduringnotrunning=yes&includesoftstates=no&initialassumedhoststate=0&initialassumedservicestate=0&backtrack=4&csvoutput='
# the trick is to include the parameter "include_one_time_token=1"
login_rest_url = 'http://opsview.acme.org/rest/login?include_one_time_token=1'
browser = mechanize.Browser()
browser.set_handle_robots( False )
# generate one time token via rest api for logging into web user interface.
auth_data = {'username':username, 'password':password}
auth_data_encoded = json.dumps(auth_data)
browser.open(mechanize.Request(login_rest_url, data=auth_data_encoded, headers={"Content-type":"application/json"}))
one_time_token = json.loads(browser.response().get_data())['one_time_token']

# now authenticate to the web interface and retrieve information
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2'), ]
auth_url = 'http://opsview.acme.org/login?login_username=' + username + '&one_time_token=' + one_time_token
browser.open(auth_url)
browser.open(url)
print browser.response().get_data()
于 2014-09-19T08:13:43.537 回答