En Python-bildskrapa är inte bara ett verktyg för att skärpa dina programmeringsfärdigheter. Du kan också använda den för att hämta bilder för ett maskininlärningsprojekt eller generera webbplatsminiatyrer. Även om det kan finnas andra sätt att göra liknande saker, kan ingenting slå kontrollen du har med hjälp av verktyg du bygger själv.
Lär dig hur du skrapar bilder från vilken webbplats som helst med Python och BeautifulSoup-biblioteket.
Är bildskrapning lagligt?
Tycka om mer generaliserad webbskrapning, är bildskrapning en metod för att ladda ner webbplatsinnehåll. Det är inte olagligt, men det finns några regler och bästa praxis du bör följa. För det första bör du undvika att skrapa en webbplats om den uttryckligen anger att den inte vill att du ska göra det. Du kan ta reda på detta genom att leta efter en /robots.txt filen på målplatsen.
De flesta webbplatser tillåter webbgenomsökning eftersom de vill att sökmotorer ska indexera deras innehåll. Du kan skrapa sådana webbplatser eftersom deras bilder är allmänt tillgängliga.
Men bara för att du kan ladda ner en bild betyder det inte att du kan använda den som om den vore din egen. De flesta webbplatser licensierar sina bilder för att hindra dig från att återpublicera dem eller återanvända dem på andra sätt. Utgå alltid från att du inte kan återanvända bilder om det inte finns ett specifikt undantag.
Python-paketuppsättning
Du måste installera några paket innan du börjar. Om du inte har Python installerat på din dator, besök den officiella python.org webbplats för att ladda ner och installera den senaste versionen.
Öppna sedan din terminal till din projektmapp och aktivera en virtuell Python-miljö att isolera dina beroenden.
Slutligen, installera förfrågningar och Vacker soppa paket med pip:
pip installation bs4 förfrågningar
Bildskrapning Med Python
För den här självstudien för bildskrapning kommer du att använda förfrågningar bibliotek för att hämta en webbsida som innehåller målbilderna. Du skickar sedan svaret från den webbplatsen till Vacker soppa att ta alla bildlänkadresser från img taggar. Du kommer sedan att skriva varje bildfil i en mapp för att ladda ner bilderna.
Hur man hämtar bildadresser med Pythons BeautifulSoup
Gå nu vidare och skapa en Python-fil i din projektrotmapp. Se till att du lägger till .py filnamnstillägg.
Varje kodavsnitt i denna handledning fortsätter från den föregående.
Öppna Python-filen med någon bra kodredigerare och använd följande kod för att begära en webbsida:
importera förfrågningar
URL = "imagesiteURL" # Ersätt detta med webbplatsens URL
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
print (getURL.status_code)
Om ovanstående program matar ut en 200 svarskod, lyckades begäran. Annars kanske du vill se till att din nätverksanslutning är stabil. Se också till att du har angett en giltig URL.
Använd nu Vacker soppa att läsa innehållet på webbsidan med hjälp av html_parser:
från bs4 importera Vacker soppa
soup = BeautifulSoup (getURL.text, 'html.parser')
bilder = soup.find_all('img')
skriva ut (bilder)
Den här koden skapar en lista med objekt som vart och ett representerar en bild från webbsidan. Men vad du behöver från dessa data är texten för varje bild src attribut.
För att extrahera källan från varje img märka:
bildkällor = []
för bild i bilder:
imageSources.append (image.get('src'))
print (bildkällor)
Kör din kod igen och bildadresserna ska nu visas i en ny lista (bildkällor). Du har extraherat varje bildkälla från målwebbsidan.
Hur man sparar bilderna med Python
Skapa först en destinationsmapp för nedladdning i projektets rotkatalog och namnge den bilder.
För att Python ska kunna ladda ner bilderna måste deras sökvägar vara fullständiga absoluta webbadresser. Med andra ord måste de inkludera " http://" eller " https://" prefix, plus hela webbplatsens domän. Om webbsidan refererar till sina bilder med hjälp av relativa webbadresser, måste du konvertera dem till absoluta webbadresser.
I det enkla fallet, när webbadressen är absolut, är initiering av nedladdningen bara ett fall av att begära varje bild från de tidigare extraherade källorna:
för bild i bildkällor:
webbs = requests.get (bild)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)
De image.split('/')[-1] nyckelord delar bildlänken vid varje snedstreck framåt (/). Sedan hämtar den bildfilens namn (inklusive eventuella tillägg) från det sista elementet.
Tänk på att i sällsynta fall kan bildfilnamn kollidera, vilket resulterar i att nedladdningar skrivs över. Utforska gärna lösningar på detta problem som en förlängning av detta exempel.
Absoluta webbadresser kan bli ganska komplicerade, med många kantfall att täcka. Lyckligtvis finns det en användbar metod i requests.compat paketet kallas urljoin. Denna metod returnerar en fullständig URL, givet en bas-URL och en URL som kan vara relativ. Det låter dig lösa värden du hittar i href och src attribut.
Den slutliga koden ser ut så här:
från bs4 importera Vacker soppa
URL = "imagesiteURL" # Ersätt detta med webbplatsens URL
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup (getURL.text, 'html.parser')bilder = soup.find_all('img')
lösta webbadresser = []för bild i bilder:
src = image.get('src')
resolvedURLs.append (requests.compat.urljoin (URL, src))
för bild i lösta webbadresser:
webbs = requests.get (bild)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)
Får aldrig bilddata
Många bildigenkänningsprojekt träffar en tegelvägg på grund av en otillräcklig mängd bilder för att träna en modell. Men du kan alltid skrapa bilder från webbplatser för att förbättra ditt dataförråd. Och tack och lov är Python en kraftfull bildskrapa som du kan använda kontinuerligt utan rädsla för att bli prissatt.
Om du är intresserad av att hämta andra typer av data från webben, kanske du vill ta reda på hur du använder Python för allmän webbskrapning.