Een Python-afbeeldingsschraper is niet alleen een hulpmiddel om uw programmeervaardigheden aan te scherpen. U kunt het ook gebruiken om afbeeldingen te zoeken voor een machine learning-project of om siteminiaturen te genereren. Hoewel er misschien andere manieren zijn om soortgelijke dingen te doen, kan niets de controle overtreffen die je hebt met behulp van tools die je zelf bouwt.

Leer hoe u afbeeldingen van elke website kunt schrapen met Python en de BeautifulSoup-bibliotheek.

Is beeldschrapen legaal?

Graag willen meer algemene webscraping, beeldschrapen is een methode voor het downloaden van website-inhoud. Het is niet illegaal, maar er zijn enkele regels en best practices die u moet volgen. Ten eerste moet u voorkomen dat u een website scrapt als deze expliciet aangeeft dat u dat niet wilt. U kunt dit vinden door te zoeken naar een /robots.txt bestand op de doelsite.

De meeste websites staan ​​webcrawling toe omdat ze willen dat zoekmachines hun inhoud indexeren. U kunt dergelijke websites schrapen omdat hun afbeeldingen openbaar beschikbaar zijn.

instagram viewer

Het is echter niet omdat u een afbeelding kunt downloaden dat u deze kunt gebruiken alsof het uw eigen afbeelding is. De meeste websites licentiëren hun afbeeldingen om te voorkomen dat u ze opnieuw publiceert of op andere manieren hergebruikt. Ga er altijd vanuit dat je afbeeldingen niet kunt hergebruiken, tenzij er een specifieke vrijstelling is.

Python-pakket instellen

U moet een paar pakketten installeren voordat u begint. Als je Python niet op je computer hebt geïnstalleerd, bezoek dan de officiële python.org website om de nieuwste versie te downloaden en te installeren.

Open vervolgens uw terminal naar uw projectmap en een virtuele Python-omgeving activeren om uw afhankelijkheden te isoleren.

Installeer tot slot de verzoeken en MooiSoep pakketten met pip:

pip install bs4 verzoeken

Afbeelding schrapen met Python

Voor deze zelfstudie over het schrapen van afbeeldingen, gebruik je de verzoeken bibliotheek om een ​​webpagina op te halen die de doelafbeeldingen bevat. U geeft dan de reactie van die website door aan: MooiSoep om alle adressen van de afbeeldingslinks te pakken: img labels. Vervolgens schrijft u elk afbeeldingsbestand naar een map om de afbeeldingen te downloaden.

Afbeeldings-URL's ophalen met BeautifulSoup van Python

Ga nu door en maak een Python-bestand in de hoofdmap van uw project. Zorg ervoor dat u de toevoegt .py extensie van de bestandsnaam.

Elk codefragment in deze zelfstudie gaat verder met het vorige.

Open het Python-bestand met elke goede code-editor en gebruik de volgende code om een ​​webpagina aan te vragen:

importeren verzoeken
URL = "imagesiteURL" # Vervang dit door de URL van de website
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
afdrukken (getURL.status_code)

Als het bovenstaande programma een 200-antwoordcode uitvoert, was het verzoek succesvol. Anders wilt u er misschien voor zorgen dat uw netwerkverbinding stabiel is. Zorg er ook voor dat u een geldige URL heeft opgegeven.

Gebruik nu MooiSoep om de inhoud van de webpagina te lezen met behulp van de html_parser:

van bs4 importeren MooiSoep

soup = BeautifulSoup (getURL.text, 'html.parser')

afbeeldingen = soup.find_all('img')
afdrukken (afbeeldingen)

Deze code creëert een lijst met objecten, die elk een afbeelding van de webpagina vertegenwoordigen. Wat u echter van deze gegevens nodig hebt, is de tekst van elke afbeelding src attribuut.

Om de bron uit elk te halen img label:

afbeeldingsbronnen = []

voor afbeelding in afbeeldingen:
imageSources.append (image.get('src'))

afdrukken (beeldbronnen)

Voer uw code opnieuw uit en de afbeeldingsadressen zouden nu in een nieuwe lijst moeten verschijnen (beeldbronnen). U hebt elke afbeeldingsbron met succes uit de doelwebpagina gehaald.

Hoe de afbeeldingen op te slaan met Python

Maak eerst een downloadbestemmingsmap in de hoofdmap van uw project en noem deze afbeeldingen.

Om Python de afbeeldingen met succes te laten downloaden, moeten hun paden volledige absolute URL's zijn. Met andere woorden, ze moeten de " http://" of " https://" prefix, plus het volledige domein van de website. Als de webpagina naar zijn afbeeldingen verwijst met behulp van relatieve URL's, moet u deze converteren naar absolute URL's.

In het gemakkelijke geval, wanneer de URL absoluut is, is het starten van de download gewoon een kwestie van elke afbeelding opvragen van de eerder geëxtraheerde bronnen:

voor afbeelding in beeldbronnen:
webs = requests.get (afbeelding)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)

De afbeelding.split('/')[-1] trefwoord splitst de afbeeldingslink bij elke schuine streep (/). Vervolgens haalt het de naam van het afbeeldingsbestand (inclusief eventuele extensies) op van het laatste element.

Houd er rekening mee dat in zeldzame gevallen afbeeldingsbestandsnamen kunnen botsen, wat kan leiden tot overschrijvingen van downloads. Voel je vrij om oplossingen voor dit probleem te verkennen als een uitbreiding op dit voorbeeld.

Absolute URL's kunnen behoorlijk ingewikkeld worden, met veel randgevallen om te dekken. Gelukkig is er een handige methode in de verzoeken.compat pakket genaamd urljoin. Deze methode retourneert een volledige URL, gegeven een basis-URL en een URL die relatief kan zijn. Hiermee kunt u waarden oplossen die u aantreft in href en src attributen.

De uiteindelijke code ziet er als volgt uit:

van bs4 importeren MooiSoep
URL = "imagesiteURL" # Vervang dit door de URL van de website
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup (getURL.text, 'html.parser')

afbeeldingen = soup.find_all('img')
opgeloste URL's = []

voor afbeelding in afbeeldingen:
src = afbeelding.get('src')
opgelostURLs.append (requests.compat.urljoin (URL, src))

voor afbeelding in opgeloste URL's:
webs = requests.get (afbeelding)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)

Kom nooit te kort aan beeldgegevens

Veel beeldherkenningsprojecten lopen tegen een muur aan vanwege een ontoereikend aantal afbeeldingen om een ​​model te trainen. Maar u kunt altijd afbeeldingen van websites schrapen om uw gegevensopslag een boost te geven. En gelukkig is Python een krachtige beeldschraper die je continu kunt gebruiken zonder bang te zijn dat je wordt geprijsd.

Als u geïnteresseerd bent in het ophalen van andere soorten gegevens van internet, wilt u misschien weten hoe u Python kunt gebruiken voor algemeen webschrapen.