Esempio di Scraper con Python e Request-HTML

In questo articolo vedremo come creare un semplice scraper che ci permetterà di estrarre i alcuni date da un sito web/portale per la ricerca di attività commerciali in base alla località ed a uno o più termini di ricerca.

Per effettuare la nostra estrazione andremo ad utilizzare la libreria Requests-HTML, una versione riadattata e più Human Friendly della storica libreria Requests (è possibile installarla con pip usando il comando: pip install requests-html).

Andiamo ad importare le librerie che ci servono:

from requests_html import HTMLSession 
import argparse

Per rendere il nostro script più interattivo abbiamo importato anche la libreria argparse, che ci permette di impostare i nostri parametri di ricerca.

Andiamo quindi ad impostare i parametri di argparse:

parser = argparse.ArgumentParser(description="Simple Yellow Pages data scraper")
parser.add_argument("search_term", type=str, help="Search Term")
parser.add_argument("location_term", type=str, help="Geo Location Term")
args = parser.parse_args()

Andiamo ad inserire il nostro punto di ingresso, che sarà da mettere al fondo del nostro script:

if __name__ == "__main__":    
scrape(args.search_term, args.location_term)

Come potete vedere viene chiamata la funzione scrape che richiede due parametri: uno rappresenta il nostro/i termine/i di ricerca e l’altro indica la posizione geografica di dove effettuare la ricerca.

Ci sono molti siti che funzionano in base a questi due semplici parametri come ad esempio le pagine bianche, per il nostro esempio andremo a vedere la versione inglese delle pagine gialle (yellow pages).

Proviamo a cercare una pizzeria a New York ed andiamo a vedere l’url che viene prodotto dal sito nella pagina dei risultati:

 
https://www.yellowpages.com/search?search_terms= pizza + &geo_location_terms=New+York

Possiamo facilmente immaginare che cambiando questi due termini possiamo ottenere diversi risultati, questo ci permette di creare la nostra funzione scrape():

def scrape(search_term, location_term):    
session = HTMLSession()
pages = session.get('https://www.yellowpages.com/search?search_terms='+search_term+'&geo_location_terms='+location_term)

for page in pages.html:
try:
organic_results = page.find('.organic', first=True)
results = organic_results.find('.result')
for result in results:
business_name = result.find('.business-name')
address = result.find('.adr')
print(f'Business Name: {business_name[0].text}')
print(f'Street Address: {address[0].text}')
print(f'\n')
except:
print('No more results.')
return

La libreria Requests-HTML ha una interessante funzione di paginazione (Requests_HTML Pagination) che ci permette di scorrere facilmente le pagine di risultati con una semplice riga di codice:

for page in pages.html: 

Successivamente andiamo semplicemente ad individuare con la funzione find() gli elementi che ci interessano utilizzando gli identificatori CSS, in questo specifico caso andiamo ad individuare l’elendo dei risultati (‘.result’) ed al loro interno andiamo ad estrarre il nome dell’attività (‘.business-name’) e l’indirizzo (‘.adr’).

Abbiamo così creato un semplice crawler che scorre l’elenco dei risultati per estrarre i dati che ci interessano.

Di seguito riporto il codice completo ed il link per poterlo scaricare da GitHub:

from requests_html
import HTMLSessionimport argparse
parser = argparse.ArgumentParser(description="Simple Yellow Pages data scraper")
parser.add_argument("search_term", type=str, help="Search Term")
parser.add_argument("location_term", type=str, help="Geo Location Term")
args = parser.parse_args()

def scrape(search_term, location_term):
session = HTMLSession()
pages = session.get('https://www.yellowpages.com/search?search_terms='+search_term+'&geo_location_terms='+location_term)
for page in pages.html:
try:
organic_results = page.find('.organic', first=True)
results = organic_results.find('.result') for
result in results:
business_name = result.find('.business-name')
address = result.find('.adr')
print(f'Business Name: {business_name[0].text}')
print(f'Street Address: {address[0].text}')
print(f'\n')
except:
print('No more results.')
return

if __name__ == "__main__":
scrape(args.search_term, args.location_term)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *