En Python-billedskraber er ikke kun et værktøj til at skærpe dine programmeringsevner. Du kan også bruge det til at hente billeder til et maskinlæringsprojekt eller generere webstedsminiaturebilleder. Selvom der kan være andre måder at gøre lignende ting på, kan intet slå den kontrol, du har ved at bruge værktøjer, du selv bygger.
Lær, hvordan du skraber billeder fra ethvert websted ved hjælp af Python og BeautifulSoup-biblioteket.
Er billedskrabning lovligt?
Synes godt om mere generaliseret web-skrabning, er billedskrabning en metode til at downloade webstedsindhold. Det er ikke ulovligt, men der er nogle regler og bedste praksis, du bør følge. For det første bør du undgå at skrabe en hjemmeside, hvis der udtrykkeligt står, at den ikke vil have dig til. Det kan du finde ud af ved at lede efter en /robots.txt fil på målstedet.
De fleste websteder tillader webcrawling, fordi de ønsker, at søgemaskinerne skal indeksere deres indhold. Du kan skrabe sådanne websteder, da deres billeder er offentligt tilgængelige.
Men bare fordi du kan downloade et billede, betyder det ikke, at du kan bruge det, som om det var dit eget. De fleste websteder licenserer deres billeder for at forhindre dig i at genudgive dem eller genbruge dem på andre måder. Antag altid, at du ikke kan genbruge billeder, medmindre der er en specifik undtagelse.
Python-pakkeopsætning
Du skal installere et par pakker, før du begynder. Hvis du ikke har Python installeret på din computer, skal du besøge den officielle python.org websted for at downloade og installere den seneste version.
Åbn derefter din terminal til din projektmappe og aktivere et virtuelt Python-miljø at isolere dine afhængigheder.
Til sidst skal du installere anmodninger og Smuk suppe pakker ved hjælp af pip:
pip installation bs4 anmodninger
Billedskrabning med Python
Til denne billedskrabningsvejledning skal du bruge anmodninger bibliotek for at hente en webside, der indeholder målbillederne. Du sender derefter svaret fra det pågældende websted til Smuk suppe at hente alle billedlinkadresser fra img tags. Du vil derefter skrive hver billedfil i en mappe for at downloade billederne.
Sådan hentes billed-URL'er med Pythons BeautifulSoup
Gå nu videre og opret en Python-fil i din projektrodmappe. Sørg for, at du tilføjer .py udvidelse til filnavnet.
Hvert kodestykke i denne øvelse fortsætter fra den forrige.
Åbn Python-filen med nogen god kode editor og brug følgende kode til at anmode om en webside:
importere anmodninger
URL = "imagesiteURL" # Erstat dette med webstedets URL
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
print (getURL.status_code)
Hvis ovenstående program udsender en 200 svarkode, blev anmodningen vellykket. Ellers vil du måske sikre dig, at din netværksforbindelse er stabil. Sørg også for, at du har angivet en gyldig URL.
Brug nu Smuk suppe at læse indholdet af websiden ved hjælp af html_parser:
fra bs4 importere Smuk suppe
suppe = Smuk suppe (getURL.text, 'html.parser')
billeder = soup.find_all('img')
print (billeder)
Denne kode opretter en liste over objekter, der hver repræsenterer et billede fra websiden. Men hvad du har brug for fra disse data er teksten til hvert billede src attribut.
At udtrække kilden fra hver img tag:
billedkilder = []
til billede i billeder:
imageSources.append (image.get('src'))
print (billedkilder)
Kør din kode igen, og billedadresserne skulle nu vises på en ny liste (billedkilder). Du har udtrukket hver billedkilde fra målwebsiden.
Sådan gemmer du billederne med Python
Først skal du oprette en downloaddestinationsmappe i dit projekts rodmappe og navngive den billeder.
For at Python kan downloade billederne, skal deres stier være fulde absolutte URL'er. Med andre ord skal de inkludere " http://" eller " https://" præfiks plus hele webstedets domæne. Hvis websiden refererer til sine billeder ved hjælp af relative URL'er, skal du konvertere dem til absolutte URL'er.
I det nemme tilfælde, når URL'en er absolut, er initiering af download blot et tilfælde af at anmode om hvert billede fra de tidligere udtrukne kilder:
til billede i billedkilder:
webs = requests.get (billede)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)
Det image.split('/')[-1] nøgleordet opdeler billedlinket ved hver fremadgående skråstreg (/). Derefter henter den billedfilnavnet (inklusive enhver udvidelse) fra det sidste element.
Husk, at billedfilnavne i sjældne tilfælde kan kollidere, hvilket resulterer i overskrivning af download. Du er velkommen til at udforske løsninger på dette problem som en udvidelse til dette eksempel.
Absolutte URL'er kan blive ret komplicerede, med masser af kantsager at dække. Heldigvis er der en nyttig metode i requests.compat pakke kaldet urljoin. Denne metode returnerer en fuld URL givet en basis-URL og en URL, som kan være relativ. Det giver dig mulighed for at løse værdier, du finder i href og src egenskaber.
Den endelige kode ser sådan ud:
fra bs4 importere Smuk suppe
URL = "imagesiteURL" # Erstat dette med webstedets URL
getURL = requests.get (URL, headers={"User-Agent":"Mozilla/5.0"})
suppe = Smuk suppe (getURL.text, 'html.parser')billeder = soup.find_all('img')
løste URL'er = []til billede i billeder:
src = image.get('src')
resolvedURLs.append (requests.compat.urljoin (URL, src))
til billede i løste URL'er:
webs = requests.get (billede)
open('images/' + image.split('/')[-1], 'wb').write (webs.content)
Mangler aldrig billeddata
Mange billedgenkendelsesprojekter rammer en murstensvæg på grund af en utilstrækkelig mængde billeder til at træne en model. Men du kan altid skrabe billeder fra websteder for at booste dit datalager. Og heldigvis er Python en kraftfuld billedskraber, du kan bruge kontinuerligt uden frygt for at blive prissat.
Hvis du er interesseret i at hente andre typer data fra nettet, vil du måske finde ud af, hvordan du bruger Python til generel web-scraping.