亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁(yè) 后端開發(fā) Python教程 抓取但驗(yàn)證:使用 Pydantic Validation 抓取數(shù)據(jù)

抓取但驗(yàn)證:使用 Pydantic Validation 抓取數(shù)據(jù)

Nov 22, 2024 am 07:40 AM

注意:不是 chatGPT/LLM 的輸出

數(shù)據(jù)抓取是從公共網(wǎng)絡(luò)源收集數(shù)據(jù)的過(guò)程,主要是使用腳本以自動(dòng)化方式完成。由于自動(dòng)化,收集的數(shù)據(jù)常常存在錯(cuò)誤,需要過(guò)濾和清理才能使用。不過(guò),如果抓取的數(shù)據(jù)能夠在抓取過(guò)程中得到驗(yàn)證,那就更好了。

考慮到數(shù)據(jù)驗(yàn)證的要求,大多數(shù)抓取框架(如Scrapy)都有可用于數(shù)據(jù)驗(yàn)證的內(nèi)置模式。然而,很多時(shí)候,在數(shù)據(jù)抓取過(guò)程中,我們經(jīng)常只使用通用模塊,例如 requestsbeautifulsoup 進(jìn)行抓取。在這種情況下,很難驗(yàn)證收集到的數(shù)據(jù),因此這篇博文解釋了一種使用 Pydantic 進(jìn)行數(shù)據(jù)抓取和驗(yàn)證的簡(jiǎn)單方法。
https://docs.pydantic.dev/latest/
Pydantic 是一個(gè)數(shù)據(jù)驗(yàn)證 Python 模塊。它也是流行的 api 模塊 FastAPI 的骨干,就像 Pydantic 一樣,還有其他 python 模塊,可用于數(shù)據(jù)抓取期間的驗(yàn)證。然而,這篇博客探討了 pydantic,這里是替代包的鏈接(您可以嘗試使用任何其他模塊更改 pydantic 作為學(xué)習(xí)練習(xí))

  • Cerberus 是一個(gè)輕量級(jí)且可擴(kuò)展的 Python 數(shù)據(jù)驗(yàn)證庫(kù)。 https://pypi.org/project/Cerberus/

刮痧計(jì)劃:

在此博客中,我們將從報(bào)價(jià)網(wǎng)站中刪除報(bào)價(jià)。
我們將使用 requests 和 beautifulsoup 來(lái)獲取數(shù)據(jù) 將創(chuàng)建一個(gè) pydantic 數(shù)據(jù)類來(lái)驗(yàn)證每個(gè)抓取的數(shù)據(jù) 將過(guò)濾和驗(yàn)證的數(shù)據(jù)保存在 json 文件中。

為了更好的安排和理解,每個(gè)步驟都實(shí)現(xiàn)為可以在 main 部分下使用的 python 方法。

基本導(dǎo)入

import requests # for web request
from bs4 import BeautifulSoup # cleaning html content

# pydantic for validation

from pydantic import BaseModel, field_validator, ValidationError

import json

1. 目標(biāo)站點(diǎn)并獲取報(bào)價(jià)

我們正在使用 (http://quotes.toscrape.com/) 來(lái)抓取報(bào)價(jià)。每個(gè)引用將包含三個(gè)字段:quote_text、作者和標(biāo)簽。例如:

Scrape but Validate: Data scraping with Pydantic Validation

下面的方法是獲取給定 url 的 html 內(nèi)容的通用腳本。

def get_html_content(page_url: str) -> str:
    page_content =""
    # Send a GET request to the website
    response = requests.get(url)
    # Check if the request was successful (status code 200)
    if response.status_code == 200:
        page_content = response.content
    else:
        page_content = f'Failed to retrieve the webpage. Status code: {response.status_code}'
    return page_content

2. 抓取報(bào)價(jià)數(shù)據(jù)

我們將使用 requests 和 beautifulsoup 從給定的 url 中抓取數(shù)據(jù)。該過(guò)程分為三個(gè)部分:1)從網(wǎng)絡(luò)獲取 html 內(nèi)容 2)為每個(gè)目標(biāo)字段提取所需的 html 標(biāo)簽 3)從每個(gè)標(biāo)簽獲取值

import requests # for web request
from bs4 import BeautifulSoup # cleaning html content

# pydantic for validation

from pydantic import BaseModel, field_validator, ValidationError

import json

def get_html_content(page_url: str) -> str:
    page_content =""
    # Send a GET request to the website
    response = requests.get(url)
    # Check if the request was successful (status code 200)
    if response.status_code == 200:
        page_content = response.content
    else:
        page_content = f'Failed to retrieve the webpage. Status code: {response.status_code}'
    return page_content

下面的腳本從每個(gè)報(bào)價(jià)的 div 中獲取數(shù)據(jù)點(diǎn)。

def get_tags(tags):
    tags =[tag.get_text() for tag in tags.find_all('a')]
    return tags

3. 創(chuàng)建 Pydantic 數(shù)據(jù)類并驗(yàn)證每個(gè)報(bào)價(jià)的數(shù)據(jù)

