python3.6爬蟲新手實(shí)例(1)爬路由器流量寫入txt

環(huán)境交代:Win+Python3.6
本人剛學(xué)python沒多久,和各位大神相比,會(huì)寫的更簡單甚至繁瑣一些,當(dāng)時(shí)也會(huì)比較適合同為新手的各位。

首先我們對(duì)自己的需求要進(jìn)行分析,新手嘛,先把復(fù)雜的東西簡單化,模塊化,整理出思路,再一步步的去實(shí)現(xiàn),最后整合。

  • 獲得數(shù)據(jù)
    • 網(wǎng)頁編碼,編碼沒有處理好會(huì)報(bào)錯(cuò),涉及到一些函數(shù)
    • 編碼轉(zhuǎn)換,你獲取到的如果非字符串類型,要預(yù)先進(jìn)行處理
  • 處理數(shù)據(jù)
    • 方法有很多,正則,字符串截取,等等不一一介紹,適合的才是最好的,我覺得正則是很強(qiáng)大的,但是也是相當(dāng)反人類的
  • 保存數(shù)據(jù)
    • 注意win下路徑和linux下路徑寫法不同
    • 寫入的編碼類型需要進(jìn)行處理

重點(diǎn)講一講我遇到的坑

一般來講右鍵查看頁面編碼,如圖所示,因?yàn)樵趪馐欠浅F婀值木幋a


image.png

當(dāng)時(shí)我就蒙蔽了,這是什么鬼~
這個(gè)時(shí)候我們需要用到chardet庫來判斷編碼類型,拿百度舉例,自行百度python第三方庫如何安裝,這里不做闡述

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

得到的結(jié)果如下:

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

#獲取字符串,因?yàn)槲以趪猓酚善鱨ow到爆,編碼格式也蛋疼了我很久
html = getHtml("http://192.168.0.254/pub/fbx_info.txt")
#將read()獲取的是bytes編碼轉(zhuǎn)化成str
html = html.decode("ISO-8859-1")

因?yàn)槭菤W洲網(wǎng)站,獲取的卻是一個(gè) 【ISO-8859-1】的網(wǎng)頁編碼。
由于這里我們用read()方法讀取,獲取到的是bytes類型,此時(shí)需要轉(zhuǎn)換成str類型的,才可以進(jìn)行下一步的處理,如果不處理就會(huì)有下列錯(cuò)誤
TypeError: a bytes-like object is required, not 'str'
這里可以使用decode()方法處理一下
html = html.decode("ISO-8859-1")
使用type()方法檢測(cè)下編碼
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())
#因?yàn)槭褂糜浭卤?,在記事本中換行只認(rèn)\r\n
str = time+html+"\r\n"

這里我使用的是split()方法,使用方法呢,推薦大家學(xué)會(huì)查手冊(cè),這里也不詳細(xì)再解釋了。
我通過split()方法截取到了自己需要的字符串,然后用time()函數(shù)獲取當(dāng)前本地時(shí)間,然后用+連接符把當(dāng)前本地時(shí)間和處理后的字符串連接起來,再在末尾接上換行符\r\n,因?yàn)閼械街挥糜浭卤?,換行符這里只算一個(gè)小坑

3.寫入txt

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

關(guān)于open函數(shù),每一個(gè)參數(shù),此篇博文講的非常清楚非常詳細(xì),感謝博主的整理,大家可以看看,建議收藏
http://blog.csdn.net/doiido/article/details/43675465
要強(qiáng)調(diào)的有2個(gè)參數(shù)
encoding和newline,因?yàn)橛玫谋容^少,然后很多文章并不會(huì)提到


有人可能會(huì)說,哇,真的懶
沒錯(cuò),我就是懶,而且再說了,寫了還沒人家寫的好,那我何必誤人子弟。

下面貼上全部代碼

import urllib.request
import os
from bs4 import BeautifulSoup
import time

def getHtml(url):
    html = urllib.request.urlopen(url).read()
    return html

#獲取字符串,因?yàn)槲以趪?,路由器low到爆,編碼格式也蛋疼了我很久
html = getHtml("http://192.168.0.254/pub/fbx_info.txt")
#將read()獲取的是bytes編碼轉(zhuǎn)化成str
html = html.decode("ISO-8859-1")

#再次檢測(cè)編碼
#print(type(html))

#操作字符串
html = html.split('WAN')[1].split('Ethernet')[0]
time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#因?yàn)槭褂糜浭卤?,在記事本中換行只認(rèn)\r\n
str = time+html+"\r\n"

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

本來當(dāng)初的想法是每秒獲取一次流量,寫入txt,再讀txt,通過數(shù)據(jù)來繪圖
但是有事暫時(shí)擱下了,只是win計(jì)劃任務(wù)定時(shí)運(yùn)行,勉強(qiáng)湊活用下日后再學(xué)習(xí)補(bǔ)充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容