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)
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.
import requests # for web request from bs4 import BeautifulSoup # cleaning html content # pydantic for validation from pydantic import BaseModel, field_validator, ValidationError import json
Nous utilisons (http://quotes.toscrape.com/) pour gratter les citations. Chaque citation aura trois champs : quote_text, author et tags. Par exemple :
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
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
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
def get_tags(tags): tags =[tag.get_text() for tag in tags.find_all('a')] return tags
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.
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
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 }
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('”')
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)
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
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!