python screenscraping opsview-避免在过时的无头服务器上使用javascript

python screenscraping opsview-避免在过时的无头服务器上使用javascript,javascript,python,opsview,Javascript,Python,Opsview,我想访问python中的url,它基本上返回csv数据。问题在于它位于需要javascript的登录页面后面(它在登录页面上没有做任何有用的事情,只是为了确保后续页面有javascript)。我已经用ghost在我的开发机器(fedora桌面)上成功地完成了这项工作。现在的问题是,生产机器是无头centos 6.2机器(旧软件)。所以我想让ghost在那里运行,这让我陷入了依赖和后端口地狱(我在尝试后端口qt时放弃了…) 我尝试使用mechanize,但登录页面拒绝了,因为没有启用javascr

我想访问python中的url,它基本上返回csv数据。问题在于它位于需要javascript的登录页面后面(它在登录页面上没有做任何有用的事情,只是为了确保后续页面有javascript)。我已经用ghost在我的开发机器(fedora桌面)上成功地完成了这项工作。现在的问题是,生产机器是无头centos 6.2机器(旧软件)。所以我想让ghost在那里运行,这让我陷入了依赖和后端口地狱(我在尝试后端口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>

var fname=window.self.name | |“”;
var shash=window.self.location.hash | |“”;
如果(fname==“foobar\u frame”&&shash.indexOf(“登录重新加载”)<0){
window.parent.location.replace(window.parent.location.href+'#login reload');
window.parent.location.reload();
}
... html登录表单-我可以处理。。。
document.login_form.login_username.focus();
... 更多的javascript嵌入社交媒体的东西-我想是无关的

欢迎提供任何提示。

因此,我最终绕过了javascript要求。我尝试访问的站点是opsview安装。Opsview是nagios的一个商业版本,它提供了一个,允许您检索一次性令牌,该令牌对登录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()

请从浏览器登录。检查post url和变量。然后在mechanize中执行相同的操作。也许我可以提供答案,如果你给出URL不确定,但似乎有一个针对centos 5.8+的二进制linux版本,也许这没有ghost.py的依赖项?这是我们本地的opsview安装@messifan您的评论使我进一步研究,我发现有一个RESTAPI用于登录、接收和验证令牌()。我会尝试并使用它——如果我的解决方案成功,我会发布它。