Webscraping is een van de beste methoden voor gegevensverzameling om gegevens te verzamelen en er aangepaste datasets op te bouwen.
Het hebben van datasets van hoge kwaliteit is essentieel in dit tijdperk van datagedreven besluitvorming. Hoewel er tal van openbaar beschikbare datasets zijn, moet u soms aangepaste datasets bouwen die aan uw specifieke behoeften voldoen. Met webscraping kunt u gegevens van websites extraheren. U kunt deze gegevens vervolgens gebruiken om uw aangepaste dataset te maken.
Overzicht van methoden voor gegevensverzameling
Er zijn verschillende methoden voor gegevensverzameling. Ze omvatten handmatige gegevensinvoer, API's, openbare datasets en webschrapen. Elke methode heeft zijn voordelen en beperkingen.
Handmatige gegevensinvoer is tijdrovend en vatbaar voor menselijke fouten, vooral bij grootschalige gegevensverzameling. Het is echter nuttig voor kleinschalige gegevensverzameling en wanneer gegevens op een andere manier niet beschikbaar zijn.
Met API's kunnen ontwikkelaars op een gestructureerde manier toegang krijgen tot gegevens en deze ophalen. Ze bieden vaak real-time of regelmatig bijgewerkte informatie. API-toegang kan echter beperkt zijn, authenticatie vereisen of gebruiksbeperkingen hebben.
Openbare datasets bestrijken een breed scala aan onderwerpen en domeinen. Ze zijn vooraf verzameld en hebben vaak een gestructureerd formaat, waardoor ze gemakkelijk toegankelijk zijn. Ze kunnen tijd en moeite besparen wanneer de vereiste gegevens overeenkomen met de beschikbare datasets. Het is echter mogelijk dat ze niet altijd aan uw specifieke behoeften voldoen of niet up-to-date zijn.
Webscraping biedt een manier om gegevens te verzamelen van websites die geen API's aanbieden of beperkte toegang hebben. Het maakt maatwerk, schaalbaarheid en de mogelijkheid om gegevens uit meerdere bronnen te verzamelen mogelijk. Het vereist echter programmeervaardigheden, kennis van de HTML-structuur en naleving van wettelijke en ethische richtlijnen.
Webscraping kiezen voor gegevensverzameling
Met webscraping kunt u informatie rechtstreeks uit webpagina's halen, waardoor u toegang krijgt tot een breed scala aan gegevensbronnen. Het geeft u ook controle over welke gegevens u moet extraheren en hoe u deze moet structureren. Dit maakt het gemakkelijk om het schraapproces af te stemmen op uw specifieke vereisten en de precieze informatie te extraheren die u nodig heeft voor uw project.
Identificatie van de gegevensbron
De eerste stap bij webscraping is het identificeren van de gegevensbron. Dit is de website die de gegevens bevat die u wilt schrapen. Zorg er bij het kiezen van de gegevensbron voor dat u zich houdt aan de servicevoorwaarden van de bron. Dit artikel gebruikt IMDb (Internet Movie Database) als gegevensbron.
Uw omgeving instellen
Zet een virtuele omgeving op. Voer vervolgens de volgende opdracht uit om de vereiste bibliotheken te installeren.
pip-installatieverzoeken beautifulsoup4 panda's
Je maakt gebruik van de aanvragen bibliotheek om HTTP-verzoeken te doen. mooiesoep4 om HTML-inhoud te ontleden en gegevens uit webpagina's te extraheren. Tot slot ga je gebruiken panda's gegevens manipuleren en analyseren.
De volledige broncode is beschikbaar in een GitHub-opslagplaats.
Schrijven van het webscraping-script
Importeer de geïnstalleerde bibliotheken in uw script om de functies die ze bieden te kunnen gebruiken.
importeren aanvragen
van bs4 importeren Mooie Soep
importeren tijd
importeren panda's als pd
importeren met betrekking tot
De tijd En met betrekking tot modules maken deel uit van de standaardbibliotheek van Python. Vereist dus geen afzonderlijke installaties.
tijd zal vertragingen toevoegen aan het schraapproces terwijl met betrekking tot zal behandelen normale uitdrukkingen.
Je zal gebruik Beautiful Soup om de doelwebsite te schrapen.
Maak een functie die een HTTP GET-verzoek naar uw doel-URL verzendt. Het zou dan de inhoud van het antwoord moeten ophalen en een Mooie Soep object uit de HTML-inhoud.
defkrijg_soep(url, params=Geen, headers=Geen):
antwoord = verzoeken.get (url, params=params, headers=headers)
soup = BeautifulSoup (response.content, "html.parser")
opbrengst soep
De volgende stap is het extraheren van informatie uit de Mooie Soep voorwerp.
Om de informatie te extraheren die u nodig heeft om de structuur van uw doelwebsite te begrijpen. Hierbij wordt de HTML-code van de website gecontroleerd. Dit helpt u bij het identificeren van de elementen en attributen die de gegevens bevatten die u wilt extraheren. Om uw doelwebsite te inspecteren, opent u de link in een webbrowser en navigeert u naar de webpagina die de gegevens bevat die u wilt schrapen.
Klik vervolgens met de rechtermuisknop op de webpagina en selecteer Inspecteren vanuit het contextmenu. Hierdoor worden de ontwikkelaarstools van de browser geopend.
Zoek in de HTML-code van de webpagina naar elementen die de gegevens bevatten die u wilt schrapen. Besteed aandacht aan de HTML-tags, klassen en attributen die zijn gekoppeld aan de gegevens die u nodig hebt. U zult ze gebruiken om selectors te maken voor het extraheren van de gegevens met behulp van BeautifulSoup. In de bovenstaande schermafbeelding kunt u zien dat de titel van de film in de lister-item-header klas. Inspecteer elke functie die u wilt extraheren.
Maak een functie die informatie uit de Mooie Soep voorwerp. In dit geval vindt de functie de titel, beoordeling, beschrijving, genre, releasedatum, regisseurs en sterren van de film met behulp van de juiste HTML-tags en klasse-attributen.
defextract_movie_data(film):
titel = film.vind("h3", klasse_="lister-item-header").vinden("A").tekst
waardering = film.vind("div", klasse_="beoordelingen-imdb-beoordelingen").sterke.tekst
beschrijving = film.vind("div", klasse_="lister-item-inhoud").vind alle("P")[1].tekst.strip()
genre_element = film.vind("span", klasse_="genre")
genre = genre_element.text.strip() als genre_element andersGeen
release_date = film.vind("span", klasse_="lister-item-jaar tekst-gedempt unbold".text.strip()
director_stars = movie.find("P", klasse_="tekst gedempt").vind alle("A")
directors = [persoon.tekst voor persoon in regisseur_sterren[:-1]]
stars = [persoon.tekst voor persoon in regisseur_sterren[-1:]]
movie_data = {
"Titel": titel,
"Beoordeling": beoordeling,
"Beschrijving": beschrijving,
"Genre": genre,
"Datum van publicatie": Publicatiedatum,
"Directeuren": regisseurs,
"Sterren": sterren
}
opbrengst movie_data
Maak ten slotte een functie die het daadwerkelijke schrapen zal doen met behulp van de bovenstaande twee functies. Het duurt het jaar en het maximale aantal films dat u wilt schrapen.
defscrape_imdb_movies(jaar, limiet):
base_url = " https://www.imdb.com/search/title"
koppen = {"Accepteer-Taal": "en-US, en; q=0.9"}
films = []
beginnen = 1
terwijl len (films) < limiet:
parameters = {
"Publicatiedatum": jaar,
"soort": "aantal stemmen, desc",
"begin": begin
}
soup = get_soup (base_url, params=params, headers=headers)
movie_list = soup.find_all("div", klasse_="lister-item-modus-geavanceerd")
als len (filmlijst) == 0:
pauze
voor film in movie_list:
movie_data = extract_movie_data (film)
movies.append (movie_data)
als len (films) >= limiet:
pauze
begin += 50# IMDb geeft 50 films per pagina weer
tijd.slaap(1) # Voeg een vertraging toe om te voorkomen dat de server wordt overweldigd
opbrengst films
Bel dan de def scrape_imdb_movies om het schrapen te doen.
# Schrap 1000 films uitgebracht in 2023 (of zoveel als beschikbaar)
films = scrape_imdb_movies(2023, 1000)
U hebt nu gegevens geschraapt.
De volgende stap is om van deze gegevens een dataset te maken.
Een gegevensset maken van de geschraapte gegevens
Maak een DataFrame met behulp van Panda's uit de geschraapte gegevens.
df = pd. DataFrame (films)
Voer vervolgens de voorverwerking en opschoning van gegevens uit. Verwijder in dit geval rijen met ontbrekende waarden. Haal vervolgens het jaar uit de releasedatum en converteer het naar numeriek. Verwijder overbodige kolommen. Zet de Beoordeling kolom naar numeriek. Verwijder ten slotte niet-alfabetische tekens uit het Titel kolom.
df = df.dropna()
df['Jaar van uitgave'] = df['Datum van publicatie'].str.extract(r'(\d{4})')
df['Jaar van uitgave'] = pd.to_numeriek (df['Jaar van uitgave'],
fouten='dwingen'.astype('Int64')
df = df.drop(['Datum van publicatie'], as=1)
df['Beoordeling'] = pd.to_numeriek (df['Beoordeling'], fouten='dwingen')
df['Titel'] = df['Titel'].toepassen(lambda x: re.sub(r'\W+', ' ', X))
Sla de gegevens op in een bestand om later in uw project te gebruiken.
df.naar_csv("imdb_movies_dataset.csv", index=Vals)
Druk ten slotte de eerste vijf rijen van uw dataset af om te zien hoe deze eruitziet.
df.hoofd()
De uitvoer is zoals weergegeven in de onderstaande schermafbeelding:
U hebt nu een dataset verkregen via webscraping.
Webschrapen met behulp van andere Python-bibliotheken
Beautiful Soup is niet de enige Python-bibliotheek die u kunt gebruiken voor webscraping. Er zijn nog andere bibliotheken. Elk met zijn eigen voordelen en beperkingen. Onderzoek ze om erachter te komen welke het beste bij uw gebruik past.