Rumah > Artikel > pembangunan bahagian belakang > Kikis tetapi Sahkan: Pengikisan data dengan Pengesahan Pydantic
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 )
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 requests # for web request from bs4 import BeautifulSoup # cleaning html content # pydantic for validation from pydantic import BaseModel, field_validator, ValidationError import json
Kami menggunakan (http://quotes.toscrape.com/) untuk mengikis petikan. Setiap petikan akan mempunyai tiga medan: quote_text, pengarang dan tag. Contohnya:
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
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
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
Mengikut setiap medan petikan, cipta kelas pydantic dan gunakan kelas yang sama untuk pengesahan data semasa mengikis data.
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
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 }
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('”')
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)
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
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!