Scraper mais valider : grattage de données avec la validation Pydantic

Susan Sarandon
Libérer: 2024-11-22 07:40:10
original
874 Les gens l'ont consulté

Remarque : Pas une sortie de chatGPT/ LLM

Le data scraping est un processus de collecte de données à partir de sources Web publiques et il est principalement effectué à l'aide d'un script de manière automatisée. En raison de l'automatisation, les données collectées comportent souvent des erreurs et doivent être filtrées et nettoyées avant d'être utilisées. Cependant, il serait préférable que les données récupérées puissent être validées lors du scraping.

Compte tenu de l'exigence de validation des données, la plupart des frameworks de scraping comme Scrapy ont un modèle intégré qui peut être utilisé pour la validation des données. Cependant, il arrive souvent que, pendant le processus de scraping de données, nous utilisons simplement des modules à usage général comme requests et beautifulsoup pour le scraping. Dans un tel cas, il est difficile de valider les données collectées, c'est pourquoi cet article de blog explique une approche simple pour le scraping de données avec validation à l'aide de Pydantic.
https://docs.pydantic.dev/latest/
Pydantic est un module python de validation de données. C'est également l'épine dorsale du module API populaire FastAPI, comme Pydantic, il existe également d'autres modules Python qui peuvent être utilisés pour la validation lors du grattage de données. Cependant, ce blog explore pydantic et voici des liens vers des packages alternatifs (vous pouvez essayer de changer pydantic avec n'importe quel autre module comme exercice d'apprentissage)

  • Cerberus est une bibliothèque de validation de données légère et extensible pour Python. https://pypi.org/project/Cerberus/

Plan de grattage :

Dans ce blog, nous supprimerons les citations du site de citations.
Nous utiliserons des requêtes et beautifulsoup pour obtenir les données. Nous créerons une classe de données pydantic pour valider chaque donnée récupérée. Enregistrez les données filtrées et validées dans un fichier json.

Pour une meilleure organisation et compréhension, chaque étape est implémentée comme une méthode Python qui peut être utilisée dans la section principale.

Importation de base

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

# pydantic for validation

from pydantic import BaseModel, field_validator, ValidationError

import json

Copier après la connexion
Copier après la connexion

1. Cibler le site et obtenir des devis

Nous utilisons (http://quotes.toscrape.com/) pour gratter les citations. Chaque citation aura trois champs : quote_text, author et tags. Par exemple :

Scrape but Validate: Data scraping with Pydantic Validation

La méthode ci-dessous est un script général pour obtenir du contenu HTML pour une URL donnée.

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

Copier après la connexion
Copier après la connexion

2. Obtenez les données du devis à partir du scraping

Nous utiliserons les requêtes et beautifulsoup pour récupérer les données des URL données. Le processus est divisé en trois parties : 1) Récupérer le contenu html du Web 2) Extraire les balises html souhaitées pour chaque champ ciblé 3) Récupérer les valeurs de chaque balise

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

# pydantic for validation

from pydantic import BaseModel, field_validator, ValidationError

import json

Copier après la connexion
Copier après la connexion
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

Copier après la connexion
Copier après la connexion

Le script ci-dessous récupère le point de données du div de chaque devis.

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

Copier après la connexion

3. Créez une classe de données Pydantic et validez les données pour chaque devis

Selon chaque champ du devis, créez une classe pydantic et utilisez la même classe pour la validation des données lors du grattage des données.

Le modèle pydantique Citation

Vous trouverez ci-dessous la classe Quote qui est étendue à partir de BaseModel et comporte trois champs tels que quote_text, author et tags. Parmi ces trois, quote_text et author sont un type de chaîne (str) et tags est un type de liste.

Nous avons deux méthodes de validation (avec décorateurs) :

1) tags_more_than_two () : Vérifiera qu'il doit avoir plus de deux balises. (c'est juste à titre d'exemple, vous pouvez avoir n'importe quelle règle ici)

2.) check_quote_text() : Cette méthode supprimera "" de la citation et testera le texte.

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
Copier après la connexion

Obtenir et valider des données

La validation des données est très simple avec pydantic, par exemple, sous le code, transmettez les données récupérées à la classe 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
        }
Copier après la connexion
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('”')
Copier après la connexion

4. Stockez les données

Une fois les données validées, elles seront enregistrées dans un fichier json. (Une méthode à usage général est écrite pour convertir le dictionnaire Python en fichier json)

quote_data = Quote(**quote_temp)
Copier après la connexion

Rassembler le tout

Après avoir compris chaque élément du scraping, vous pouvez maintenant tout rassembler et exécuter le scraping pour la collecte de données.

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
Copier après la connexion

Remarque : Une révision est prévue, faites-moi part de votre idée ou suggestion à inclure dans la version révisée.

Liens et ressources :

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal