Esistono principalmente due modi per estrarre dati da un sito web:
- Utilizza l'API del sito web (se esiste). Ad esempio, Facebook ha l'API Facebook Graph che consente il recupero dei dati pubblicati su Facebook.
- Accedi all'HTML della pagina web ed estrai da essa informazioni/dati utili. Questa tecnica è chiamata web scraping o web Harvesting o estrazione di dati web.
Questo articolo discute i passaggi coinvolti nel web scraping utilizzando l'implementazione di un framework Web Scraping di Python chiamato Beautiful Soup. Passaggi coinvolti nel web scraping:
- Invia una richiesta HTTP all'URL della pagina web a cui desideri accedere. Il server risponde alla richiesta restituendo il contenuto HTML della pagina web. Per questa attività utilizzeremo una libreria HTTP di terze parti per le richieste Python.
- Una volta effettuato l'accesso al contenuto HTML, ci resta il compito di analizzare i dati. Poiché la maggior parte dei dati HTML sono nidificati, non possiamo estrarre i dati semplicemente tramite l'elaborazione delle stringhe. È necessario un parser in grado di creare una struttura nidificata/ad albero dei dati HTML. Sono disponibili molte librerie di parser HTML, ma la più avanzata è html5lib.
- Ora, tutto ciò che dobbiamo fare è navigare e cercare nell'albero di analisi che abbiamo creato, ovvero l'attraversamento dell'albero. Per questo compito utilizzeremo un'altra libreria Python di terze parti, Bella zuppa . È una libreria Python per estrarre dati da file HTML e XML.
Passaggio 1: installazione delle librerie di terze parti richieste
- Il modo più semplice per installare librerie esterne in Python è utilizzare pip. pip è un sistema di gestione dei pacchetti utilizzato per installare e gestire pacchetti software scritti in Python. Tutto quello che devi fare è:
pip install requests pip install html5lib pip install bs4>
- Un altro modo è scaricarli manualmente da questi collegamenti:
Passaggio 2: accesso al contenuto HTML dalla pagina Web
Pitone
import> requests> URL>=> 'https:>/>/>www.techcodeview.com>/>data>->structures>/>'> r>=> requests.get(URL)> print>(r.content)> |
>
>
Cerchiamo di capire questo pezzo di codice.
- Prima di tutto importa la libreria delle richieste.
- Quindi, specifica l'URL della pagina web che desideri raschiare.
- Invia una richiesta HTTP all'URL specificato e salva la risposta dal server in un oggetto di risposta chiamato r.
- Ora, come print r.content per ottenere il file contenuto HTML grezzo della pagina web. È di tipo 'stringa'.
Nota: a volte potresti ricevere l'errore Non accettato, quindi prova ad aggiungere un agente utente del browser come di seguito. Trova il tuo user agent in base al dispositivo e al browser da qui 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)> |
>
>
Passaggio 3: analisi del contenuto HTML
Pitone
#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())> |
>
>
Una cosa davvero bella della libreria BeautifulSoup è che è costruita sopra le librerie di parser HTML come html5lib, lxml, html.parser, ecc. Quindi è possibile creare contemporaneamente l'oggetto BeautifulSoup e specificare la libreria parser. Nell'esempio sopra,
soup = BeautifulSoup(r.content, 'html5lib')>
Creiamo un oggetto BeautifulSoup passando due argomenti:
programma Java
- r.content: è il contenuto HTML grezzo. html5lib: specifica del parser HTML che vogliamo utilizzare.
Ora zuppa.prettify() è stampato, fornisce la rappresentazione visiva dell'albero di analisi creato dal contenuto HTML grezzo. Passaggio 4: ricerca e navigazione nell'albero di analisi Ora vorremmo estrarre alcuni dati utili dal contenuto HTML. L'oggetto soup contiene tutti i dati nella struttura annidata che potrebbero essere estratti a livello di codice. Nel nostro esempio, stiamo raschiando una pagina web composta da alcune virgolette. Quindi, vorremmo creare un programma per salvare quelle citazioni (e tutte le informazioni rilevanti su di esse).
Pitone
#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)> |
>
>
Prima di proseguire, ti consigliamo di esaminare il contenuto HTML della pagina web che abbiamo stampato utilizzando il metodo soup.prettify() e provare a trovare uno schema o un modo per navigare tra virgolette.
- Si nota che tutte le virgolette sono all'interno di un contenitore div il cui ID è 'all_quotes'. Quindi, troviamo l'elemento div (definito tabella nel codice precedente) utilizzando Trovare() metodo :
table = soup.find('div', attrs = {'id':'all_quotes'})> - Il primo argomento è il tag HTML che desideri cercare e il secondo argomento è un elemento di tipo dizionario per specificare gli attributi aggiuntivi associati a quel tag. Trovare() Il metodo restituisce il primo elemento corrispondente. Puoi provare a stampare tabella.prettify() per avere un'idea di cosa fa questo pezzo di codice.
- Ora, nell'elemento table, si può notare che ogni quota è all'interno di un contenitore div la cui classe è quote. Quindi, iteriamo attraverso ogni contenitore div la cui classe è quote. Qui utilizziamo il metodo findAll() che è simile al metodo find in termini di argomenti ma restituisce un elenco di tutti gli elementi corrispondenti. Ogni citazione viene ora ripetuta utilizzando una variabile chiamata riga. Ecco un esempio di contenuto HTML della riga per una migliore comprensione:
Consideriamo ora questo pezzo di codice:
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)> - Creiamo un dizionario per salvare tutte le informazioni su un preventivo. È possibile accedere alla struttura nidificata utilizzando la notazione punto. Per accedere al testo all'interno di un elemento HTML, utilizziamo .testo :
quote['theme'] = row.h5.text>
- Possiamo aggiungere, rimuovere, modificare e accedere agli attributi di un tag. Questo viene fatto trattando il tag come un dizionario:
quote['url'] = row.a['href']>
- Infine, tutte le virgolette vengono aggiunte all'elenco richiamato citazioni.
- Infine, vorremmo salvare tutti i nostri dati in un file CSV.
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)>
- Qui creiamo un file CSV chiamato inspirational_quotes.csv e salviamo tutte le citazioni in esso contenute per qualsiasi ulteriore utilizzo.
Quindi, questo era un semplice esempio di come creare un web scraper in Python. Da qui, puoi provare a eliminare qualsiasi altro sito web di tua scelta. In caso di domande, pubblicale di seguito nella sezione commenti.
Nota : Il Web Scraping è considerato illegale in molti casi. Potrebbe anche causare il blocco permanente del tuo IP da parte di un sito web. Questo blog è stato contribuito da Nikhil Kumar .
Consideriamo ora questo pezzo di codice: