Python簡單爬蟲實踐案例

學習目標

  • 能夠知道Web開發流程

  • 能夠掌握FastAPI實現訪問多個指定網頁

  • 知道通過requests模塊爬取圖片

  • 知道通過requests模塊爬取GDP數據

  • 能夠用pyecharts實現餅圖

  • 能夠知道logging日志的使用

一、基于FastAPI之Web站點開發

1、基于FastAPI搭建Web服務器

# 導入FastAPI模塊
from fastapi import FastAPI
# 導入響應報文Response模塊
from fastapi import Response
# 導入服務器uvicorn模塊
import uvicorn
?
# 創建FastAPI框架對象
app = FastAPI()
?
?
# 通過@app路由裝飾器收發數據
# @app.get(參數) : 按照get方式接受請求數據
# 請求資源的 url 路徑
@app.get("/index.html")
def main():with open("source/html/index.html") as f:data = f.read()# return 返回響應數據# Response(content=data, media_type="text/html"# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="text/html")
?
?
# 運行服務器
# 參數1: 框架對象
# 參數2: IP地址
# 參數3: 端口號
uvicorn.run(app, host="127.0.0.1", port=8000)

運行結果:

2、Web服務器和瀏覽器的通訊流程

實際上Web服務器和瀏覽器的通訊流程過程并不是一次性完成的, 這里html代碼中也會有訪問服務器的代碼, 比如請求圖片資源。

那像0.jpg、1.jpg、2.jpg、3.jpg、4.jpg、5.jpg、6.jpg這些訪問來自哪里呢 ?

答:它們來自index.html

3、瀏覽器訪問Web服務器的通訊流程

瀏覽器訪問Web服務器的通訊流程

  1. 瀏覽器 (127.0.0.1/index.html) ==> 向Web服務器請求index.html

  2. Web服務器 (返回index.html) ==> 瀏覽器

  3. 瀏覽器解析index.html發現需要0.jpg ==>發送請求給 Web服務器請求0.jpg

  4. Web服務器 收到請求返回0.jpg ==> 瀏覽器 接受0.jpg

通訊過程能夠成功的前提

瀏覽器發送的0.jpg請求, Web服務器可以做出響應, 也就是代碼如下

# 當瀏覽器發出對圖片 0.jpg 的請求時, 函數返回相應資源
@app.get("/images/0.jpg")
def func_01():with open("source/images/0.jpg", "rb") as f:data = f.read()print(data)return Response(content=data, media_type="jpg")

4、加載圖片資源代碼

# 導入FastAPI模塊
from fastapi import FastAPI
# 導入響應報文Response模塊
from fastapi import Response
# 導入服務器uvicorn模塊
import uvicorn
?
# 創建FastAPI框架對象
app = FastAPI()
?
?
@app.get("/images/0.jpg")
def func_01():with open("source/images/0.jpg", "rb") as f:data = f.read()print(data)return Response(content=data, media_type="jpg")
?
?
@app.get("/images/1.jpg")
def func_02():with open("source/images/1.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")
?
?
@app.get("/images/2.jpg")
def func_03():with open("source/images/2.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")
?
?
@app.get("/images/3.jpg")
def func_04():with open("source/images/3.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")
?
?
@app.get("/images/4.jpg")
def func_05():with open("source/images/4.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")
?
?
@app.get("/images/5.jpg")
def func_06():with open("source/images/5.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")
?
?
@app.get("/images/6.jpg")
def func_07():with open("source/images/6.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")
?
?
@app.get("/gdp.html")
def func_08():with open("source/html/gdp.html") as f:data = f.read()return Response(content=data, media_type="text/source")
?
?
@app.get("/index.html")
def main():with open("source/html/index.html") as f:data = f.read()# return 返回響應數據# Response(content=data, media_type="text/source"# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="text/html")
?
?
# 運行服務器
# 參數1: 框架對象
# 參數2: IP地址
# 參數3: 端口號
uvicorn.run(app, host="127.0.0.1", port=8000)

5、小結

  • 瀏覽器訪問Web服務器的通訊流程:

    • 瀏覽器 (127.0.0.1/index.html) ==> 向Web服務器請求index.html

    • Web服務器 (返回index.html) ==> 瀏覽器

    • 瀏覽器解析index.html發現需要0.jpg ==>發送請求給 Web服務器請求0.jpg

    • Web服務器 收到請求返回0.jpg ==> 瀏覽器 接受0.jpg

二、基于Web請求的FastAPI通用配置

1、目前Web服務器存在問題

# 返回0.jpg
@app.get("/images/0.jpg")
def func_01():with open("source/images/0.jpg", "rb") as f:data = f.read()print(data)return Response(content=data, media_type="jpg")
?
# 返回1.jpg
@app.get("/images/1.jpg")
def func_02():with open("source/images/1.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")
?
# 返回2.jpg
@app.get("/images/2.jpg")
def func_03():with open("source/images/2.jpg", "rb") as f:data = f.read()return Response(content=data, media_type="jpg")

對以上代碼觀察,會發現每一張圖片0.jpg、1.jpg、2.jpg就需要一個函數對應, 如果我們需要1000張圖片那就需要1000個函數對應, 顯然這樣做代碼的重復太多了.

2、基于Web請求的FastAPI通用配置

# 當請求為 /images/0.jpg 時, path ==> 0.jpg
@app.get("/images/{path}")
# 注意這里的參數需要設置為 path
# path : str ==> 指定path為字符串類型的數據
def get_pic(path: str):# 這里open()的路徑就是 ==> f"source/images/0.jpg"with open(f"source/images/{path}", "rb") as f:data = f.read()# return 返回響應數據# Response(content=data, media_type="jpg")# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="jpg")

完整代碼:

# 導入FastAPI模塊
from fastapi import FastAPI
# 導入響應報文Response模塊
from fastapi import Response
# 導入服務器uvicorn模塊
import uvicorn
?
# 創建FastAPI框架對象
app = FastAPI()
?
?
# 當請求為 /images/0.jpg 時, path ==> 0.jpg
@app.get("/images/{path}")
# 注意這里的參數需要設置為 path
# path : str ==> 指定path為字符串類型的數據
def get_pic(path: str):# 這里open()的路徑就是 ==> f"source/images/0.jpg"with open(f"source/images/{path}", "rb") as f:data = f.read()# return 返回響應數據# Response(content=data, media_type="jpg")# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="jpg")
?
?
@app.get("/{path}")
def get_html(path: str):with open(f"source/html/{path}", 'rb') as f:data = f.read()# return 返回響應數據# Response(content=data, media_type="text/source"# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="text/html")
?
?
# 運行服務器
# 參數1: 框架對象
# 參數2: IP地址
# 參數3: 端口號
uvicorn.run(app, host="127.0.0.1", port=8000)

運行結果:

3、小結

通用配置代碼:

# 當請求為 /images/0.jpg 時, path ==> 0.jpg
@app.get("/images/{path}")
# 注意這里的參數需要設置為 path
# path : str ==> 指定path為字符串類型的數據
def get_pic(path: str):# 這里open()的路徑就是 ==> f"source/images/0.jpg"with open(f"source/images/{path}", "rb") as f:data = f.read()# return 返回響應數據# Response(content=data, media_type="jpg")# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="jpg")

三、Python爬蟲介紹

1、什么是爬蟲

網絡爬蟲:

又被稱為網頁蜘蛛,網絡機器人,是一種按照一定的規則,自動地抓取網絡信息的程序或者腳本,另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。

通俗理解:

簡單來講,爬蟲就是一個探測機器,它的基本操作就是模擬人的行為去各個網站溜達,點點按鈕,查查數據,或者把看到的信息背回來. 就像一只蟲子在一幢樓里不知疲倦地爬來爬去.

你可以簡單地想象 每個爬蟲都是你的「分身」。就像孫悟空拔了一撮汗毛,吹出一堆猴子一樣

百度:其實就是利用了這種爬蟲技術, 每天放出無數爬蟲到各個網站,把他們的信息抓回來,然后化好淡妝排著小隊等你來檢索。

有了這樣的特性, 對于一些自己公司數據量不足的小公司, 這個時候還想做數據分析就可以通過爬蟲獲取同行業的數據然后進行分析, 進而指導公司的策略指定。

2、爬蟲的基本步驟

基本步驟:

  • 起始URL地址

  • 發出請求獲取響應數據

  • 對響應數據解析

  • 數據入庫

3、安裝requests模塊

  • requests : 可以模擬瀏覽器的請求

  • 官方文檔 :Requests: 讓 HTTP 服務人類 — Requests 2.18.1 文檔

  • 安裝 :pip install requests

快速入門(requests三步走):

# 導入模塊
import requests
# 通過requests.get()發送請求
# data保存返回的響應數據(這里的響應數據不是單純的html,需要通過content獲取html代碼)
data = requests.get("http://www.baidu.com")
# 通過data.content獲取html代碼
data = data.content.decode("utf-8")

4、小結

requests三步走:

# 導入模塊
import requests
# 通過requests.get()發送請求
# data保存返回的響應數據(這里的響應數據不是單純的html,需要通過content獲取html代碼)
data = requests.get("http://www.baidu.com")
# 通過data.content獲取html代碼
data = data.content.decode("utf-8")

5、爬取照片

☆ 查看index.html

☆ 爬取照片的步驟

  1. 獲取index.html代碼

  2. 解析index.html代碼獲取圖片url

  3. 通過圖片url獲取圖片

☆ 獲取index.html代碼

# 通過爬蟲向index.html發送請求
# requests.get(網址): 向一個網址發送請求,和在瀏覽器中輸入網址是一樣的
data = requests.get("http://127.0.0.1:8000/index.html")
# content可以把requests.get()獲取的返回值中的html內容獲取到
data = data.content.decode("utf-8")

☆ 解析index.html代碼獲取圖片url

# 獲取圖片的請求url
def get_pic_url():# 通過爬蟲向index.html發送請求# requests.get(網址): 向一個網址發送請求,和在瀏覽器中輸入網址是一樣的data = requests.get("http://127.0.0.1:8000/index.html")# content可以把requests.get()獲取的返回值中的html內容獲取到data = data.content.decode("utf-8")# html每一行都有"\n", 對html進行分割獲得一個列表data = data.split("\n")# 創建一個列表存儲所有圖片的url地址(也就是圖片網址)url_list = []for url in data:# 通過正則解析出所有的圖片urlresult = re.match('.*src="(.*)" width.*', url)if result is not None:# 把解析出來的圖片url添加到url_list中url_list.append(result.group(1))
?return url_list

☆ 通過圖片url獲取圖片

# 把爬取到的圖片保存到本地
def save_pic(url_list):# 通過num給照片起名字 例如:0.jpg 1.jpg 2.jpgnum = 0for url in url_list:# 通過requests.get()獲取每一張圖片pic = requests.get(f"http://127.0.0.1:8000{url[1:]}")# 保存每一張圖片with open(f"./source/spyder/{num}.jpg", "wb") as f:f.write(pic.content)num += 1

完整代碼:

import requests
import re
?
?
# 獲取圖片的請求url
def get_pic_url():# 通過爬蟲向index.html發送請求# requests.get(網址): 向一個網址發送請求,和在瀏覽器中輸入網址是一樣的data = requests.get("http://127.0.0.1:8000/index.html")# content可以把requests.get()獲取的返回值中的html內容獲取到data = data.content.decode("utf8")# html每一行都有"\n", 對html進行分割獲得一個列表data = data.split("\n")# 創建一個列表存儲所有圖片的url地址(也就是圖片網址)url_list = []for url in data:# 通過正則解析出所有的圖片urlresult = re.match('.*src="(.*)" width.*', url)if result is not None:# 把解析出來的圖片url添加到url_list中url_list.append(result.group(1))
?return url_list
?
?
# 把爬取到的圖片保存到本地
def save_pic(url_list):# 通過num給照片起名字 例如:0.jpg 1.jpg 2.jpgnum = 0for url in url_list:# 通過requests.get()獲取每一張圖片pic = requests.get(f"http://127.0.0.1:8000{url[1:]}")# 保存每一張圖片with open(f"./source/spyder/{num}.jpg", "wb") as f:f.write(pic.content)num += 1
?
?
if __name__ == '__main__':url_list = get_pic_url()save_pic(url_list)

☆ 小結

  • 爬取照片的步驟

    • 獲取index.html代碼

    • 解析index.html代碼獲取圖片url

    • 通過圖片url獲取圖片

