Guida al web scraping con Python usando Beautiful Soup

Pubblicato: 2020-06-23
Mostra il sommario
Introduzione al web scraping con Python:
Come funziona BeautifulSoup?
Come raschiare i dati dalle pagine Web utilizzando BeautifulSoup?
Processo di raschiamento web:
Conclusione:

Introduzione al web scraping con Python:

Quando si tratta di web scraping, alcuni linguaggi di programmazione sono preferiti rispetto ad altri. Uno dei più popolari tra questi è Python. Oltre ad essere una delle lingue più facili da imparare grazie alla sua curva di apprendimento più dolce, ha anche il vantaggio di essere una lingua con un enorme supporto per gli sviluppatori, che ha portato a numerosi pacchetti di terze parti. Questi pacchetti possono essere utilizzati per più funzionalità, che possono essere difficili da eseguire con Python di base. Alcuni esempi comuni sono: per l'elaborazione di immagini o la visione artificiale, utilizziamo OpenCV, per l'apprendimento automatico, utilizziamo TensorFlow e per tracciare grafici, utilizziamo MatplotLib. Quando si tratta di web scraping, una delle librerie più utilizzate è BeautifulSoup. Questa libreria non estrae in modo specifico i dati da Internet, ma nel caso in cui sia possibile ottenere il file HTML di una pagina Web, può aiutare a estrarre punti dati specifici da esso. In generale, la libreria viene utilizzata per estrarre punti dati da documenti XML e HTML.

Come funziona BeautifulSoup?

Prima di continuare a scrivere codice in Python, devi capire come funziona BeautifulSoup. Dopo aver estratto il contenuto HTML di una pagina Web e averlo archiviato in una variabile, ad esempio html_obj, puoi convertirlo in un oggetto BeautifulSoup con una sola riga di codice-

soup_obj = BeautifulSoup(html_obj, 'html.parser')

Dove html_obj sono i dati HTML, soup_obj è l'oggetto bs che è stato ottenuto e “html.parser” è il parser utilizzato per eseguire la conversione. Una volta che hai l'oggetto bs, chiamato soup_obj, attraversarlo è molto semplice e, poiché attraversarlo è abbastanza semplice, anche l'estrazione dei dati diventa semplice. Facciamo un esempio. Supponiamo che tu debba recuperare un punto dati chiamato titolo del prodotto, che è presente in ogni pagina di un sito Web di eCommerce. Ora hai scaricato una singola pagina di prodotto HTML da quel sito Web e ti sei reso conto che ogni pagina ha il nome del prodotto menzionato su un elemento di tipo span avente id come productTitle. Quindi, come recupererai questi dati da diciamo 1000 pagine di prodotto? Bene, otterrai i dati HTML per ogni pagina e recupererai il punto dati in questo modo-

for span in soup.findAll('span', attrs={'id': 'productTitle'}):
nome_del_prodotto = spans.text.strip()

Sebbene questo sia un modo per ottenere dati testuali presenti tra un determinato elemento di tag, puoi anche recuperare i dati dagli attributi di un tag.

Raschiamento web

Come raschiare i dati dalle pagine Web utilizzando BeautifulSoup?

Ora che abbiamo una comprensione di base di come viene attraversato un oggetto bs, andiamo a scrivere del codice e vediamo come funziona. Usando lo snippet di codice qui sotto, puoi racimolare i dati da Zillow, un mercato immobiliare leader con sede fuori dagli Stati Uniti molto facilmente. Puoi eseguire questo codice e inserire l'URL di un elenco per ottenere i dati di output in un formato JSON. Capiamo il codice, riga per riga. Per prima cosa, assicurati di avere Python 3.7 o versioni successive installato sulla tua macchina. Usa pip per installare BeautifulSoup. Tutti gli altri pacchetti vengono forniti in bundle con Python, quindi non sarà necessario installarne nessuno. Una volta terminato, installa un editor di codice come Atom o VS Code e sei pronto per partire. Comprendere il codice è importante e quindi inizieremo dalla prima riga. Sono necessarie le quattro istruzioni di importazione per funzionalità specifiche. Successivamente, hai tre righe che iniziano con "ctx". Questi sono specifici per ignorare gli errori del certificato SSL che potresti incontrare quando accedi ai siti Web tramite il tuo codice. Successivamente, prendiamo l'URL del sito Web come input dell'utente. Qui puoi anche codificare l'URL o persino avere una matrice di più URL.

Processo di raschiamento web:

