Der er hovedsageligt to måder at udtrække data fra et websted på:
- Brug hjemmesidens API (hvis den findes). For eksempel har Facebook Facebook Graph API, som tillader genfinding af data, der er lagt ud på Facebook.
- Få adgang til websidens HTML og udtræk nyttig information/data fra den. Denne teknik kaldes web-skrabning eller web-høstning eller webdataekstraktion.
Denne artikel diskuterer de trin, der er involveret i web-skrabning ved hjælp af implementeringen af en Web Scraping-ramme af Python kaldet Beautiful Soup. Trin involveret i web-skrabning:
- Send en HTTP-anmodning til URL'en på den webside, du vil have adgang til. Serveren svarer på anmodningen ved at returnere HTML-indholdet på websiden. Til denne opgave vil vi bruge et tredjeparts HTTP-bibliotek til python-anmodninger.
- Når vi har tilgået HTML-indholdet, står vi tilbage med opgaven med at parse dataene. Da de fleste HTML-data er indlejret, kan vi ikke udtrække data blot gennem strengbehandling. Man har brug for en parser, som kan skabe en indlejret/træstruktur af HTML-dataene. Der er mange HTML-parserbiblioteker tilgængelige, men det mest avancerede er html5lib.
- Alt, hvad vi skal gøre, er at navigere og søge i parse-træet, som vi oprettede, dvs. Til denne opgave vil vi bruge et andet tredjeparts python-bibliotek, Smuk suppe . Det er et Python-bibliotek til at trække data ud af HTML- og XML-filer.
Trin 1: Installation af de nødvendige tredjepartsbiblioteker
- Den nemmeste måde at installere eksterne biblioteker i python er at bruge pip. pip er et pakkehåndteringssystem, der bruges til at installere og administrere softwarepakker skrevet i Python. Alt du skal gøre er:
pip install requests pip install html5lib pip install bs4>
- En anden måde er at downloade dem manuelt fra disse links:
Trin 2: Adgang til HTML-indholdet fra websiden
Python
import> requests> URL>=> 'https:>/>/>www.techcodeview.com>/>data>->structures>/>'> r>=> requests.get(URL)> print>(r.content)> |
abstraktion i java
>
>
Lad os prøve at forstå dette stykke kode.
- Først og fremmest importer anmodningsbiblioteket.
- Angiv derefter URL'en på den webside, du vil skrabe.
- Send en HTTP-anmodning til den angivne URL og gem svaret fra serveren i et svarobjekt kaldet r.
- Nu, som print r.indhold for at få rå HTML-indhold af websiden. Det er af 'streng'-typen.
Bemærk: Nogle gange kan du få fejlmeddelelsen Ikke accepteret, så prøv at tilføje en browserbrugeragent som nedenfor. Find din brugeragent baseret på enhed og browser herfra https://deviceatlas.com/blog/list-of-user-agent-strings
Python3
headers>=> {>'User-Agent'>:>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'>}> # Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.> r>=> requests.get(url>=>URL, headers>=>headers)> print>(r.content)> |
>
>
Trin 3: Parsing af HTML-indholdet
Python
#This will not run on online IDE> import> requests> from> bs4>import> BeautifulSoup> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)># If this line causes an error, run 'pip install html5lib' or install html5lib> print>(soup.prettify())> |
>
>
En rigtig fin ting ved BeautifulSoup-biblioteket er, at det er bygget på toppen af HTML-parsing-bibliotekerne som html5lib, lxml, html.parser osv. Så BeautifulSoup objekt og specificer parser-biblioteket kan oprettes på samme tid. I eksemplet ovenfor,
soup = BeautifulSoup(r.content, 'html5lib')>
Vi opretter et BeautifulSoup-objekt ved at sende to argumenter:
- r.content : Det er det rå HTML-indhold. html5lib : Angivelse af den HTML-parser, vi ønsker at bruge.
Nu soup.prettify() er trykt, det giver den visuelle repræsentation af parsetræet, der er oprettet ud fra det rå HTML-indhold. Trin 4: Søgning og navigering gennem parsetræet Nu vil vi gerne udtrække nogle nyttige data fra HTML-indholdet. Suppeobjektet indeholder alle data i den indlejrede struktur, som kan udtrækkes programmatisk. I vores eksempel skraber vi en webside, der består af nogle citater. Så vi vil gerne oprette et program til at gemme disse citater (og alle relevante oplysninger om dem).
css grænse
Python
#Python program to scrape website> #and save quotes from website> import> requests> from> bs4>import> BeautifulSoup> import> csv> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)> > quotes>=>[]># a list to store quotes> > table>=> soup.find(>'div'>, attrs>=> {>'id'>:>'all_quotes'>})> > for> row>in> table.findAll(>'div'>,> >attrs>=> {>'class'>:>'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'>}):> >quote>=> {}> >quote[>'theme'>]>=> row.h5.text> >quote[>'url'>]>=> row.a[>'href'>]> >quote[>'img'>]>=> row.img[>'src'>]> >quote[>'lines'>]>=> row.img[>'alt'>].split('>#')[0]> >quote[>'author'>]>=> row.img[>'alt'>].split('>#')[1]> >quotes.append(quote)> > filename>=> 'inspirational_quotes.csv'> with>open>(filename,>'w'>, newline>=>'') as f:> >w>=> csv.DictWriter(f,[>'theme'>,>'url'>,>'img'>,>'lines'>,>'author'>])> >w.writeheader()> >for> quote>in> quotes:> >w.writerow(quote)> |
>
>
Før du går videre, anbefaler vi, at du går gennem HTML-indholdet på den webside, som vi udskrev ved hjælp af soup.prettify()-metoden og forsøger at finde et mønster eller en måde at navigere til citaterne på.
- Det bemærkes, at alle citater er inde i en div-beholder, hvis id er 'all_quotes'. Så vi finder, at div-elementet (kaldet som tabel i ovenstående kode) ved hjælp af Find() metode:
table = soup.find('div', attrs = {'id':'all_quotes'})> - Det første argument er det HTML-tag, du vil søge efter, og det andet argument er et ordbogstypeelement til at specificere de yderligere attributter, der er knyttet til dette tag. Find() metode returnerer det første matchende element. Du kan prøve at udskrive table.prettify() for at få en fornemmelse af, hvad dette stykke kode gør.
- Nu, i tabelelementet, kan man bemærke, at hvert citat er inde i en div-beholder, hvis klasse er citat. Så vi itererer gennem hver div-beholder, hvis klasse er citat. Her bruger vi findAll()-metoden, som ligner find-metoden med hensyn til argumenter, men den returnerer en liste over alle matchende elementer. Hvert citat gentages nu ved hjælp af en variabel kaldet række. Her er en eksempelrække af HTML-indhold for bedre forståelse:
Overvej nu dette stykke kode:
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): quote = {} quote['theme'] = row.h5.text quote['url'] = row.a['href'] quote['img'] = row.img['src'] quote['lines'] = row.img['alt'].split(' #')[0] quote['author'] = row.img['alt'].split(' #')[1] quotes.append(quote)> - Vi opretter en ordbog for at gemme alle oplysninger om et tilbud. Den indlejrede struktur kan tilgås ved hjælp af punktnotation. For at få adgang til teksten inde i et HTML-element bruger vi .tekst:
quote['theme'] = row.h5.text>
- Vi kan tilføje, fjerne, ændre og få adgang til et tags attributter. Dette gøres ved at behandle tagget som en ordbog:
quote['url'] = row.a['href']>
- Til sidst er alle citaterne tilføjet til listen kaldet citater.
- Til sidst vil vi gerne gemme alle vores data i en eller anden CSV-fil.
filename = 'inspirational_quotes.csv' with open(filename, 'w', newline='') as f: w = csv.DictWriter(f,['theme','url','img','lines','author']) w.writeheader() for quote in quotes: w.writerow(quote)>
- Her opretter vi en CSV-fil kaldet inspirational_quotes.csv og gemmer alle citater i den til videre brug.
Så dette var et simpelt eksempel på, hvordan man opretter en webskraber i Python. Herfra kan du prøve at skrotte enhver anden hjemmeside efter eget valg. I tilfælde af spørgsmål, skriv dem nedenfor i kommentarfeltet.
Bemærk : Webskrabning anses i mange tilfælde for at være ulovligt. Det kan også forårsage, at din IP bliver blokeret permanent af et websted. Denne blog er bidraget af Nikhil Kumar .
Overvej nu dette stykke kode: