python屏幕截图opsview-避免在过时的无头服务器上使用javascript
python screenscraping opsview - avoid javascript on a dated headless server
我想访问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()
相关文章:
- 提示使用服务器端事件处理程序激活JavaScript
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- 如何使用Javascript将空数组发送到PHP服务器
- Javascript配置服务器URL并将其存储
- 用本地Javascript源替换服务器上的Javascript源文件
- 在Javascript服务器/客户端中共享对象定义
- 在Javascript中复制C#服务器端验证
- 如何向服务器端提交javascript变量
- 如何通过服务器上的Node从客户端JavaScript上传到谷歌云存储
- 使用c#中的邮件附件javascript在客户端机器上获取服务器端导出的crystal报告路径.下面的
- 刷新GoogleMaps tile服务器可以使用JavaScript,但不能使用GWT
- HttpClient not POST-ing-data to 后端服务器 - javascript.
- 将 JSON 数据发送到服务器 - Javascript
- 客户端-服务器javascript通信
- 如何从服务器javascript强制加载页面
- ArcGIS服务器Javascript报告
- ASP.使用HTML5 Canvas的.NET绘图应用程序.保存到服务器.JavaScript错误
- 如何制作Autobahn WAMP Python服务器&Javascript客户端协同工作
- 浏览器和服务器javascript中的十六进制字符串输出不同
- 上传图像/视频到一个单独的服务器- Javascript流星