Python 3.5 实现检测路由器流量并写入 txt 的方法实例

小林子
小林子
发布时间:2026-10-13| 3人浏览过
原创

本文介绍使用 Python 3.5 检测路由器流量并保存至 txt 文件的简单方法。重点解决网页编码识别(如 ISO-8859-1)及 bytes 转 str 的问题,演示利用 chardet 库、split 截取字符串及 open 函数处理换行符的技巧,适合初学者参考。

前言

本文主要介绍如何利用 Python 3.5 检测路由器流量并将其写入 txt 文件。内容旨在为读者提供参考与学习,以下是详细步骤介绍。

运行环境:Windows 10 系统,Python 3.6。

代码实现非常简洁。

  • 未涉及模拟登录功能。
  • 未进行网页标签过滤。
  • 未使用多线程技术。
  • 文本处理仅涉及字符串截取操作。
  • 实现了本地文本写入功能。

代码之所以简单,是因为该路由器页面质量较差,无需复杂处理。不过这种写法适合初学者阅读,后续计划尝试添加更多功能。

首先分析需求,作为新手,应将复杂问题简单化、模块化,理清思路后逐步实现,最后进行整合。

1、获取数据

  • 网页编码处理不当会引发报错,需注意相关函数。
  • 编码转换:read() 方法获取的数据非字符串类型,需预先处理。

2、处理数据

  • 方法多样,如正则表达式、字符串截取等,选择适合的方法即可。虽然正则表达式功能强大,但有时较为晦涩难懂。

3、保存数据

  • 注意 Windows 与 Linux 系统下路径写法的差异。
  • 写入文件时需处理编码类型。

重点讲解遇到的常见问题。

通常右键查看页面编码,如图所示,国外网站的编码格式往往比较特殊。

当时对此感到困惑,不知如何处理。

此时需要用到 chardet 库来判断编码类型。以百度为例,可自行搜索安装 Python 第三方库的方法,此处不再赘述。

import chardet
import urllib.request
html = urllib.request.urlopen('http://www.baidu.com/').read()
print (chardet.detect(html))

得到的结果如下所示:

C:\python\python.exe D:/python/test/2.py
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

Process finished with exit code 0

1. 获取字符串

import urllib.request
import os
from bs4 import BeautifulSoup
import time
def getHtml(url):
 html = urllib.request.urlopen(url).read()
 return html
#获取字符串,因为我在国外,路由器low到爆,编码格式也蛋疼了我很久
html = getHtml("http://192.168.0.254/pub/fbx_info.txt")
#将read()获取的是bytes编码转化成str
html = html.decode("ISO-8859-1")

由于访问的是欧洲网站,获取到的网页编码为 【ISO-8859-1】。

由于使用 read() 方法读取,获取到的是 bytes 类型,此时需转换为 str 类型才能进行后续处理,否则会出现以下错误。

TypeError: a bytes-like object is required, not 'str'

这里可以使用 decode() 方法进行处理。

html = html.decode("ISO-8859-1")

使用 type() 方法检测编码类型。

print(type(html))

反馈结果如下。

<class 'str'>

2. 处理字符串

#操作字符串
html = html.split('WAN')[1].split('Ethernet')[0]
time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#因为使用记事本,在记事本中换行只认\r\n
str = time+html+"\r\n"

这里使用的是 split() 方法,建议查阅手册学习具体用法,此处不再详细解释。

通过 split() 方法截取所需字符串,然后使用 time() 函数获取当前本地时间,利用 + 连接符将时间与处理后的字符串连接,并在末尾添加换行符 \r\n。由于仅使用记事本,换行符的处理算是一个小坑。

3. 写入 txt 文件

# 保存文件为txt,win环境路径
outfile = open("C:\\Users\\sw\\Desktop\\route.txt","a+",encoding="utf-8",newline='\n')
outfile.write(str)
outfile.close()
print("文件已保存到本地")

关于 open 函数的每个参数,这篇博文讲解得非常清楚详细,感谢博主的整理,大家可以参考,建议收藏。

https://www.jb51.net/article/58002.htm

需要强调两个参数。

encoding 和 newline,因为使用较少,很多文章并未提及。

有人可能会说,这确实很懒。

没错,我就是懒,而且写得不如别人好,何必误导他人。

下面贴上全部代码。

import urllib.request
import os
from bs4 import BeautifulSoup
import time
def getHtml(url):
 html = urllib.request.urlopen(url).read()
 return html

#获取字符串,因为我在国外,路由器low到爆,编码格式也蛋疼了我很久
html = getHtml("http://192.168.0.254/pub/fbx_info.txt")
#将read()获取的是bytes编码转化成str
html = html.decode("ISO-8859-1")
#再次检测编码
#print(type(html))
#操作字符串
html = html.split('WAN')[1].split('Ethernet')[0]
time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#因为使用记事本,在记事本中换行只认\r\n
str = time+html+"\r\n"
# 保存文件为txt,win环境路径
#print(type(str))
outfile = open("C:\\Users\\sw\\Desktop\\route.txt","a+",encoding="utf-8",newline='\n')
outfile.write(str)
outfile.close()
print("文件已保存到本地")

最初的想法是每秒获取一次流量,写入 txt,再读取 txt 数据绘图。

但因有事暂时搁置,目前仅通过 Windows 计划任务定时运行,勉强凑合使用,日后再学习补充。

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或工作有一定的参考借鉴价值。如有疑问欢迎留言交流,感谢支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。