美文网首页趣学Python
python3.6爬虫新手实例(1)爬路由器流量写入txt

python3.6爬虫新手实例(1)爬路由器流量写入txt

作者: 会讲段子的挨踢狗 | 来源:发表于2018-07-02 09:36 被阅读0次

    环境交代:Win+Python3.6
    本人刚学python没多久,和各位大神相比,会写的更简单甚至繁琐一些,当时也会比较适合同为新手的各位。

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

    • 获得数据
      • 网页编码,编码没有处理好会报错,涉及到一些函数
      • 编码转换,你获取到的如果非字符串类型,要预先进行处理
    • 处理数据
      • 方法有很多,正则,字符串截取,等等不一一介绍,适合的才是最好的,我觉得正则是很强大的,但是也是相当反人类的
    • 保存数据
      • 注意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': 'ISO-8859-1', '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函数,每一个参数,此篇博文讲的非常清楚非常详细,感谢博主的整理,大家可以看看,建议收藏
    http://blog.csdn.net/doiido/article/details/43675465
    要强调的有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计划任务定时运行,勉强凑活用下日后再学习补充

    相关文章

      网友评论

        本文标题:python3.6爬虫新手实例(1)爬路由器流量写入txt

        本文链接:https://www.haomeiwen.com/subject/uwbbixtx.html