scrpae google maps da selenio
Controllare il browser Chrome con Selenium

Utilizzando Selenio nello scraping dei dati è una cosa abbastanza comune. Automatizza i browser e consente di simulare le attività reali degli utenti per evitare di essere bloccati. È particolarmente utile durante lo scraping di siti JavaScript generati dinamicamente, come Google. Inoltre, aiuta a evitare qualsiasi tipo di protezione da crawling, poiché simula sostanzialmente il comportamento dei clienti reali.

In questo articolo, vedrete un tutorial passo dopo passo per sviluppare uno scraper che sarà in grado di analizzare i luoghi da Google Maps senza essere bloccato anche dopo 1000+ pagine.

Cosa ci serve per costruire il crawler

  1. Python 3+.
  2. Browser Chrome installato.
  3. Selenium 3.141.0+ (pacchetto python).
  4. Chrome Driver (per il tuo sistema operativo).
  5. Parsel o qualsiasi altra libreria per estrarre dati da HTML come Beautiful Soup.

Tutorial passo dopo passo per costruire l'estrattore di Google Maps

Scaricare e salvare ChromeDriver

Per utilizzare Selenium con Google Chrome è necessario collegare il codice python al browser utilizzando ChromeDriver.

Scarica la versione di ChromeDriver che corrisponde alla versione del tuo browser e al tipo di sistema operativo. Il numero di versione del tuo browser Chrome può essere trovato qui: Chrom -> Icona del menu (in alto a destra) -> Aiuto -> Informazioni su Google Chrome.

Disarchivia il file chromedriver e salvalo da qualche parte sul tuo sistema (il percorso che useremo in seguito). In questo esempio di tutorial, salviamo il file nella cartella del progetto.

Installare i pacchetti Selenium e Parsel

Installate i pacchetti Selenium e Parsel eseguendo i seguenti comandi. Useremo Parsel più tardi quando analizzeremo il contenuto da HTML.

				
					pip installa selenium
pip installa parsel # per estrarre dati da HTML usando XPath o selettori CSS.
				
			

Inizializzare e avviare Webdriver

Prima di inizializzare Webdriver assicuratevi di aver fatto i passi precedenti e di avere il percorso del vostro file chromedriver. Inizializza il driver con il seguente codice. Dovresti vedere la nuova finestra di Chrome aprirsi.

				
					da selenio importare webdriver


chromedrive_path = './chromedriver' # usa il percorso del driver che hai scaricato dai passi precedenti
driver = webdriver.Chrome(chromedrive_path).
				
			

Su mac potresti vedere quanto segue: "chromedriver non può essere aperto perché lo sviluppatore non può essere verificato". Per ovviare a questo control-click sul chromedriver nel Finder, scegliete Open dal menu, e poi cliccate su Open nella finestra di dialogo che appare. Dovresti vedere "ChromeDriver è stato avviato con successo" nella finestra di terminale aperta. Chiudila e dopo questo, sarai in grado di avviare ChromeDriver dal tuo codice.

Scarica la pagina di Google Maps

Una volta avviato il driver, si è pronti ad aprire alcune pagine. Per aprire qualsiasi pagina, utilizzare il comando "get".

				
					url = 'https://www.google.com/maps/search/bars+near+NY,+USA/@40.7443439,-74.0197995,13z'
driver.get(url).
				
			

Analizzare il contenuto della ricerca delle mappe

Una volta che la vostra pagina è aperta vedrete la pagina nella finestra del vostro browser che è controllata dal vostro codice python. Puoi eseguire il seguente codice per ottenere il contenuto della pagina HTML da ChromeDriver.

				
					page_content = driver.page_source
				
			

Per vedere comodamente il contenuto HTML, aprite la console per sviluppatori in Chrome aprendo il menu di Chrome nell'angolo superiore destro della finestra del browser e selezionando Altri strumenti > Strumenti per sviluppatori. Ora dovreste essere in grado di vedere gli elementi della vostra pagina.

google maps analisi HTML
Trovare xpath agli elementi che vogliamo ottenere con la console dello sviluppatore

Puoi analizzare il contenuto della pagina HTML usando i tuoi strumenti di analisi preferiti. Noi useremo Parsel in questo tutorial.

				
					da parsel importa Selettore

response = Selettore(page_content).
				
			

Iterare sugli annunci e ottenere i dati di ogni luogo.

				
					risultati = []

per el in response.xpath('//div[contiene(@aria-label, "Risultati per")]/div/div[./a]'):
    results.append({
        'link': el.xpath('./a/@href').extract_first(''),
        'title': el.xpath('./a/@aria-label').extract_first('')
    })
    
print(risultati)
				
			

Output dai luoghi di Google Maps (abbreviato).

				
					[
  {
    'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
    'title': 'Black Iron Burger'
  },
  {
    'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
    'title': 'Fools Gold NYC'
  },
  {
    'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
    'title': '11th St. Bar'
  },
  ...
]
				
			

Fermare il driver una volta terminato il processo di estrazione

È importante avviare e fermare il driver prima e dopo il raschiamento di conseguenza. È la stessa cosa che fareste aprendo e chiudendo il vostro browser prima e dopo aver navigato in internet. Chiudete il driver eseguendo il seguente codice.

				
					driver.quit()
				
			

Conclusione e raccomandazioni per scalare e rendere lo scraper più robusto

Nonostante l'insidiosa struttura HTML di Google Maps, con Selenium e una buona conoscenza di XPath e dei selettori CSS, si possono ottenere ottimi risultati nello scraping. Questo metodo di utilizzo di un emulatore di browser dovrebbe proteggervi dal rischio di essere bloccati. Tuttavia, se avete intenzione di scalare la vostra applicazione, potreste prendere in considerazione l'utilizzo di proxy per evitare problemi imprevisti.

Esecuzione in parallelo

È possibile eseguire i driver in multiprocessing (non in multithreading) ma ogni driver consumerà una CPU. Assicuratevi di averne abbastanza.

Il modo definitivo di scraping di Google Maps su scala aziendale

Poiché lo scraping di Google potrebbe essere una bella sfida, molte aziende e grandi imprese vogliono iniziare a raschiare milioni di pagine senza spendere tempo per sviluppare e mantenere i propri crawler.

Il modo più semplice per iniziare con lo scraping di Google Maps è usare Piattaforma Outscraper (per ottenere risultati in file CSV), API, o SDKs (da integrare nel codice).

Il modo più semplice per iniziare con lo scraping di Google Maps

Installate l'SDK di Outscraper eseguendo il seguente comando.

				
					pip installa google-services-api
				
			

Inizializza il client e cerca gli annunci su Google o analizza quelli specifici inviando gli ID dei luoghi.

* si può ottenere il token API (SECRET_API_KEY) dal Pagina del profilo.

				
					da outscraper importare ApiClient

api_client = ApiClient(api_key='SECRET_API_KEY')

# Cerca le aziende in luoghi specifici:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Ottieni i dati del luogo specifico per id
risultato = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Ricerca con molte query (batching)
risultato = api_client.google_maps_search([
    'ristoranti brooklyn usa',
    'bar brooklyn usa',
], language='en')

print(risultato)
				
			

Risultato dell'uscita (abbreviato).

				
					[
  [
    {
      "nome": "Colonie",
      "indirizzo_completo": "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough": "Brooklyn Heights",
      "street": "127 Atlantic Ave",
      "città": "Brooklyn",
      "postal_code": "11201",
      "country_code": "US",
      "paese": "Stati Uniti d'America",
      "us_state": "New York",
      "stato": "New York",
      "plus_code": null,
      "latitudine": 40.6908464,
      "longitudine": -73.9958422,
      "fuso orario": "America/New_York",
      "popular_times": null,
      "site": "http://www.colonienyc.com/",
      "phone": "+1 718-855-7500",
      "tipo": "Ristorante americano",
      "categoria": "ristoranti",
      "sottotipi": "Ristorante americano, Cocktail bar, Ristorante italiano, Ristorante biologico, Ristorante, Wine bar",
      "posti": null
      "valutazione": 4.6,
      "recensioni": 666,
      "reviews_data": null,
      "foto_conteggio": 486,
      "google_id": "0x89c25a4590b8c863:0xc4a4271f166de1e2",
      "place_id": "ChIJY8i4kEVawokR4uFtFh8npMQ",
      "reviews_link": "https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=en&gl=US",
      "reviews_id": "-4277250731621359134",
      "photo": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
      "street_view": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
      "working_hours_old_format": "Lunedì: 5\u20139:30PM | Martedì: Chiuso | Mercoledì: Chiuso | Giovedì: 5:30PM | Venerdì: 5:30PM | Sabato: 11:00 e 17:30 | Domenica: 11:00 e 17:30",
      "Orario_di_lavoro": {
        "Lunedì": "5\u20139:30PM",
        "Martedì": "Chiuso",
        "Mercoledì": "Chiuso",
        "Giovedì": "5\u20139:30PM",
        "Venerdì": "5\u20139:30PM",
        "Sabato": "11AM\\u20133PM,5\\u20139:30PM",
        "Domenica": "11AM\\u20133PM,5\\u20139:30PM"
      },
      "stato_aziendale": "OPERATIVO",
      },
      "reserving_table_link": "https://resy.com/cities/ny/colonie",
      "booking_appointment_link": "https://resy.com/cities/ny/colonie",
      "owner_id": "114275131377272904229",
      "verificato": true,
      "owner_title": "Colonie",
      "owner_link": "https://www.google.com/maps/contrib/114275131377272904229",
      "location_link": "https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
      ...
    },
   ...
  ]
]
				
			

Extra: Il modo più semplice per iniziare con lo scraping delle recensioni di Google

Puoi estrarre le recensioni eseguendo il seguente codice (supponendo che tu abbia installato il pacchetto python e avviato il client).

				
					# Ottenere recensioni di un luogo specifico per id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Ottieni le recensioni per i luoghi trovati dalla query di ricerca
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Ottieni solo le nuove recensioni nelle ultime 24 ore
da datetime importa datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())

risultato = api_client.google_maps_reviews(
    'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='en')
				
			

Risultato dell'uscita (abbreviato).

				
					{
  "nome": "Memphis Seoul",
  "indirizzo": "569 Lincoln Pl, Brooklyn, NY 11238, \u0421\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0456 \u0428\u0442\u0430\u0442\u0438",
  "indirizzo_via": "569 Lincoln Pl",
  "owner_id": "100347822687163365487",
  "owner_link": "https://www.google.com/maps/contrib/100347822687163365487",
  ...
  "reviews_data": [
    {
      "google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link": "https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
      "autor_name": "Eliott Levy",
      "autor_id": "112314095435657473333",
      "review_text": "Ottimo cibo fusion di conforto locale! \\Insalata di kimchi! Che idea fantastica!",
      "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating": 5,
      "review_timestamp": 1560692128,
      "review_datetime_utc": "06/16/2019 13:35:28",
      "review_likes": null
    },
    {
      "google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link": "https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
      "autor_name": "fenwar1",
      "autor_id": "106144075337788507031",
      "review_text": "Ottime ali di pollo con diversi tipi di salsa piccante. Il ramen con maccheroni e formaggio è eccellente.\aggiornamento:\ritornato più tardi per provare il polpettone di carne, una spessa fetta di carne condita con insalata e una fantastica salsa- deliziosa. \\Consideratemi un cliente abituale,
      "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating": 5,
      "review_timestamp": 1571100055,
      "review_datetime_utc": "10/15/2019 00:40:55",
      "review_likes": null
    },
    ...
  ]
}
				
			
Categorie: Pyhton

Vlad

Responsabile del progetto Linkedin

ommenti

Lascia un commento

Segnaposto avatar