python3.5简单爬虫实例---检测路由器流量并写入txt

写在前面

本人的全部文章只适合善于使用百度的人,由于全部基础知识个个博客复制粘贴了无数遍,我这里均不会详细讲述。html

在这里我表示全部不经验证的转载都是耍流氓,把一篇篇错误的文章转载的处处都是,不知道浪费了多少人的时间精力去反复调试错误的代码,尤为是对初学者有极大的打击性。python

你们在学习python爬虫的过程当中,会发现一个问题,语法我看完了,说的也很详细,我也认真看了,爬虫仍是不会写,或者没有思路,因此个人全部文章都会从实例的角度来解析一些常见的问题和报错。linux

环境交代:win10+python3.6
代码很是简单,多线程

  • 模拟登录,没有
  • 网页标签过滤,没有
  • 多线程,也没有
  • 文本处理,只有涉及到字符串截取
  • 本地文本写入,有

这么低级的代码是由于这个路由器页面很是垃圾,用不到~~~,不过这样也适合初学者观看,固然了,后续会尝试添加更多功能python爬虫


首先咱们对本身的需求要进行分析,新手嘛,先把复杂的东西简单化,模块化,整理出思路,再一步步的去实现,最后整合。ide

  • 得到数据
    • 网页编码,编码没有处理好会报错,涉及到一些函数
    • 编码转换,read()方法获取到的非字符串类型,要预先进行处理
  • 处理数据
    • 方法有不少,正则,字符串截取,等等不一一介绍,适合的才是最好的,我以为正则是很强大的,可是也是至关反人类的
  • 保存数据
    • 注意win下路径和linux下路径写法不一样
    • 写入的编码类型须要进行处理

重点讲一讲我遇到的坑模块化

通常来说右键查看页面编码,如图所示,由于在国外是很是奇怪的编码
image.png
当时我就蒙蔽了,这是什么鬼~
这个时候咱们须要用到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()函数获取当前本地时间,而后用+链接符把当前本地时间和处理后的字符串链接起来,再在末尾接上换行符rn,由于懒到只用记事本,换行符这里只算一个小坑

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函数,每个参数,此篇博文讲的很是清楚很是详细,感谢博主的整理,你们能够看看,建议收藏
http://blog.csdn.net/doiido/a...
要强调的有2个参数
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,经过数据来绘图可是有事暂时搁下了,只是win计划任务定时运行,勉强凑活用下往后再学习补充

相关文章
相关标签/搜索