您好,登錄后才能下訂單哦!
Python中怎么分析網站日志數據,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import apache_log_parser # 首先通過 pip install apache_log_parser 安裝庫 %matplotlib inline
fformat = '%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %T' # 創建解析器 p = apache_log_parser.make_parser(fformat)
sample_string = 'koldunov.net 85.26.235.202 - - [16/Mar/2013:00:19:43 +0400] "GET /?p=364 HTTP/1.0" 200 65237 "http://koldunov.net/?p=364" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11" 0' data = p(sample_string) #解析后的數據為字典結構 data
datas = open(r'H:\python數據分析\數據\apache_access_log').readlines() #逐行讀取log數據 log_list = [] # 逐行讀取并解析為字典 for line in datas: data = p(line) data['time_received'] = data['time_received'][1:12]+' '+data['time_received'][13:21]+' '+data['time_received'][22:27] #時間數據整理 log_list.append(data) #傳入列表
log = pd.DataFrame(log_list) #構造DataFrame log = log[['status','response_bytes_clf','remote_host','request_first_line','time_received']] #提取感興趣的字段 log.head() #status 狀態碼 response_bytes_clf 返回的字節數(流量)remote_host 遠端主機IP地址 request_first_line 請求內容t ime_received 時間數據
log['time_received'] = pd.to_datetime(log['time_received']) #把time_received字段轉換為時間數據類型,并設置為索引 log = log.set_index('time_received') log.head()
log['status'] = log['status'].astype('int') # 轉換為int類型
log['response_bytes_clf'].unique() array(['26126', '10532', '1853', ..., '66386', '47413', '48212'], dtype=object)
log[log['response_bytes_clf'] == '-'].head() #對response_bytes_clf字段進行轉換時報錯,查找原因發現其中含有“-”
def dash3nan(x): # 定義轉換函數,當為“-”字符時,將其替換為空格,并將字節數據轉化為M數據 if x == '-': x = np.nan else: x = float(x)/1048576 return x
log['response_bytes_clf'] = log['response_bytes_clf'].map(dash3nan) log.head()
log.dtypes
流量起伏不大,但有一個極大的峰值超過了20MB。
log[log['response_bytes_clf']>20] #查看流量峰值
t_log = log['response_bytes_clf'].resample('30t').count() t_log.plot()
對時間重采樣(30min),并計數 ,可看出每個時間段訪問的次數,早上8點訪問次數最多,其余時間處于上下波動中。
h_log = log['response_bytes_clf'].resample('H').count() h_log.plot()
當繼續轉換頻率到低頻率時,上下波動不明顯。
d_log = pd.DataFrame({'count':log['response_bytes_clf'].resample('10t').count(),'sum':log['response_bytes_clf'].resample('10t').sum()}) d_log.head()
構造訪問次數和訪問流量的 DataFrame。
plt.figure(figsize=(10,6)) #設置圖表大小 ax1 = plt.subplot(111) #一個subplot ax2 = ax1.twinx() #公用x軸 ax1.plot(d_log['count'],color='r',label='count') ax1.legend(loc=2) ax2.plot(d_log['sum'],label='sum') ax2.legend(loc=0)
繪制折線圖,有圖可看出,訪問次數與訪問流量存在相關性。
ip_count = log['remote_host'].value_counts()[0:10] #對remote_host計數,并取前10位 ip_count
ip_count.plot(kind='barh') #IP前十位柱狀圖
import pygeoip # pip install pygeoip 安裝庫 # 同時需要在網站上(http://dev.maxmind.com/geoip/legacy/geolite)下載DAT文件才能解析IP地址 gi = pygeoip.GeoIP(r'H:\python數據分析\數據\GeoLiteCity.dat', pygeoip.MEMORY_CACHE) info = gi.record_by_addr('64.233.161.99') info #解析IP地址
ips = log.groupby('remote_host')['status'].agg(['count']) # 對IP地址分組統計 ips.head()
ips.drop('91.224.246.183',inplace=True) ips['country'] = [gi.record_by_addr(i)['country_code3'] for i in ips.index] # 將IP解析的國家和經緯度寫入DataFrame ips['latitude'] = [gi.record_by_addr(i)['latitude'] for i in ips.index] ips['longitude'] = [gi.record_by_addr(i)['longitude'] for i in ips.index] ips.head()
country = ips.groupby('country')['count'].sum() #對country字段分組統計 country = country.sort_values(ascending=False)[0:10] # 篩選出前10位的國家 country
country.plot(kind='bar')
俄羅斯的訪問量最多,可推斷該網站來源于俄羅斯。
from mpl_toolkits.basemap import Basemap plt.style.use('ggplot') plt.figure(figsize=(10,6)) map1 = Basemap(projection='robin', lat_0=39.9, lon_0=116.3, resolution = 'l', area_thresh = 1000.0) map1.drawcoastlines() map1.drawcountries() map1.drawmapboundary() map1.drawmeridians(np.arange(0, 360, 30)) map1.drawparallels(np.arange(-90, 90, 30)) size = 0.03 for lon, lat, mag in zip(list(ips['longitude']), list(ips['latitude']), list(ips['count'])): x,y = map1(lon, lat) msize = mag * size map1.plot(x, y, 'ro', markersize=msize)
關于Python中怎么分析網站日志數據問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。