Successivamente, accediamo alla pagina web utilizzando la funzione Richiedi di urllib. Assicurati di aggiungere lo User-Agent nell'intestazione per far credere al sito web che stai utilizzando un browser. Il motivo alla base di ciò è che i siti Web sono pensati per essere accessibili dai browser e non dal codice, e quindi potrebbero bloccare il tuo IP se ti catturano. Fatto ciò, abbiamo completato tutti i passaggi di base e successivamente convertiremo l'oggetto HTML in un oggetto bs, quindi lo abbelliremo nel formato utf-8, per gestire caratteri e simboli speciali nella pagina web. Fatto ciò, estraiamo il titolo, i dettagli brevi e altre proprietà analizzando l'oggetto bs. Come puoi vedere, nel tag script con attributo type = application/ld+json, ci sono più punti dati tutti archiviati in un formato JSON. Inoltre, puoi vedere che utilizziamo un controllo i==0 e i==1. Questo perché ci sono due tag script (con lo stesso attributo) come questo in una pagina. Il primo tag ci fornisce alcuni punti dati, mentre il secondo fornisce il resto. Dopo aver estratto tutti i punti dati, puoi archiviarlo in un file JSON e salvarlo come abbiamo. Puoi anche salvarlo, caricarlo su un sito o persino colpire un'API con i dati, se lo desideri.

importa json
importazione ssl
da urllib.request import Request, urlopen
da bs4 importa BeautifulSoup

# Ignora gli errori del certificato SSL
ctx = ssl.create_default_context()
ctx.check_hostname = Falso
ctx.verify_mode = ssl.CERT_NONE

# Prendi l'URL dell'elenco Zillow come input
url = input('Enter Zillow House Listing Url- ')

# Fai credere al sito web che stai usando un browser
req = Richiesta(url, headers={'User-Agent': 'Mozilla/5.0'})
pagina web = urlopen(req).read()

# Pagina HTML -> BeautifulSoup Object soup = BeautifulSoup(pagina web, 'html.parser')
html = zuppa.pretify('utf-8')
property_details = {'dettagli_lungo': {}, 'indirizzo': {}}

# Estrarre diversi punti dati dell'elenco delle proprietà
per il titolo in soup.findAll('title'):
property_details['Titolo'] = title.text.strip()
rompere

for meta in soup.findAll('meta', attrs={'name': 'description'}):
property_details['details_short'] = meta['content'].strip()

for div in soup.findAll('div', attrs={'class': 'character-count-troncato'}):
property_details['details_long']['Description'] = div.text.strip()

for (i, script) in enumerate(soup.findAll('script',
attrs={'tipo': 'applicazione/ld+json'})):
se io == 0:
json_data = json.loads(script.text)
property_details['details_long']['no_of_rooms'] = json_data['numberOfRooms']
property_details['details_long']['floor_size_in_sqrft'] = json_data['floorSize']['value']
property_details['address']['street'] = json_data['address']['streetAddress']
property_details['address']['locality'] = json_data['address']['addressLocality']
property_details['address']['region'] = json_data['address']['addressRegion']
property_details['address']['postal_code'] = json_data['address']['postalCode']
se io == 1:
json_data = json.loads(script.text)
property_details['price_in_dollars'] = json_data['offers']['price']
property_details['inage'] = json_data['image']
rompere

con open('house_listing_data.json', 'w') come outfile:
json.dump(property_details, outfile, indent=4)

con open('house_listing_data.html', 'wb') come file:
file.scrivi(html)

print('———-L'estrazione dei dati è completa. Controlla il file json.———-')

L'output JSON dovrebbe assomigliare in qualche modo a questo-

{
"dettagli_lungo": {
“n_di_stanze”: 3,
“dimensione_piano_in_mq”: “1.392”
},
"indirizzo": {
“via”: “22516 Joan Dr”,
“località”: “California”,
“regione”: “MD”,
“codice_postale”: “20619”
},
“Titolo”: “22516 Joan Dr, California, MD 20619 | MLS #MDSM167670”,
“details_short”: “22516 Joan Dr , California, MD 20619-3175 è una casa unifamiliare in vendita a $ 150.000. La casa di 1.392 piedi quadrati è una proprietà con 3 letti e 2 bagni. Trova 40 foto della casa di Joan Dr 22516 su Zillow. Visualizza più dettagli sulla proprietà, cronologia delle vendite e dati Zestimate su Zillow. MLS # MDSM167670”,
“prezzo_in_dollari”: 150000,
“inage”: “https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg”
}

Conclusione:

L'uso di BeautifulSoup per le tue esigenze di raschiamento del web può essere facile purché tu possa analizzare le pagine HTML manualmente all'inizio e decidere i tag che devono essere presi di mira. Può funzionare su pagine che non hanno alcun contenuto dinamico e non si trovano dietro una pagina di accesso. Per pagine Web più complesse, avrai bisogno di strumenti più complessi. Il nostro team di PromptCloud aiuta le aziende che stanno cercando di sfruttare i dati e prendere decisioni basate sui dati. Non solo aiutiamo a configurare motori di scraping web completamente automatizzati che vengono eseguiti a intervalli frequenti sul cloud, ma aiutiamo anche le aziende ad analizzare i dati per estrarre tendenze e altre informazioni utili.