四、使用Python爬取GDP數據

1、gdp.html

通過訪問 http://127.0.0.1:8080/gdp.html 可以獲取2020年世界GDP排名. 在這里我們通過和爬取照片一樣的流程步驟獲取GDP數據。

2、zip函數的使用

zip() 函數: 用于將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表.

a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]
# 打包為元組的列表
zipped = zip(a, b)
# 注意使用的時候需要list轉化
print(list(zipped))
>>> [(1, 4), (2, 5), (3, 6)]
?
# 元素個數與最短的列表一致
zipped = zip(a, c)
# 注意使用的時候需要list轉化
print(list(zipped))
>>> [(1, 4), (2, 5), (3, 6)]

3、爬取GDP數據

import requests
import re
?
# 存儲爬取到的國家的名字
country_list = []
# 存儲爬取到的國家gdp的數據
gdp_list = []
?
?
# 獲取gdp數據
def get_gdp_data():global country_listglobal gdp_list
?# 獲取gdp的html數據data = requests.get("http://localhost:8000/gdp.html")# 對獲取數據進行解碼data = data.content.decode("utf8")# 對gdp的html數據進行按行分割data_list = data.split("\n")
?for i in data_list:# 對html進行解析獲取<國家名字>country_result = re.match('.*<a href=""><font>(.*)</font></a>', i)# 匹配成功就存放到列表中if country_result is not None:country_list.append(country_result.group(1))# 對html進行解析獲取<gdp數據>gdp_result = re.match(".*¥(.*)億元", i)# 匹配成功就存儲到列表中if gdp_result is not None:gdp_list.append(gdp_result.group(1))# 把兩個列表融合成一個列表gdp_data = list(zip(country_list, gdp_list))print(gdp_data)
?
?
if __name__ == '__main__':get_gdp_data()

4、小結

  • 爬取gdp的步驟

    • 獲取gdp.html代碼

    • 解析gdp.html代碼獲取gdp數據

五、多任務爬蟲實現

1、為什么用多任務

在我們的案例中, 我們只是爬取了2個非常簡單的頁面, 這兩個頁面的數據爬取并不會使用太多的時間, 所以我們也沒有太多的考慮效率問題.

但是在真正的工作環境中, 我們爬取的數據可能非常的多, 如果還是使用單任務實現, 這時候就會讓我們爬取數據的時間很長, 那么顯然使用多任務可以大大提升我們爬取數據的效率

2、多任務爬取數據

實際上實現多任務并不難, 只需要使用我們之前講過的多任務就可以了

3、多任務代碼實現

# 獲取gdp
def get_gdp_data():pass
?
?
# 獲取照片
def get_pic():pass
?
?
if __name__ == '__main__':p1 = multiprocessing.Process(target=get_picp2 = multiprocessing.Process(target=get_gdp_data)
?p1.start()p2.start()

4、小結

  • 多任務

    1. 導入模塊

    2. 創建多進程或者多線程

    3. 啟動多任務

六、數據可視化

1、 什么是數據可視化

數據可視化:顧名思義就是讓數據看的到, 他的作用也很明顯, 讓人們不用再去閱讀枯燥無味的數據, 一眼看去就可以明白數據是什么, 數據間的關系是什么, 更好的讓我們通過數據發現潛在的規律進而進行商業決策。

2、pyecharts模塊

概況 :

Echarts 是個由百度開源的數據可視化,憑借著良好的交互性,精巧的圖表設計,得到了眾多開發者的認可. 而 Python 是門富有表達力的語言,很適合用于數據處理. 當數據分析遇上數據可視化時pyecharts 誕生了.

特性 :

  1. 簡潔的API設計,使用如絲滑般流暢,支持鏈式調用

  2. 囊括了30+種常見圖表,應有盡有

  3. 支持主流Notebook 環境,Jupyter NotebookJupyterLab

  4. 可輕松集成至Flask, Django等主流Web框架

  5. 高度靈活的配置項,可輕松搭配出精美的圖表

  6. 詳細的文檔和示例,幫助開發者更快的上手項目

  7. 多達400+地圖文件以及原生的百度地圖,為地理數據可視化提供強有力的支持

3、通過pyecharts模塊創建餅狀圖

導入模塊

# 導入餅圖模塊
from pyecharts.charts import Pie
# 導入配置選項模塊
import pyecharts.options as opts

初始化餅狀圖:

Pie()函數: 創建餅圖

opts.InitOpts參數: Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))

