Implementering av nettskraping i Python med BeautifulSoup
Det er hovedsakelig to måter å trekke ut data fra et nettsted:
- Bruk API-en til nettstedet (hvis det finnes). For eksempel har Facebook Facebook Graph API som tillater henting av data som er lagt ut på Facebook.
- Få tilgang til HTML-en til nettsiden og trekk ut nyttig informasjon/data fra den. Denne teknikken kalles nettskraping eller netthøsting eller utvinning av nettdata.
Denne artikkelen diskuterer trinnene som er involvert i nettskraping ved å bruke implementeringen av et nettskraping-rammeverk av Python kalt Beautiful Soup. Trinn involvert i nettskraping:
- Send en HTTP-forespørsel til URL-en til nettsiden du vil ha tilgang til. Serveren svarer på forespørselen ved å returnere HTML-innholdet på nettsiden. For denne oppgaven vil vi bruke et tredjeparts HTTP-bibliotek for python-forespørsler.
- Når vi har fått tilgang til HTML-innholdet, står vi igjen med oppgaven med å analysere dataene. Siden de fleste HTML-dataene er nestet, kan vi ikke trekke ut data bare gjennom strengbehandling. Man trenger en parser som kan lage en nestet/trestruktur av HTML-dataene. Det er mange HTML-parserbiblioteker tilgjengelig, men det mest avanserte er html5lib.
- Nå er alt vi trenger å gjøre å navigere og søke i analysetreet som vi opprettet, dvs. tregjennomgang. For denne oppgaven vil vi bruke et annet tredjeparts python-bibliotek, Vakker suppe . Det er et Python-bibliotek for å trekke data ut av HTML- og XML-filer.
Trinn 1: Installere de nødvendige tredjepartsbibliotekene
- Den enkleste måten å installere eksterne biblioteker i python er å bruke pip. pip er et pakkehåndteringssystem som brukes til å installere og administrere programvarepakker skrevet i Python. Alt du trenger å gjøre er:
pip install requests pip install html5lib pip install bs4
- En annen måte er å laste dem ned manuelt fra disse koblingene:
Trinn 2: Få tilgang til HTML-innholdet fra nettsiden
Python
import> requests> URL> => 'https:> /> /> www.techcodeview.com> /> data> -> structures> /> '> r> => requests.get(URL)> print> (r.content)> |
La oss prøve å forstå denne kodebiten.
- Importer først forespørselsbiblioteket.
- Deretter spesifiser URL-en til nettsiden du vil skrape.
- Send en HTTP-forespørsel til den angitte URL-en og lagre svaret fra serveren i et svarobjekt kalt r.
- Nå, som print r.content for å få rå HTML-innhold av nettsiden. Den er av typen 'streng'.
Merk: Noen ganger kan du få feilmeldingen Ikke akseptert, så prøv å legge til en nettleserbrukeragent som nedenfor. Finn brukeragenten din basert på enhet og nettleser 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)> |
Trinn 3: Parsing av HTML-innholdet
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 veldig fin ting med BeautifulSoup-biblioteket er at det er bygget på toppen av HTML-parsing-bibliotekene som html5lib, lxml, html.parser, etc. Så BeautifulSoup-objektet og spesifiser parserbiblioteket kan opprettes samtidig. I eksemplet ovenfor,
soup = BeautifulSoup(r.content, 'html5lib')
Vi lager et BeautifulSoup-objekt ved å sende to argumenter:
- r.content : Det er det rå HTML-innholdet. html5lib : Spesifiserer HTML-parseren vi ønsker å bruke.
Nå soup.prettify() er trykt, det gir den visuelle representasjonen av analysetreet som er opprettet fra det rå HTML-innholdet. Trinn 4: Søke og navigere gjennom analysetreet Nå ønsker vi å trekke ut noen nyttige data fra HTML-innholdet. Suppeobjektet inneholder alle dataene i den nestede strukturen som kan trekkes ut programmatisk. I vårt eksempel skraper vi en nettside som består av noen sitater. Så vi ønsker å lage et program for å lagre disse sitatene (og all relevant informasjon om dem).
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 deg å gå gjennom HTML-innholdet på nettsiden som vi skrev ut ved hjelp av soup.prettify()-metoden og prøve å finne et mønster eller en måte å navigere til sitatene på.
- Det legges merke til at alle sitatene er inne i en div-beholder hvis id er 'all_quotes'. Så vi finner at div-elementet (kalt som tabell i koden ovenfor) ved å bruke finne() metode:
table = soup.find('div', attrs = {'id':'all_quotes'}) - Det første argumentet er HTML-koden du vil søke i, og det andre argumentet er et element av ordboktype for å spesifisere tilleggsattributtene som er knyttet til den taggen. finne() metoden returnerer det første samsvarende elementet. Du kan prøve å skrive ut table.prettify() for å få en følelse av hva denne kodebiten gjør.
- Nå, i tabellelementet, kan man legge merke til at hvert sitat er inne i en div-beholder hvis klasse er sitat. Så vi itererer gjennom hver div-beholder hvis klasse er anførselstegn. Her bruker vi findAll()-metoden som ligner på finnemetoden når det gjelder argumenter, men den returnerer en liste over alle samsvarende elementer. Hvert sitat er nå iterert ved å bruke en variabel kalt rad. Her er én eksempelrad HTML-innhold for bedre forståelse:
Tenk nå på denne kodebiten:
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 lager en ordbok for å lagre all informasjon om et tilbud. Den nestede strukturen kan nås ved hjelp av punktnotasjon. For å få tilgang til teksten inne i et HTML-element bruker vi .tekst:
quote['theme'] = row.h5.text
- Vi kan legge til, fjerne, endre og få tilgang til en tags attributter. Dette gjøres ved å behandle taggen som en ordbok:
quote['url'] = row.a['href']
- Til slutt er alle sitatene lagt til listen kalt sitater.
- Til slutt ønsker vi å lagre alle dataene våre i en 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 lager vi en CSV-fil kalt inspirational_quotes.csv og lagrer alle sitatene i den for videre bruk.
Så dette var et enkelt eksempel på hvordan du lager en nettskraper i Python. Herfra kan du prøve å skrote et hvilket som helst annet nettsted du ønsker. I tilfelle spørsmål, legg dem inn nedenfor i kommentarfeltet.
Merk : Nettskraping anses i mange tilfeller som ulovlig. Det kan også føre til at IP-en din blokkeres permanent av et nettsted. Denne bloggen er bidratt av Nikhil Kumar .
Tenk nå på denne kodebiten: