En Python-bildeskraper er ikke bare et verktøy for å skjerpe programmeringsferdighetene dine. Du kan også bruke den til å hente bilder for et maskinlæringsprosjekt, eller generere nettstedsminiatyrbilder. Selv om det kan være andre måter å gjøre lignende ting på, kan ingenting slå kontrollen du har ved å bruke verktøy du bygger selv.
Lær hvordan du skraper bilder fra et hvilket som helst nettsted ved å bruke Python og BeautifulSoup-biblioteket.
Er bildeskraping lovlig?
Som mer generalisert nettskraping, er bildeskraping en metode for å laste ned nettstedinnhold. Det er ikke ulovlig, men det er noen regler og beste praksis du bør følge. For det første bør du unngå å skrape et nettsted hvis det uttrykkelig står at det ikke vil at du skal gjøre det. Dette finner du ut ved å se etter en /robots.txt fil på målnettstedet.
De fleste nettsteder tillater nettgjennomgang fordi de vil at søkemotorer skal indeksere innholdet deres. Du kan skrape slike nettsteder siden bildene deres er offentlig tilgjengelige.
Men bare fordi du kan laste ned et bilde, betyr det ikke at du kan bruke det som om det var ditt eget. De fleste nettsteder lisensierer bildene sine for å hindre deg i å publisere dem på nytt eller gjenbruke dem på andre måter. Anta alltid at du ikke kan gjenbruke bilder med mindre det er et spesifikt unntak.
Python-pakkeoppsett
Du må installere noen pakker før du begynner. Hvis du ikke har Python installert på datamaskinen din, besøk den offisielle python.org nettsted for å laste ned og installere den nyeste versjonen.
Deretter åpner du terminalen til prosjektmappen din og aktivere et virtuelt Python-miljø å isolere dine avhengigheter.
Til slutt, installer forespørsler og Vakker suppe pakker som bruker pip:
pip install bs4 forespørsler
Bildeskraping med Python
For denne opplæringen for bildeskraping skal du bruke forespørsler bibliotek for å hente en nettside som inneholder målbildene. Du sender deretter svaret fra det nettstedet til Vakker suppe å hente alle bildelenkeadresser fra img tagger. Du vil deretter skrive hver bildefil inn i en mappe for å laste ned bildene.
Slik henter du bildenettadresser med Pythons BeautifulSoup
Gå nå videre og lag en Python-fil i prosjektets rotmapp. Sørg for at du legger til .py utvidelse til filnavnet.
Hver kodebit i denne opplæringen fortsetter fra den forrige.
Åpne Python-filen med noen god kode editor og bruk følgende kode for å be om en nettside:
import forespørsler
URL = "imagesiteURL" # Erstatt dette med nettstedets URL
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
print (getURL.status_code)
Hvis programmet ovenfor sender ut en 200 svarkode, var forespørselen vellykket. Ellers vil du kanskje sørge for at nettverkstilkoblingen er stabil. Sørg også for at du har oppgitt en gyldig URL.
Bruk nå Vakker suppe å lese innholdet på nettsiden ved hjelp av html_parser:
fra bs4 import Vakker suppe
suppe = BeautifulSoup (getURL.text, 'html.parser')
bilder = soup.find_all('img')
print (bilder)
Denne koden lager en liste over objekter, som hver representerer et bilde fra nettsiden. Det du trenger fra disse dataene er imidlertid teksten til hvert bilde src Egenskap.
For å trekke ut kilden fra hver img stikkord:
bildekilder = []
til bilde i Bilder:
imageSources.append (image.get('src'))
print (bildekilder)
Kjør koden på nytt, og bildeadressene skal nå vises i en ny liste (bildekilder). Du har trukket ut hver bildekilde fra målnettsiden.
Hvordan lagre bildene med Python
Opprett først en nedlastingsdestinasjonsmappe i prosjektets rotkatalog og navngi den Bilder.
For at Python skal kunne laste ned bildene, må banene deres være fullstendige absolutte URL-er. Med andre ord må de inkludere " http://" eller " https://" prefiks, pluss hele domenet til nettstedet. Hvis nettsiden refererer til bildene ved hjelp av relative URL-er, må du konvertere dem til absolutte URL-er.
I det enkle tilfellet, når URL-en er absolutt, er initiering av nedlastingen bare et tilfelle av å be om hvert bilde fra de tidligere utpakkede kildene:
til bilde i bildekilder:
webs = requests.get (bilde)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)
De image.split('/')[-1] nøkkelord deler bildelenken ved hver skråstrek (/). Deretter henter den bildefilnavnet (inkludert eventuell utvidelse) fra det siste elementet.
Husk at i sjeldne tilfeller kan bildefilnavn kollidere, noe som resulterer i at nedlastingen overskrives. Utforsk gjerne løsninger på dette problemet som en utvidelse av dette eksemplet.
Absolutte nettadresser kan bli ganske kompliserte, med mange kantsaker å dekke. Heldigvis er det en nyttig metode i requests.compat pakken kalt urljoin. Denne metoden returnerer en fullstendig URL, gitt en basis-URL og en URL som kan være relativ. Den lar deg løse verdier du finner i href og src egenskaper.
Den endelige koden ser slik ut:
fra bs4 import Vakker suppe
URL = "imagesiteURL" # Erstatt dette med nettstedets URL
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
suppe = BeautifulSoup (getURL.text, 'html.parser')bilder = soup.find_all('img')
løste URLer = []til bilde i Bilder:
src = image.get('src')
resolvedURLs.append (requests.compat.urljoin (URL, src))
til bilde i løste nettadresser:
webs = requests.get (bilde)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)
Gå aldri mangel på bildedata
Mange bildegjenkjenningsprosjekter treffer en murvegg på grunn av en utilstrekkelig mengde bilder for å trene en modell. Men du kan alltid skrape bilder fra nettsteder for å øke datalageret ditt. Og heldigvis er Python en kraftig bildeskraper du kan bruke kontinuerlig uten frykt for å bli priset ut.
Hvis du er interessert i å hente andre typer data fra nettet, vil du kanskje finne ut hvordan du bruker Python til generell nettskraping.