我想做的是访问本地netgear路由器上的流量表数据。登录它并单击链接非常容易,但是理想情况下,我希望有一个小应用程序坐在系统托盘(Windows)中,可以在需要查看网络流量时进行检查。

我正在使用python尝试访问路由器的网页,但遇到了一些麻烦。我最初尝试修改一个脚本,该脚本将重新启动路由器(在此处https://github.com/ncw/router-rebooter/blob/master/router_rebooter.py找到),但是它只提供原始html,在运行onload javascript函数之后,我需要它。在许多有关网页抓取的文章中都描述了这种类型的东西,建议人们使用硒。

我尝试了硒,遇到了两个问题。首先,它实际上会打开浏览器窗口,这不是我想要的。其次,它跳过了我通过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:[email protected]/start.htm'

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


这可以修复正在加载的Web浏览器,但是认证失败。有什么建议么?

最佳答案

我的Netgear路由器(WNDR3700)的Web界面也充满了javascript。您的情况可能有所不同,但我发现我的脚本无需JavaScript即可获取所需的所有信息。

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

http://my_router_address/traffic.htm


找到此URL后,无需浏览网页,也不需要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)读取。

关于python - 如何访问Netgear路由器Web界面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20383924/

10-12 21:34