python屏幕截图opsview-避免在过时的无头服务器上使用javascript

python screenscraping opsview - avoid javascript on a dated headless server

本文关键字:服务器 javascript opsview- 屏幕截图 过时 python      更新时间:2023-09-26

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

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

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

  • 我能以某种方式欺骗网站,让它认为我可以使用mechanize编写javascript吗?(因为javascript对我没有任何用处)
  • 有没有什么python屏幕抓取工具可以做javascript,但不需要显示,并且在centos6.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>

欢迎任何提示。

所以我终于避开了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()