init_opts: 指定參數名

opts.InitOpts: 配置選項

width="1400px" height="800px" :界面的寬度和高度

# 創建餅圖并設置這個界面的長和高 
# px:像素單位
pie = Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))

給餅圖添加數據:

add()函數:

參數1: 名稱

參數2: 具體數據, 數據類型為==>[(a,b),(a,b),(a,b)]==>a為數據名稱,b為數據大小

參數3: 標簽設置 label_opts=opts.LabelOpts(formatter='{b}:{d}%') 符合百分比的形式

# 給餅圖添加數據
pie.add("GDP",data,label_opts=opts.LabelOpts(formatter='{b}:{d}%')
)

給餅圖添設置標題:

set_global_opts()函數 :

title_opts=opts.TitleOpts : 設置標題

title="2020年世界GDP排名", subtitle="美元" : 設置主標題和副標題

# 給餅圖設置標題
pie.set_global_opts(title_opts=opts.TitleOpts(title="2020年世界GDP排名", subtitle="美元"))

保存數據:

# 保存結果
pie.render()

4、完整代碼

import requests
import re
# 導入餅圖模塊
from pyecharts.charts import Pie
# 導入配置選項模塊
import pyecharts.options as opts
?
# 存儲爬取到的國家的名字
country_list = []
# 春初爬取到的國家gdp的數據
gdp_list = []
?
?
def get_gdp_data():global country_listglobal gdp_list
?# 獲取gdp的html數據data = requests.get("http://localhost:8000/gdp.html")# 對獲取數據進行解碼data = data.content.decode("utf8")# 對gdp的html數據進行按行分割data_list = data.split("\n")
?for i in data_list:# 對html進行解析獲取<國家名字>country_result = re.match('.*<a href=""><font>(.*)</font></a>', i)# 匹配成功就存放到列表中if country_result is not None:country_list.append(country_result.group(1))# 對html進行解析獲取<gdp數據>gdp_result = re.match(".*¥(.*)億元", i)# 匹配成功就存儲到列表中if gdp_result is not None:gdp_list.append(gdp_result.group(1))
?
?
# 創建一個餅狀圖顯示GDP前十的國家
def data_view_pie():# 獲取前十的過的GDP數據, 同時讓數據符合[(),()...]的形式data = list(zip(country_list[:10], gdp_list[:10]))# 創建餅圖pie = Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))# 給餅圖添加數據pie.add("GDP",data,label_opts=opts.LabelOpts(formatter='{b}:{d}%'))# 給餅圖設置標題pie.set_global_opts(title_opts=opts.TitleOpts(title="2020年世界GDP排名", subtitle="美元"))# 保存結果pie.render()
?
?
if __name__ == '__main__':# 獲取GDP數據get_gdp_data()# 生成可視化餅圖data_view_pie()

5、小結

  • 可視化

    • Pie()函數 : 創建餅圖

    • add()函數 : 添加數據

    • set_global_opts()函數 : 設置標題

    • render()函數 : 保存數據

七、Logging日志模塊

1、logging日志的介紹

在現實生活中,記錄日志非常重要,比如:銀行轉賬時會有轉賬記錄;飛機飛行過程中,會有個黑盒子(飛行數據記錄器)記錄著飛機的飛行過程,那在咱們python程序中想要記錄程序在運行時所產生的日志信息,怎么做呢?

可以使用 logging 這個包來完成

記錄程序日志信息的目的是:

  1. 可以很方便的了解程序的運行情況

  2. 可以分析用戶的操作行為、喜好等信息

  3. 方便開發人員檢查bug

2、logging日志級別介紹

日志等級可以分為5個,從低到高分別是:

  1. DEBUG

  2. INFO

  3. WARNING

  4. ERROR

  5. CRITICAL

日志等級說明:

  • DEBUG:程序調試bug時使用

  • INFO:程序正常運行時使用

  • WARNING:程序未按預期運行時使用,但并不是錯誤,如:用戶登錄密碼錯誤

  • ERROR:程序出錯誤時使用,如:IO操作失敗

  • CRITICAL:特別嚴重的問題,導致程序不能再繼續運行時使用,如:磁盤空間為空,一般很少使用

  • 默認的是WARNING等級,當在WARNING或WARNING之上等級的才記錄日志信息。

  • 日志等級從低到高的順序是: DEBUG < INFO < WARNING < ERROR < CRITICAL

3、logging日志的使用

在 logging 包中記錄日志的方式有兩種:

  1. 輸出到控制臺

  2. 保存到日志文件

日志信息輸出到控制臺的示例代碼:

import logging
?
logging.debug('這是一個debug級別的日志信息')
logging.info('這是一個info級別的日志信息')
logging.warning('這是一個warning級別的日志信息')
logging.error('這是一個error級別的日志信息')
logging.critical('這是一個critical級別的日志信息')

運行結果:

WARNING:root:這是一個warning級別的日志信息
ERROR:root:這是一個error級別的日志信息
CRITICAL:root:這是一個critical級別的日志信息

說明:

  • 日志信息只顯示了大于等于WARNING級別的日志,這說明默認的日志級別設置為WARNING

logging日志等級和輸出格式的設置:

import logging
?
# 設置日志等級和輸出日志格式
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
?
logging.debug('這是一個debug級別的日志信息')
logging.info('這是一個info級別的日志信息')
logging.warning('這是一個warning級別的日志信息')
logging.error('這是一個error級別的日志信息')
logging.critical('這是一個critical級別的日志信息')

運行結果:

2019-02-13 20:41:33,080 - hello.py[line:6] - DEBUG: 這是一個debug級別的日志信息
2019-02-13 20:41:33,080 - hello.py[line:7] - INFO: 這是一個info級別的日志信息
2019-02-13 20:41:33,080 - hello.py[line:8] - WARNING: 這是一個warning級別的日志信息
2019-02-13 20:41:33,080 - hello.py[line:9] - ERROR: 這是一個error級別的日志信息
2019-02-13 20:41:33,080 - hello.py[line:10] - CRITICAL: 這是一個critical級別的日志信息

代碼說明:

  • level 表示設置的日志等級

  • format 表示日志的輸出格式, 參數說明:

    • %(levelname)s: 打印日志級別名稱

    • %(filename)s: 打印當前執行程序名

    • %(lineno)d: 打印日志的當前行號

    • %(asctime)s: 打印日志的時間

    • %(message)s: 打印日志信息

日志信息保存到日志文件的示例代碼:

import logging
?
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',filename="log.txt",filemode="w")
?
logging.debug('這是一個debug級別的日志信息')
logging.info('這是一個info級別的日志信息')
logging.warning('這是一個warning級別的日志信息')
logging.error('這是一個error級別的日志信息')
logging.critical('這是一個critical級別的日志信息')

運行結果:

4、logging日志在Web項目中應用

使用logging日志示例:

  1. 程序入口模塊設置logging日志的設置

    # 導入FastAPI模塊from fastapi import FastAPI# 導入響應報文Response模塊from fastapi import Response# 導入服務器uvicorn模塊import uvicorn# 導入日志模塊import logging
    ?# 配置日志logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',filename="log.txt",filemode="w")

  2. 訪問index.html時進行日志輸出,示例代碼:

    # 當請求為 /images/0.jpg 時, path ==> 0.jpg
    @app.get("/images/{path}")
    # 注意這里的參數需要設置為 path
    # path : str ==> 指定path為字符串類型的數據
    def get_pic(path: str):# 這里open()的路徑就是 ==> f"source/images/0.jpg"with open(f"source/images/{path}", "rb") as f:data = f.read()# 打loglogging.info("訪問了" + path)# return 返回響應數據# Response(content=data, media_type="jpg")# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="jpg")

  3. 訪問gdp.html時進行日志輸出,示例代碼:

    @app.get("/{path}")
    def get_html(path: str):with open(f"source/html/{path}") as f:data = f.read()# 打loglogging.info("訪問了" + path)# return 返回響應數據# Response(content=data, media_type="text/source"# 參數1: 響應數據# 參數2: 數據格式return Response(content=data, media_type="text/html")

logging日志:

