Introductie tot python-webschrapen en de Beautiful Soup-bibliotheek

  • Matthew Stevenson
  • 0
  • 1239
  • 26
>

Doelstelling

Leren hoe u informatie uit een html-pagina kunt extraheren met behulp van Python en de Beautiful Soup-bibliotheek.

Voorwaarden

  • Inzicht in de basisprincipes van python en objectgeoriënteerd programmeren

Conventies

  • # - vereist dat het gegeven linux-commando wordt uitgevoerd met root-privileges, hetzij direct als rootgebruiker, hetzij door gebruik te maken van sudo opdracht
  • $ - gegeven linux-commando dat moet worden uitgevoerd als een gewone niet-geprivilegieerde gebruiker

Invoering

Webscraping is een techniek die bestaat uit het extraheren van gegevens van een website met behulp van speciale software. In deze tutorial zullen we zien hoe je een eenvoudige webscraping uitvoert met Python en de Beautiful Soup-bibliotheek. We zullen gebruiken python3 gericht op de startpagina van Rotten Tomatoes, de beroemde verzamelaar van recensies en nieuws voor films en tv-shows, als een bron van informatie voor onze oefening.

Installatie van de Beautiful Soup-bibliotheek

Om onze scraping uit te voeren, zullen we gebruik maken van de Beautiful Soup python-bibliotheek, daarom is het eerste dat we moeten doen, deze te installeren. De bibliotheek is beschikbaar in de repositories van alle grote GNU \ Linux-distributies, daarom kunnen we deze installeren met onze favoriete pakketbeheerder of met Pip, de native manier van Python voor het installeren van pakketten.
Als het gebruik van de distributie pakketbeheerder de voorkeur heeft en we Fedora gebruiken:
$ sudo dnf installeer python3-beautifulsoup4
Op Debian en zijn afgeleiden wordt het pakket beautifulsoup4 genoemd:
$ sudo apt-get install beautifulsoup4
Op Archilinux kunnen we het installeren via pacman:
$ sudo pacman -S python-beatufilusoup4
Als we willen gebruiken Pip, in plaats daarvan kunnen we gewoon uitvoeren:
$ pip3 installeren --gebruiker BeautifulSoup4
Door de bovenstaande opdracht uit te voeren met de --gebruiker vlag, zullen we de nieuwste versie van de Beautiful Soup-bibliotheek alleen voor onze gebruiker installeren, daarom zijn er geen rootrechten nodig. Je kunt natuurlijk besluiten om pip te gebruiken om het pakket wereldwijd te installeren, maar persoonlijk geef ik de voorkeur aan installaties per gebruiker wanneer ik de distributie pakketbeheerder niet gebruik.

Het BeautifulSoup-object

Laten we beginnen: het eerste dat we willen doen, is een BeautifulSoup-object maken. De BeautifulSoup-constructor accepteert een draad of een bestandsingang als eerste argument. Dit laatste is wat ons interesseert: we hebben de url van de pagina die we willen schrapen, daarom zullen we de urlopen methode van de urllib.request bibliotheek (standaard geïnstalleerd): deze methode retourneert een bestandachtig object:
uit bs4 importeer BeautifulSoup uit urllib.request importeer urlopen met urlopen ('http://www.rottentomatoes.com') als homepage: soup = BeautifulSoup (homepage) 
Op dit punt is onze soep klaar: de soep object vertegenwoordigt het document in zijn geheel. We kunnen er doorheen navigeren en de gewenste gegevens extraheren met behulp van de ingebouwde methoden en eigenschappen. Stel dat we bijvoorbeeld alle links op de pagina willen extraheren: we weten dat links worden vertegenwoordigd door de een tag in html en de daadwerkelijke link bevindt zich in de href attribuut van de tag, zodat we de vind alle methode van het object dat we zojuist hebben gebouwd om onze taak te volbrengen:
voor link in soup.find_all ('a'): print (link.get ('href')) 
Door de vind alle methode en specificeren een als eerste argument, de naam van de tag, hebben we naar alle links op de pagina gezocht. Voor elke link hebben we vervolgens de waarde van de href attribuut. In BeautifulSoup worden de attributen van een element opgeslagen in een woordenboek, daarom is het heel eenvoudig om ze terug te vinden. In dit geval hebben we de krijgen methode, maar we hadden toegang kunnen krijgen tot de waarde van het href-attribuut, zelfs met de volgende syntaxis: link ['href']. Het volledige attributenwoordenboek zelf is opgenomen in het attrs eigenschap van het element. De bovenstaande code levert het volgende resultaat op:
[…] Https://editorial.rottentomatoes.com/ https://editorial.rottentomatoes.com/24-frames/ https://editorial.rottentomatoes.com/binge-guide/ https://editorial.rottentomatoes.com / box-office-guru / https://editorial.rottentomatoes.com/critics-consensus/ https://editorial.rottentomatoes.com/five-favorite-films/ https://editorial.rottentomatoes.com/now-streaming / https://editorial.rottentomatoes.com/parental-guidance/ https://editorial.rottentomatoes.com/red-carpet-roundup/ https://editorial.rottentomatoes.com/rt-on-dvd/ https: / /editorial.rottentomatoes.com/the-simpsons-decade/ https://editorial.rottentomatoes.com/sub-cult/ https://editorial.rottentomatoes.com/tech-talk/ https://editorial.rottentomatoes.com / total-recall / [...] 
De lijst is veel langer: het bovenstaande is slechts een uittreksel van de uitvoer, maar geeft u een idee. De vind alle methode geeft alles terug Label objecten die overeenkomen met het opgegeven filter. In ons geval hebben we zojuist de naam gespecificeerd van de tag die overeen moet komen, en geen andere criteria, dus alle links worden geretourneerd: we zullen straks zien hoe we onze zoekopdracht verder kunnen beperken.