根據(jù)引用的每個(gè)字段,創(chuàng)建一個(gè) pydantic 類并在數(shù)據(jù)抓取期間使用相同的類進(jìn)行數(shù)據(jù)驗(yàn)證。

pydantic 模型引用

下面是從 BaseModel 擴(kuò)展而來(lái)的 Quote 類,具有三個(gè)字段,如 quote_text、作者和標(biāo)簽。其中,quote_text 和author 是字符串(str)類型,tags 是列表類型。

我們有兩個(gè)驗(yàn)證器方法(帶有裝飾器):

1)tags_more_than_two():將檢查它是否必須有兩個(gè)以上的標(biāo)簽。 (這只是舉例,你可以在這里有任何規(guī)則)

2.) check_quote_text():此方法將從引用中刪除“”并測(cè)試文本。

def get_quotes_div(html_content:str) -> str :    
    # Parse the page content with BeautifulSoup
    soup = BeautifulSoup(html_content, 'html.parser')

    # Find all the quotes on the page
    quotes = soup.find_all('div', class_='quote')

    return quotes

獲取和驗(yàn)證數(shù)據(jù)

使用 pydantic 進(jìn)行數(shù)據(jù)驗(yàn)證非常簡(jiǎn)單,例如下面的代碼,將抓取的數(shù)據(jù)傳遞給 pydantic 類 Quote。

    # Loop through each quote and extract the text and author
    for quote in quotes_div:
        quote_text = quote.find('span', class_='text').get_text()
        author = quote.find('small', class_='author').get_text()
        tags = get_tags(quote.find('div', class_='tags'))

        # yied data to a dictonary 
        quote_temp ={'quote_text': quote_text,
                'author': author,
                'tags':tags
        }
class Quote(BaseModel):
    quote_text:str
    author:str
    tags: list

    @field_validator('tags')
    @classmethod
    def tags_more_than_two(cls, tags_list:list) -> list:
        if len(tags_list) <=2:
            raise ValueError("There should be more than two tags.")
        return tags_list

    @field_validator('quote_text')
    @classmethod    
    def check_quote_text(cls, quote_text:str) -> str:
        return quote_text.removeprefix('“').removesuffix('”')

4. 存儲(chǔ)數(shù)據(jù)

數(shù)據(jù)經(jīng)過(guò)驗(yàn)證后,將保存到 json 文件中。 (編寫了一個(gè)通用方法,將 Python 字典轉(zhuǎn)換為 json 文件)

quote_data = Quote(**quote_temp)

將所有內(nèi)容放在一起

了解了每一個(gè)抓取之后,現(xiàn)在,您可以將所有內(nèi)容放在一起并運(yùn)行抓取以進(jìn)行數(shù)據(jù)收集。

def get_quotes_data(quotes_div: list) -> list:
    quotes_data = []

    # Loop through each quote and extract the text and author
    for quote in quotes_div:
        quote_text = quote.find('span', class_='text').get_text()
        author = quote.find('small', class_='author').get_text()
        tags = get_tags(quote.find('div', class_='tags'))

        # yied data to a dictonary 
        quote_temp ={'quote_text': quote_text,
                'author': author,
                'tags':tags
        }

        # validate data with Pydantic model
        try:
            quote_data = Quote(**quote_temp)            
            quotes_data.append(quote_data.model_dump())            
        except  ValidationError as e:
            print(e.json())
    return quotes_data

注意:計(jì)劃進(jìn)行修訂,請(qǐng)告訴我您的想法或建議,以包含在修訂版本中。

鏈接和資源:

  • https://pypi.org/project/parsel/

  • https://docs.pydantic.dev/latest/

以上是抓取但驗(yàn)證:使用 Pydantic Validation 抓取數(shù)據(jù)的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
Python類中的多態(tài)性 Python類中的多態(tài)性 Jul 05, 2025 am 02:58 AM

多態(tài)是Python面向?qū)ο缶幊讨械暮诵母拍?,指“一種接口,多種實(shí)現(xiàn)”,允許統(tǒng)一處理不同類型的對(duì)象。1.多態(tài)通過(guò)方法重寫實(shí)現(xiàn),子類可重新定義父類方法,如Animal類的speak()方法在Dog和Cat子類中有不同實(shí)現(xiàn)。2.多態(tài)的實(shí)際用途包括簡(jiǎn)化代碼結(jié)構(gòu)、增強(qiáng)可擴(kuò)展性,例如圖形繪制程序中統(tǒng)一調(diào)用draw()方法,或游戲開發(fā)中處理不同角色的共同行為。3.Python實(shí)現(xiàn)多態(tài)需滿足:父類定義方法,子類重寫該方法,但不要求繼承同一父類,只要對(duì)象實(shí)現(xiàn)相同方法即可,這稱為“鴨子類型”。4.注意事項(xiàng)包括保持方

解釋Python發(fā)電機(jī)和迭代器。 解釋Python發(fā)電機(jī)和迭代器。 Jul 05, 2025 am 02:55 AM