通過日志信息我們得知, index.html被訪問了2次, gdp.html被訪問了2次.

說明:

  • logging日志配置信息在程序入口模塊設置一次,整個程序都可以生效。

    • logging.basicConfig 表示 logging 日志配置操作

5、小結

  • 記錄python程序中日志信息使用 logging 包來完成

  • logging日志等級有5個:

    1. DEBUG

    2. INFO

    3. WARNING

    4. ERROR

    5. CRITICAL

  • 打印(記錄)日志的函數有5個:

    1. logging.debug函數, 表示: 打印(記錄)DEBUG級別的日志信息

    2. logging.info函數, 表示: 打印(記錄)INFO級別的日志信息

    3. logging.warning函數, 表示: 打印(記錄)WARNING級別的日志信息

    4. logging.error函數, 表示: 打印(記錄)ERROR級別的日志信息

    5. logging.critical函數, 表示: 打印(記錄)CRITICAL級別的日志信息

八、擴展:數據埋點

具體參考講義

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73931.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp工程中解析markdown文件

在uniapp中如何導入markdown文件&#xff0c;同時在頁面中解析成html&#xff0c;請參考以下配置&#xff1a; 1. 安裝以下3個依賴包 npm install marked highlight.js vite-plugin-markdown 2. 創建vite.config.js配置文件 // vite.config.js import { defineConfig } fro…

sass介紹

1、Sass簡介 Sass 是一種 CSS 的預編譯語言。它提供了 變量&#xff08;variables&#xff09;、嵌套&#xff08;nested rules&#xff09;、 混合&#xff08;mixins&#xff09;、 函數&#xff08;functions&#xff09;等功能&#xff0c;并且完全兼容 CSS 語法。Sass 能…

[JavaScript]如何利用作用域塊避免閉包內存泄漏?

出自《你不知道的JavaScript》上卷 以下是本書給出的反例: function process (data) {...} var bigdata{...} process(bigdata); var btn document.getElementById(x); btn.addEventListener(click, function click{...});click會被回調在其他位置, 在addEventListener函數內…

leetcode hot100(五)

11. 盛最多水的容器 給定一個長度為 n 的整數數組 height 。有 n 條垂線&#xff0c;第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成的容器可以容納最多的水。 返回容器可以儲存的最大水量。 說明&#xff1a;你…

Unity 云渲染本地部署方案

Unity Render Streaming 云渲染環境搭建 0.安裝 Unity Render Streaming 實現原理: 服務器與客戶端實現功能包括: 詳細內容見官方文檔&#xff1a; 官方文檔: https://docs.unity3d.com/Packages/com.unity.renderstreaming3.1/manual/tutorial.html Unity 流送云渲染介紹: …

洛谷 P3986 斐波那契數列

P3986 斐波那契數列 題目描述 定義一個數列&#xff1a; f ( 0 ) a , f ( 1 ) b , f ( n ) f ( n ? 1 ) f ( n ? 2 ) f(0) a, f(1) b, f(n) f(n - 1) f(n - 2) f(0)a,f(1)b,f(n)f(n?1)f(n?2) 其中 a, b 均為正整數&#xff0c;n ≥ 2。 問有多少種 (a, b)&…

【java面型對象進階】------繼承實例

繼承結構下的標準Javabean 代碼如下&#xff1a; package demo10;//定義員工父類 public class Employee {private String id;private String name;private double salary;//構造方法public Employee(){}public Employee(String id,String name,double salary){this.idid;thi…

Vitis 2024.1 無法正常編譯custom ip的bug(因為Makefile里的wildcard)

現象&#xff1a;如果在vivado中&#xff0c;添加了自己的custom IP&#xff0c;比如AXI4 IP&#xff0c;那么在Vitis&#xff08;2024.1&#xff09;編譯導出的原本的.xsa的時候&#xff0c;會構建build失敗。報錯代碼是&#xff1a; "Compiling blank_test_ip..."…

【圖論】并查集的學習和使用

目錄 并查集是什么&#xff1f; 舉個例子 組成 父親數組&#xff1a; find函數&#xff1a; union函數&#xff1a; 代碼實現&#xff1a; fa[] 初始化code: find code&#xff1a; 遞歸實現: 非遞歸實現: union code : 畫圖模擬&#xff1a; 路徑壓縮&#xff1a…

