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)> |
abstraksjon i java
>
>
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).
java 8
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: