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計劃任務定時運行,勉強湊活用下往後再學習補充

相關文章
相關標籤/搜索