我想做的是访问本地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/