Java使用FFmpegFrameGrabber進行視頻拆幀,結合Thumbnails壓縮圖片保存到文件夾

引入依賴 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

mysql與redis的日志策略

MySQL 和 Redis 在日志記錄方面采用了不同的策略&#xff0c;分別對應寫前日志&#xff08;Write-Ahead Logging, WAL&#xff09;和寫后日志&#xff08;Write-After Logging&#xff09;。以下是它們的詳細說明&#xff1a; 1. MySQL&#xff1a;寫前日志&#xff08;Write-A…

nacos安裝,服務注冊,服務發現,遠程調用3個方法

安裝 點版本下載頁面 服務注冊 每個微服務都配置nacos的地址&#xff0c;都要知道 服務發現 2個是知道了解 遠程調用基本實現 遠程調用方法2&#xff0c;負載均衡API測試 遠程調用方法3&#xff0c;注解 負載均衡的遠程調用&#xff0c; 總結 面試題

Ubuntu Qt: no service found for - “org.qt-project.qt.mediaplayer“

1、前言 在一次項目過程中&#xff0c;因項目需求&#xff0c;需要將windows開發的Qt項目遷移到ubuntu系統中&#xff0c;且在某個功能項中需要播放音頻&#xff0c;在windows系統中能夠正常運行&#xff0c;但在ubuntu系統中卻顯示defaultServiceProvider::requestService(): …

Blender制作次表面材質

效果: 主要用沃羅諾伊紋理做出云絮感 然后EV開啟次表面設置

用 pytorch 從零開始創建大語言模型(四):從零開始實現一個用于生成文本的GPT模型

從零開始創建大語言模型&#xff08;Python/pytorch &#xff09;&#xff08;四&#xff09;&#xff1a;從零開始實現一個用于生成文本的GPT模型 4 從零開始實現一個用于生成文本的GPT模型4.1 編寫 L L M LLM LLM架構4.2 使用層歸一化對激活值進行標準化4.3 使用GELU激活函數…

vmware tools灰化

Windows7 32位的某些版本&#xff0c;已經不被vmware支持。下面是解決方法&#xff1a; 安裝kb4474419補丁包&#xff1a;https://www.catalog.update.microsoft.com/Search.aspx?qKB4474419網絡共享。必須要虛擬機和主機可通信。此方法不錯&#xff0c;但是操作起來太麻煩。…

ubuntu高并發內核參數調優 - (壓測客戶端調優)

業務上要求集群提供10w并發&#xff0c;10w并發聽上去不是很難&#xff0c;但10w并發持續1小時呢 在業務上線之前還需要我們自己對業務進行壓測&#xff0c;俗稱benchmark。 壓測的服務器也是需要進行性能調優的&#xff0c;以下列出調優前后的參數對比&#xff0c;更直觀的分析…

html5制作2048游戲開發心得與技術分享

2048游戲開發心得與技術分享 這里寫目錄標題 2048游戲開發心得與技術分享項目概述技術架構1. 核心技術棧2. 項目結構 核心功能實現1. 數據結構設計2. 移動邏輯實現3. 觸摸支持 性能優化1. DOM操作優化2. 事件處理優化 開發心得1. 代碼組織2. 調試技巧3. 用戶體驗優化 項目亮點技…

dify+deepseek聯網搜索:免費開源搜索引擎Searxng使用(讓你的大模型也擁有聯網的功能)

docker安裝SearXng 項目地址:https://github.com/searxng/searxng-docker 第一步 git clone下來 git clone https://github.com/searxng/searxng-docker.git第二步 進入 searxng-docker目錄中修改docker-compose.yaml(直接復制粘貼) cd searxng-dockerdocker-compose.yaml …

docker的anythingllm和open-webui壓縮包分享(國內鏡像拉取,百度云壓縮包分享)

文章目錄 前言第一部分&#xff1a;鏡像獲取&#x1f680; 方式一&#xff1a;切換國內下載鏡像?1. 下載anythingllm? 2. 下載open-webui &#x1f680;方式二&#xff1a;下載我分享的百度云? anythingllm壓縮包百度云鏈接? open-webui壓縮包 第二部分&#xff1a;下載之后…