迭代器是實(shí)現(xiàn)__iter__()和__next__()方法的對(duì)象,生成器是簡(jiǎn)化版的迭代器,通過(guò)yield關(guān)鍵字自動(dòng)實(shí)現(xiàn)這些方法。1.迭代器每次調(diào)用next()返回一個(gè)元素,無(wú)更多元素時(shí)拋出StopIteration異常。2.生成器通過(guò)函數(shù)定義,使用yield按需生成數(shù)據(jù),節(jié)省內(nèi)存且支持無(wú)限序列。3.處理已有集合時(shí)用迭代器,動(dòng)態(tài)生成大數(shù)據(jù)或需惰性求值時(shí)用生成器,如讀取大文件時(shí)逐行加載。注意:列表等可迭代對(duì)象不是迭代器,迭代器到盡頭后需重新創(chuàng)建,生成器只能遍歷一次。

如何處理Python中的API身份驗(yàn)證 如何處理Python中的API身份驗(yàn)證 Jul 13, 2025 am 02:22 AM

處理API認(rèn)證的關(guān)鍵在于理解并正確使用認(rèn)證方式。1.APIKey是最簡(jiǎn)單的認(rèn)證方式,通常放在請(qǐng)求頭或URL參數(shù)中;2.BasicAuth使用用戶名和密碼進(jìn)行Base64編碼傳輸,適合內(nèi)部系統(tǒng);3.OAuth2需先通過(guò)client_id和client_secret獲取Token,再在請(qǐng)求頭中帶上BearerToken;4.為應(yīng)對(duì)Token過(guò)期,可封裝Token管理類自動(dòng)刷新Token;總之,根據(jù)文檔選擇合適方式,并安全存儲(chǔ)密鑰信息是關(guān)鍵。

解釋Python斷言。 解釋Python斷言。 Jul 07, 2025 am 12:14 AM

Assert是Python用于調(diào)試的斷言工具,當(dāng)條件不滿足時(shí)拋出AssertionError。其語(yǔ)法為assert條件加可選錯(cuò)誤信息,適用于內(nèi)部邏輯驗(yàn)證如參數(shù)檢查、狀態(tài)確認(rèn)等,但不能用于安全或用戶輸入檢查,且應(yīng)配合清晰提示信息使用,僅限開發(fā)階段輔助調(diào)試而非替代異常處理。

如何一次迭代兩個(gè)列表 如何一次迭代兩個(gè)列表 Jul 09, 2025 am 01:13 AM

在Python中同時(shí)遍歷兩個(gè)列表的常用方法是使用zip()函數(shù),它會(huì)按順序配對(duì)多個(gè)列表并以最短為準(zhǔn);若列表長(zhǎng)度不一致,可使用itertools.zip_longest()以最長(zhǎng)為準(zhǔn)并填充缺失值;結(jié)合enumerate()可同時(shí)獲取索引。1.zip()簡(jiǎn)潔實(shí)用,適合成對(duì)數(shù)據(jù)迭代;2.zip_longest()處理不一致長(zhǎng)度時(shí)可填充默認(rèn)值;3.enumerate(zip())可在遍歷時(shí)獲取索引,滿足多種復(fù)雜場(chǎng)景需求。

什么是Python迭代器? 什么是Python迭代器? Jul 08, 2025 am 02:56 AM

Inpython,IteratorSareObjectSthallowloopingThroughCollectionsByImplementing_iter __()和__next __()。1)iteratorsWiaTheIteratorProtocol,使用__ITER __()toreTurnterateratoratoranteratoratoranteratoratorAnterAnteratoratorant antheittheext__()

什么是Python型提示? 什么是Python型提示? Jul 07, 2025 am 02:55 AM

typeHintsInpyThonsolverbromblemboyofambiguityandPotentialBugSindyNamalytyCodeByallowingDevelopsosteSpecefectifyExpectedTypes.theyenhancereadability,enablellybugdetection,andimprovetool.typehintsupport.typehintsareadsareadsareadsareadsareadsareadsareadsareadsareaddedusidocolon(

Python Fastapi教程 Python Fastapi教程 Jul 12, 2025 am 02:42 AM

要使用Python創(chuàng)建現(xiàn)代高效的API,推薦使用FastAPI;其基于標(biāo)準(zhǔn)Python類型提示,可自動(dòng)生成文檔,性能優(yōu)越。安裝FastAPI和ASGI服務(wù)器uvicorn后,即可編寫接口代碼。通過(guò)定義路由、編寫處理函數(shù)并返回?cái)?shù)據(jù),可以快速構(gòu)建API。FastAPI支持多種HTTP方法,并提供自動(dòng)生成的SwaggerUI和ReDoc文檔系統(tǒng)。URL參數(shù)可通過(guò)路徑定義捕獲,查詢參數(shù)則通過(guò)函數(shù)參數(shù)設(shè)置默認(rèn)值實(shí)現(xiàn)。合理使用Pydantic模型有助于提升開發(fā)效率和準(zhǔn)確性。

See all articles