如何访问netgear路由器Web界面

时间:2013-12-04 19:14:39

标签: python selenium web-scraping

我要做的是访问我本地netgear路由器上的流量计数据。登录它并轻松点击链接很容易,但理想情况下我想要一个位于系统托盘(窗口)中的小应用程序,每当我想查看网络流量时,我都可以查看。

我正在使用python尝试访问路由器的网页,但我遇到了一些障碍。我最初尝试修改了一个重启路由器的脚本(在这里找到https://github.com/ncw/router-rebooter/blob/master/router_rebooter.py),但它只是提供了原始的html,我在运行onload javascript函数后需要它。许多关于网络抓取的帖子都描述了这类事情,人们建议使用硒。

我尝试过selenium并遇到了两个问题。首先,它实际上打开了浏览器窗口,这不是我想要的。其次,它会跳过我输入的内容来传递HTTP身份验证,然后弹出登录窗口。这是代码:

from selenium import webdriver

baseAddress = '192.168.1.1'
baseURL = 'http://%(user)s:%(pwd)s@%(host)s/traffic_meter.htm'

username = 'admin'
pwd = 'thisisnotmyrealpassword'

url = baseURL % {
  'user': username,
  'pwd': pwd,
  'host': baseAddress
  }

profile = webdriver.FirefoxProfile()
profile.set_preference('network.http.phishy-userpass-length', 255)
driver = webdriver.Firefox(firefox_profile=profile)
driver.get(url)

所以,我的问题是,在没有启动可见的Web浏览器窗口的情况下,实现我想要的最佳方法是什么?

更新 好的,我尝试了sircapsalot的建议并将脚本修改为:

from selenium import webdriver
from contextlib import closing

url = 'http://admin:notmyrealpassword@192.168.1.1/start.htm'

with closing(webdriver.Remote(desired_capabilities = webdriver.DesiredCapabilities.HTMLUNIT)) as driver:
  driver.get(url)
  print(driver.page_source)

这会修复正在加载的Web浏览器,但验证失败。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我的Netgear路由器(WNDR3700)的Web界面也充满了javascript。您可能会有所不同,但我发现我的脚本可以在没有javascript的情况下获得所需的所有信息。

第一步是找到正确的网址。使用FireFox,我进入了流量页面然后使用“此框架 - >仅显示此框架”来发现我的路由器上的流量页面的URL是:

http://my_router_address/traffic.htm

找到此网址后,不需要浏览网页,也不需要使用javascript。例如,我可以使用wget

捕获此页面
wget http://my_router_address/traffic.htm

在生成的traffic.htm文件上使用文本编辑器,我看到流量数据在一个冗长的块中可用:

var traffic_today_time="1486:37";
var traffic_today_up="1,959";
var traffic_today_down="1,945";
var traffic_today_total="3,904";
. . . .

因此,可以使用您选择的脚本语言轻松捕获和解析traffic.htm文件。没有javascript需要执行。

更新:我有一个~/.netrc文件,其中包含一行:

machine my_router_address login someloginname password somepassword

wget从路由器下载之前,它会从此文件中检索登录信息。这具有安全优势。如果运行wget http://name@password...,则可以通过进程列表(ps a)查看计算机上所有密码。使用.netrc,这种情况永远不会发生。可以在.netrc上设置限制权限,例如只能由用户(chmod 400 ~/.netrc)阅读。

答案 1 :(得分:1)

好的,我找到了解决方案,这比我想象的要容易。我确实尝试过John1024的建议,并且能够使用wget从路由器下载正确的网页。但是我不喜欢wget将结果保存到文件中的事实,然后我必须打开并解析它。

我最终回到原来的第一次尝试修改失败的reboot_router.py脚本。我的问题是我试图让它变得太复杂。这是我最终使用的最终脚本:

import urllib2

user = 'admin'
pwd = 'notmyrealpassword'
host = '192.168.1.1'
url = 'http://' + host + '/traffic_meter_2nd.htm'

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, host, user, pwd)
authhandler = urllib2.HTTPBasicAuthHandler(passman)

opener = urllib2.build_opener(authhandler)
response = opener.open(url)
stuff = response.read()
response.close()

print stuff

这会从我的路由器打印出整个流量计网页,并加载正确的值。然后我可以接受它并解析它的值。关于这一点的好处是它没有外部依赖,如selenium,wget或其他需要安装的库。清洁很好。

谢谢大家的建议。没有它们,我不会得到这个答案。