Er zijn grofweg twee manieren om gegevens uit een website te extraheren:
- Gebruik de API van de website (indien aanwezig). Facebook heeft bijvoorbeeld de Facebook Graph API waarmee gegevens die op Facebook zijn geplaatst, kunnen worden opgehaald.
- Krijg toegang tot de HTML van de webpagina en haal er nuttige informatie/gegevens uit. Deze techniek wordt webscraping of webharvesting of webgegevensextractie genoemd.
Dit artikel bespreekt de stappen die betrokken zijn bij webscrapen met behulp van de implementatie van een Web Scraping-framework van Python genaamd Beautiful Soup. Stappen die betrokken zijn bij webscrapen:
- Stuur een HTTP-verzoek naar de URL van de webpagina waartoe u toegang wilt krijgen. De server reageert op het verzoek door de HTML-inhoud van de webpagina terug te sturen. Voor deze taak zullen we een HTTP-bibliotheek van derden gebruiken voor Python-verzoeken.
- Zodra we toegang hebben gekregen tot de HTML-inhoud, hebben we de taak om de gegevens te parseren. Omdat de meeste HTML-gegevens genest zijn, kunnen we gegevens niet eenvoudigweg via tekenreeksverwerking extraheren. Men heeft een parser nodig die een geneste/boomstructuur van de HTML-gegevens kan creëren. Er zijn veel HTML-parserbibliotheken beschikbaar, maar de meest geavanceerde is html5lib.
- Het enige wat we nu hoeven te doen is navigeren en zoeken in de ontleedboom die we hebben gemaakt, d.w.z. boomtraversal. Voor deze taak zullen we een andere Python-bibliotheek van derden gebruiken, Mooie soep . Het is een Python-bibliotheek voor het ophalen van gegevens uit HTML- en XML-bestanden.
Stap 1: De vereiste bibliotheken van derden installeren
- De eenvoudigste manier om externe bibliotheken in Python te installeren is door pip te gebruiken. Pip is een pakketbeheersysteem dat wordt gebruikt voor het installeren en beheren van softwarepakketten die in Python zijn geschreven. Het enige wat u hoeft te doen is:
pip install requests pip install html5lib pip install bs4>
- Een andere manier is om ze handmatig te downloaden via deze links:
Stap 2: Toegang tot de HTML-inhoud vanaf de webpagina
Python
import> requests> URL>=> 'https:>/>/>www.techcodeview.com>/>data>->structures>/>'> r>=> requests.get(URL)> print>(r.content)> |
download autocad 2019 engels mediafire
>
>
Laten we proberen dit stukje code te begrijpen.
- Importeer eerst de verzoekenbibliotheek.
- Geef vervolgens de URL op van de webpagina die u wilt schrapen.
- Stuur een HTTP-verzoek naar de opgegeven URL en sla het antwoord van de server op in een antwoordobject met de naam r.
- Nu, als print r.content om de onbewerkte HTML-inhoud van de webpagina. Het is van het type ‘string’.
Let op: Soms krijg je mogelijk de foutmelding Niet geaccepteerd, dus probeer een browser-user-agent toe te voegen, zoals hieronder. Vind hier uw user-agent op basis van apparaat en browser https://deviceatlas.com/blog/list-of-user-agent-strings
Python3
headers>=> {>'User-Agent'>:>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'>}> # Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.> r>=> requests.get(url>=>URL, headers>=>headers)> print>(r.content)> |
>
>
Stap 3: Parseren van de HTML-inhoud
Python
#This will not run on online IDE> import> requests> from> bs4>import> BeautifulSoup> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)># If this line causes an error, run 'pip install html5lib' or install html5lib> print>(soup.prettify())> |
>
>
Het mooie van de BeautifulSoup-bibliotheek is dat deze bovenop de HTML-parseerbibliotheken zoals html5lib, lxml, html.parser, enz. is gebouwd. Dus het BeautifulSoup-object en de specificeer de parserbibliotheek kunnen tegelijkertijd worden gemaakt. In het bovenstaande voorbeeld
soup = BeautifulSoup(r.content, 'html5lib')>
We maken een BeautifulSoup-object door twee argumenten door te geven:
- r.content: Het is de onbewerkte HTML-inhoud. html5lib: Specificeert de HTML-parser die we willen gebruiken.
Nu soep.prettify() wordt afgedrukt, het geeft de visuele weergave van de ontleedboom die is gemaakt op basis van de onbewerkte HTML-inhoud. Stap 4: Zoeken en navigeren door de ontleedboom Nu willen we enkele nuttige gegevens uit de HTML-inhoud halen. Het soup-object bevat alle gegevens in de geneste structuur die programmatisch kunnen worden geëxtraheerd. In ons voorbeeld schrapen we een webpagina die uit enkele citaten bestaat. We willen dus graag een programma maken om die offertes (en alle relevante informatie daarover) op te slaan.
machinetaal
Python
#Python program to scrape website> #and save quotes from website> import> requests> from> bs4>import> BeautifulSoup> import> csv> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)> > quotes>=>[]># a list to store quotes> > table>=> soup.find(>'div'>, attrs>=> {>'id'>:>'all_quotes'>})> > for> row>in> table.findAll(>'div'>,> >attrs>=> {>'class'>:>'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'>}):> >quote>=> {}> >quote[>'theme'>]>=> row.h5.text> >quote[>'url'>]>=> row.a[>'href'>]> >quote[>'img'>]>=> row.img[>'src'>]> >quote[>'lines'>]>=> row.img[>'alt'>].split('>#')[0]> >quote[>'author'>]>=> row.img[>'alt'>].split('>#')[1]> >quotes.append(quote)> > filename>=> 'inspirational_quotes.csv'> with>open>(filename,>'w'>, newline>=>'') as f:> >w>=> csv.DictWriter(f,[>'theme'>,>'url'>,>'img'>,>'lines'>,>'author'>])> >w.writeheader()> >for> quote>in> quotes:> >w.writerow(quote)> |
>
>
Voordat we verder gaan, raden we je aan om door de HTML-inhoud van de webpagina te gaan die we hebben afgedrukt met de soup.prettify()-methode en te proberen een patroon of een manier te vinden om naar de aanhalingstekens te navigeren.
- Het valt op dat alle aanhalingstekens zich in een div-container bevinden waarvan de id ‘all_quotes’ is. We vinden dus dat div-element (in bovenstaande code tabel genoemd) met behulp van vinden() methode:
table = soup.find('div', attrs = {'id':'all_quotes'})> - Het eerste argument is de HTML-tag waarin u wilt zoeken en het tweede argument is een woordenboektype-element om de aanvullende attributen op te geven die aan die tag zijn gekoppeld. vinden() methode retourneert het eerste overeenkomende element. U kunt proberen af te drukken tabel.prettify() om een idee te krijgen van wat dit stukje code doet.
- Nu kun je in het tabelelement zien dat elke quote zich in een div-container bevindt waarvan de klasse quote is. We doorlopen dus elke div-container waarvan de klasse quote is. Hier gebruiken we de methode findAll() die qua argumenten vergelijkbaar is met de methode find, maar die een lijst met alle overeenkomende elementen retourneert. Elk citaat wordt nu herhaald met behulp van een variabele genaamd rij. Hier is een voorbeeld van HTML-inhoud in een rij voor een beter begrip:
Beschouw nu dit stukje code:
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): quote = {} quote['theme'] = row.h5.text quote['url'] = row.a['href'] quote['img'] = row.img['src'] quote['lines'] = row.img['alt'].split(' #')[0] quote['author'] = row.img['alt'].split(' #')[1] quotes.append(quote)> - We maken een woordenboek aan om alle informatie over een offerte op te slaan. De geneste structuur is toegankelijk via puntnotatie. Om toegang te krijgen tot de tekst in een HTML-element gebruiken we .tekst:
quote['theme'] = row.h5.text>
- We kunnen de kenmerken van een tag toevoegen, verwijderen, wijzigen en openen. Dit wordt gedaan door de tag als een woordenboek te behandelen:
quote['url'] = row.a['href']>
- Ten slotte worden alle citaten toegevoegd aan de genoemde lijst citaten.
- Ten slotte willen we al onze gegevens opslaan in een CSV-bestand.
filename = 'inspirational_quotes.csv' with open(filename, 'w', newline='') as f: w = csv.DictWriter(f,['theme','url','img','lines','author']) w.writeheader() for quote in quotes: w.writerow(quote)>
- Hier maken we een CSV-bestand met de naam inspirational_quotes.csv en slaan we alle citaten daarin op voor verder gebruik.
Dit was dus een eenvoudig voorbeeld van hoe je een webschraper in Python kunt maken. Vanaf hier kunt u proberen elke andere website van uw keuze te schrappen. Als u vragen heeft, kunt u deze hieronder in het opmerkingengedeelte plaatsen.
Opmerking : Webscrapen wordt in veel gevallen als illegaal beschouwd. Het kan er ook voor zorgen dat uw IP permanent wordt geblokkeerd door een website. Aan deze blog is bijgedragen door Nikhil Kumar .
Beschouw nu dit stukje code: