python screenscraping opsview避免在一个过时的无头脚本上使用javascript

2024-04-20 10:54:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想访问python中的url,它基本上返回csv数据。问题是它位于需要javascript的登录页面后面(它在登录页面上没有任何有用的功能,只是为了确保后续页面中有javascript)。我已经在我的dev机器(fedora桌面)上用ghost成功地做到了这一点。现在的问题是,生产机器是无头centos 6.2机器(旧软件)。因此,我的追求得到鬼运行那里让我进入依赖和backporting地狱(我放弃时,试图backportqt…)。你知道吗

我试着使用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>

欢迎任何提示。你知道吗


Tags: textdivform机器vartypescriptlogin
1条回答
网友
1楼 · 发布于 2024-04-20 10:54:27

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

相关问题 更多 >