上蔡專業(yè)網(wǎng)站建設(shè)突發(fā)大事震驚全國
Python爬取網(wǎng)頁信息
- 需求: 持續(xù)爬取某嵌入式設(shè)備配置網(wǎng)頁上的狀態(tài)信息
shell腳本
- 簡單快速, 不用裝插件
- 只能爬取靜態(tài)內(nèi)容
- 用
curl
命令返回整個網(wǎng)頁的內(nèi)容 - 用
grep
命令抓取其中某些字段 - 結(jié)合正則表達(dá)式可多樣查找
- 但對于動態(tài)內(nèi)容, 比如對某嵌入式設(shè)備配置網(wǎng)頁上的一條不斷更新的信息, 可能只能爬出來占位符
XXXX
, 不滿足我的需要
#!/bin/bash
while true
do# 獲取時間戳timestamp=$(date +"%Y-%m-%d %T")# 先獲取網(wǎng)頁內(nèi)容, 再獲取內(nèi)容中帶Temperature的一行temperature_line=$(curl -s "http://lidar-internal-config.com" | grep "Temperature")# 打印出來echo "$timestamp $temperature_line" >> log.txt sleep 1
done
# wget和curl差不多效果
# wget -q -O - 192.168.4.5 | grep -o "gps lock\|gps unlock" | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}'
python腳本
-
要安裝一些東西, 有點麻煩
-
可以爬取動態(tài)內(nèi)容, 模仿網(wǎng)頁
-
Ubuntu安裝selenium
- pip安裝的可能是py2環(huán)境下的, 這時要用pip3安裝
-
再安上邊鏈接的步驟安裝geckodriver
- Ubuntu自帶火狐, 所以用geckodriver, 會先打開一個網(wǎng)頁, 然后在這個網(wǎng)頁上刷新.
- 如果用
get
打開網(wǎng)頁就讀取內(nèi)容, 可能動態(tài)內(nèi)容還沒刷出來, 有時還會抓到占位符, 加個延時就行 - phantomjs不會打開網(wǎng)頁, 但對于變化內(nèi)容還是只能爬出占位符
XXXX
, 官方好像也放棄這庫, 推薦用firefox或chrome
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import datetime
browser = webdriver.Firefox()
# browser = webdriver.PhantomJS() # 不好用
# 傳入地址, 返回要抓取的內(nèi)容
def Get_Status(address):browser.get(address)time.sleep(0.2) # 延時等待正常刷新# 定位到帶GNSS靜態(tài)字符的位置, 方便抓旁邊的動態(tài)字符elements = browser.find_elements_by_xpath("//*[text()='GNSS']")sibling_element = elements[0].find_element_by_xpath(".").# 抓取動態(tài)內(nèi)容find_element_by_xpath("./following-sibling::*").text# print(sibling_element)return sibling_elementcurrent_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
file_name = "./log/gps_monitor"+current_time+".txt" # 先定好文件名while True:current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 每條記錄打上時間戳Status = Get_Status("你要訪問的ip地址")# 寫入log文件內(nèi)with open(file_name,'a') as f:f.write("{}: GGG: {} \n".format(current_time, Status))time.sleep(10)
browser.close()