Een testcase: alle "Top box office" -titels ophalen

Laten we een meer beperkt schrapen uitvoeren. Stel dat we alle titels van de films willen ophalen die in de "Top Box Office" -sectie van de Rotten Tomatoes-startpagina verschijnen. Het eerste dat we willen doen, is de pagina-html voor die sectie analyseren: hierdoor kunnen we zien dat het element dat we nodig hebben zich allemaal in een tafel element met de "Top-Box-Office" ID kaart:
Top Box Office We kunnen ook zien dat elke rij van de tafel informatie over een film bevat: de partituren van de titel zijn als tekst in een span element met klasse 'tMeterScore' in de eerste cel van de rij, terwijl de tekenreeks die de titel van de film vertegenwoordigt, in de tweede cel staat, als de tekst van de een label. Ten slotte bevat de laatste cel een link met de tekst die de kaskrakers van de film weergeeft. Met die referenties kunnen we gemakkelijk alle gegevens ophalen die we willen:
uit bs4 importeer BeautifulSoup uit urllib.request importeer urlopen met urlopen ('https://www.rottentomatoes.com') als homepage: soup = BeautifulSoup (homepage.read (), 'html.parser') # eerst gebruiken we de find methode om de tabel op te halen met 'Top-Box-Office' id top_box_office_table = soup.find ('table', 'id': 'Top-Box-Office') # dan herhalen we elke rij en extraheren we filminformatie voor rij in top_box_office_table.find_all ('tr'): cells = row.find_all ('td') title = cells [1] .find ('a'). get_text () money = cells [2] .find ('a' ) .get_text () score = row.find ('span', 'class': 'tMeterScore'). get_text () print ('0 - 1 (TomatoMeter: 2)'. format (titel, geld, score)) 
De bovenstaande code levert het volgende resultaat op:
Crazy Rich Aziaten - $ 24,9 miljoen (TomatoMeter: 93%) The Meg - $ 12,9 miljoen (TomatoMeter: 46%) The Happytime Murders - $ 9,6 miljoen (TomatoMeter: 22%) Mission: Impossible - Fallout - $ 8,2 miljoen (TomatoMeter: 97%) Mijl 22 - $ 6,5 miljoen (TomatoMeter: 20%) Christopher Robin - $ 6,4 miljoen (TomatoMeter: 70%) Alpha - $ 6,1 miljoen (TomatoMeter: 83%) BlacKkKlansman - $ 5,2 miljoen (TomatoMeter: 95%) Slank Man - $ 2,9 miljoen (TomatoMeter: 7%) AXL - $ 2,8 miljoen (TomatoMeter: 29%) 
We hebben een paar nieuwe elementen geïntroduceerd, laten we ze eens bekijken. Het eerste dat we hebben gedaan, is het ophalen van het tafel met 'Top-Box-Office'-id, met behulp van de vind methode. Deze methode werkt op dezelfde manier als vind alle, maar terwijl de laatste een lijst retourneert die de gevonden overeenkomsten bevat, of leeg is als er geen correspondentie is, geeft de eerste altijd het eerste resultaat of Geen als een element met de opgegeven criteria niet wordt gevonden.
Het eerste element dat aan de vind methode is in dit geval de naam van de tag waarmee bij de zoekopdracht rekening moet worden gehouden tafel. Als tweede argument hebben we een woordenboek doorgegeven waarin elke sleutel een attribuut van de tag vertegenwoordigt met de bijbehorende waarde. De sleutel / waarde-paren die in het woordenboek worden opgegeven, vertegenwoordigen de criteria waaraan moet worden voldaan voordat onze zoekopdracht een overeenkomst oplevert. In dit geval hebben we gezocht naar de ID kaart attribuut met de waarde "Top-Box-Office". Merk op dat sinds elk ID kaart moet uniek zijn in een html-pagina, we hadden gewoon de tagnaam kunnen weglaten en deze alternatieve syntaxis kunnen gebruiken:
top_box_office_table = soup.find (id = 'Top-Box-Office') 
Zodra we onze tafel hadden opgehaald Label object, gebruikten we de vind alle methode om alle rijen te vinden en ze te herhalen. Om de andere elementen terug te vinden, hebben we dezelfde principes gebruikt. We hebben ook een nieuwe methode gebruikt, get_text: het retourneert alleen het tekstgedeelte in een tag, of, als er geen is opgegeven, op de hele pagina. Als u bijvoorbeeld weet dat het filmscorepercentage wordt weergegeven door de tekst in het span element met de tMeterScore klasse, gebruikten we de get_text methode op het element om het op te halen.
In dit voorbeeld hebben we zojuist de opgehaalde gegevens weergegeven met een zeer eenvoudige opmaak, maar in een real-world scenario wilden we misschien verdere manipulaties uitvoeren of deze in een database opslaan.

Conclusies

In deze tutorial hebben we zojuist de oppervlakte bekrast van wat we kunnen doen met behulp van python en Beautiful Soup-bibliotheek om webschrapen uit te voeren. De bibliotheek bevat veel methoden die u kunt gebruiken voor een meer verfijnde zoekopdracht of om beter door de pagina te navigeren: hiervoor raad ik ten zeerste aan om de zeer goed geschreven officiële documenten te raadplegen.



Niemand heeft nog op dit artikel gereageerd.

Een verzameling nuttige informatie over het Linux-besturingssysteem en nieuwe technologieën
Nieuwe artikelen, praktische tips, gedetailleerde recensies en handleidingen. Voel je thuis in de wereld van het Linux-besturingssysteem