Kikis tetapi Sahkan: Pengikisan data dengan Pengesahan Pydantic

Susan Sarandon
Lepaskan: 2024-11-22 07:40:10
asal
856 orang telah melayarinya

Nota: Bukan output chatGPT/ LLM

Pengikisan data ialah proses mengumpul data daripada sumber web awam dan kebanyakannya dilakukan menggunakan skrip secara automatik. Disebabkan oleh automasi, data yang sering dikumpul mempunyai ralat dan perlu ditapis dan dibersihkan untuk digunakan. Walau bagaimanapun, adalah lebih baik jika data yang dikikis boleh disahkan semasa mengikis.

Memandangkan keperluan pengesahan data, kebanyakan rangka kerja mengikis seperti Scrapy mempunyai corak terbina yang boleh digunakan untuk pengesahan data. Walau bagaimanapun, sering kali, semasa proses mengikis data, kami selalunya hanya menggunakan modul tujuan umum seperti permintaan dan beautifulsoup untuk mengikis. Dalam keadaan sedemikian, sukar untuk mengesahkan data yang dikumpul, jadi catatan blog ini menerangkan pendekatan mudah untuk mengikis data dengan pengesahan menggunakan Pydantic.
https://docs.pydantic.dev/latest/
Pydantic ialah modul python pengesahan data. Ia juga merupakan tulang belakang modul api popular FastAPI, seperti Pydantic, terdapat juga modul python lain, yang boleh digunakan untuk pengesahan semasa mengikis data. Walau bagaimanapun, blog ini meneroka pydantic dan berikut adalah pautan pakej alternatif (anda boleh cuba menukar pydantic dengan mana-mana modul lain sebagai latihan pembelajaran )

  • Cerberus ialah perpustakaan pengesahan data yang ringan dan boleh dikembangkan untuk Python. https://pypi.org/project/Cerberus/

Rancangan mengikis:

Dalam blog ini, kami akan memokir petikan daripada tapak petikan.
Kami akan menggunakan permintaan dan beautifulsoup untuk mendapatkan data Akan mencipta kelas data pydantic untuk mengesahkan setiap data yang dikikis Simpan data yang ditapis dan disahkan dalam fail json.

Untuk susunan dan pemahaman yang lebih baik, setiap langkah dilaksanakan sebagai kaedah python yang boleh digunakan di bawah bahagian utama.

Import asas

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

# pydantic for validation

from pydantic import BaseModel, field_validator, ValidationError

import json

Salin selepas log masuk
Salin selepas log masuk

1. Sasar tapak dan dapatkan sebut harga

Kami menggunakan (http://quotes.toscrape.com/) untuk mengikis petikan. Setiap petikan akan mempunyai tiga medan: quote_text, pengarang dan tag. Contohnya:

Scrape but Validate: Data scraping with Pydantic Validation

Kaedah di bawah ialah skrip umum untuk mendapatkan kandungan html untuk url tertentu.

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

Salin selepas log masuk
Salin selepas log masuk

2. Dapatkan data petikan daripada mengikis

Kami akan menggunakan permintaan dan beautifulsoup untuk mengikis data daripada url yang diberikan. Proses ini dipecahkan kepada tiga bahagian: 1) Dapatkan kandungan html daripada web 2) Ekstrak teg html yang dikehendaki untuk setiap medan yang disasarkan 3) Dapatkan nilai daripada setiap teg

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

# pydantic for validation

from pydantic import BaseModel, field_validator, ValidationError

import json

Salin selepas log masuk
Salin selepas log masuk
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

Salin selepas log masuk
Salin selepas log masuk

Skrip di bawah dapatkan titik data daripada setiap div petikan.

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

Salin selepas log masuk

3. Cipta kelas data Pydantic dan Sahkan data untuk setiap petikan

Mengikut setiap medan petikan, cipta kelas pydantic dan gunakan kelas yang sama untuk pengesahan data semasa mengikis data.

Model pydantic Petikan

Di bawah ialah kelas Petikan yang dilanjutkan daripada BaseModel yang mempunyai tiga medan seperti petikan_teks, pengarang dan teg. Daripada ketiga-tiga ini, petikan_teks dan pengarang ialah jenis rentetan (str) dan teg ialah jenis senarai.

Kami mempunyai dua kaedah pengesah (dengan penghias):

1) tags_more_than_two () : Akan menyemak sama ada ia mesti mempunyai lebih daripada dua tag. (ia hanya sebagai contoh, anda boleh mempunyai sebarang peraturan di sini)

2.) check_quote_text(): Kaedah ini akan mengalih keluar "" daripada petikan dan menguji teks.

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
Salin selepas log masuk

Mendapat dan mengesahkan data

Pengesahan data sangat mudah dengan pydantic, contohnya, di bawah kod, hantar data yang dikikis ke Petikan kelas pydantic.

    # 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
        }
Salin selepas log masuk
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('”')
Salin selepas log masuk

4. Simpan data

Setelah data disahkan yang akan disimpan ke fail json. (Kaedah tujuan umum ditulis yang akan menukar kamus Python kepada fail json)

quote_data = Quote(**quote_temp)
Salin selepas log masuk

Menyatukan semua

Setelah memahami setiap bahagian pengikisan, kini, anda boleh menyusun semuanya dan menjalankan pengikisan untuk pengumpulan data.

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
Salin selepas log masuk

Nota: Semakan telah dirancang, beritahu saya idea atau cadangan anda untuk disertakan dalam versi yang disemak.

Pautan dan sumber:

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

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

Atas ialah kandungan terperinci Kikis tetapi Sahkan: Pengikisan data dengan Pengesahan Pydantic. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan