sprawdzanie map google przez selen
Sterowanie przeglądarką Chrome za pomocą Selenium

Korzystanie z witryny Selen in data scraping is quite a common thing. It automates browsers and allows you to simulate real user activities to avoid getting blocked. It is specially helpful while scraping JavaScript dynamically generated sites like Google. Moreover, it helps to avoid any kind of crawling protection as it basically simulates real clients' behavior.

W tym artykule zobaczysz krok po kroku, jak stworzyć scrapera, który będzie w stanie pobierać miejsca z Map Google bez blokowania się nawet po 1000+ stronach.

Co będzie nam potrzebne do zbudowania gąsienicy

  1. Python 3+.
  2. Zainstalowana przeglądarka Chrome.
  3. Selenium 3.141.0+ (pakiet python).
  4. Sterownik Chrome (dla Twojego systemu operacyjnego).
  5. Parsel lub dowolna inna biblioteka do wyodrębniania danych z HTML jak Beautiful Soup.

Samouczek krok po kroku, jak zbudować program do wyodrębniania map Google

Pobierz i zapisz ChromeDriver

Aby używać Selenium z Google Chrome, należy połączyć kod Pythona z przeglądarką za pomocą ChromeDriver.

Pobierz wersję ChromeDriver pasującą do Twojej wersji przeglądarki i typu systemu operacyjnego. Numer wersji Twojej przeglądarki Chrome można znaleźć tutaj: Chrom -> Ikona menu (prawy górny róg) -> Pomoc -> O Google Chrome.

Odarchiwizuj plik chromedriver i zapisz go gdzieś w systemie (ścieżka do niego będzie używana później). W tym przykładzie zapisujemy plik w folderze projektu.

Zainstaluj pakiety Selenium i Parsel

Zainstaluj pakiety Selenium i Parsel wykonując następujące polecenia. Parsela użyjemy później, gdy będziemy parsować treść z HTML.

				
					pip install selenium
pip install parsel # do ekstrakcji danych z HTML przy użyciu XPath lub selektorów CSS.
				
			

Inicjalizacja i uruchomienie Webdrivera

Przed zainicjalizowaniem Webdrivera upewnij się, że wykonałeś poprzednie kroki i masz ścieżkę do swojego pliku chromedriver. Zainicjuj sterownik za pomocą poniższego kodu. Powinieneś zobaczyć, że otwiera się nowe okno Chrome.

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # użyj ścieżki do sterownika, który pobrałeś w poprzednich krokach
driver = webdriver.Chrome(chromedrive_path)
				
			

Na mac możesz zobaczyć następujące: "chromedriver nie może zostać otwarty, ponieważ nie można zweryfikować dewelopera". Aby przezwyciężyć ten problem kliknij kontrolnie na chromedriver w Finderze, wybierz Otwórz z menu, a następnie kliknij Otwórz w oknie dialogowym, które się pojawi. Powinieneś zobaczyć "ChromeDriver został uruchomiony pomyślnie" w otwartym oknie terminala. Zamknij je i po tym, będziesz mógł uruchomić ChromeDriver z twojego kodu.

Pobierz stronę Mapy Google

Once you start the driver you are ready to open some pages. To open any page, use the "get" command.

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

Parsowanie treści wyszukiwania na mapach

Po otwarciu strony zobaczysz w oknie przeglądarki stronę, która jest kontrolowana przez Twój kod Pythona. Aby pobrać zawartość strony HTML z ChromeDriver, możesz uruchomić poniższy kod.

				
					strona_content = driver.page_source
				
			

To comfortably see the HTML content, open the developer console in Chrome by opening the Chrome Menu in the upper-right-hand corner of the browser window and selecting More Tools > Developer Tools. Now you should be able to see elements of your page.

mapy google parsowanie HTML
Znajdowanie xpath do elementów, które chcemy uzyskać za pomocą konsoli deweloperskiej

Możesz parsować zawartość strony HTML używając swoich ulubionych narzędzi do parsowania. My użyjemy Parsel w tym poradniku.

				
					from parsel import Selector

response = Selector(page_content)
				
			

Wykonaj iterację po listach i pobierz dane każdego miejsca.

				
					results = []

for el in response.xpath('//div[contains(@aria-label, "Wyniki dla")]/div/div[./a]'):
    results.append({
        'link': el.xpath('./a/@href').extract_first(''),
        'title': el.xpath('./a/@aria-label').extract_first('')
    })
    
print(results)
				
			

Dane wyjściowe z miejsc na Mapach Google (skrócone).

				
					[
  {
    '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'
  },
  ...
].
				
			

Zatrzymaj sterownik po zakończeniu procesu ekstrakcji

Ważne jest, aby odpowiednio uruchamiać i wyłączać sterownik przed i po zakończeniu skrobania. To tak samo jak otwieranie i zamykanie przeglądarki przed i po surfowaniu po Internecie. Zamknij sterownik, uruchamiając poniższy kod.

				
					driver.quit()
				
			

Wnioski i zalecenia dotyczące skalowania i zwiększenia wytrzymałości zgarniacza

Despite the tricky HTML structure of Google Maps, with Selenium and a good knowledge of XPath and CSS selectors, you can achieve quite good results in scraping. This method of using a browser emulator should protect you from getting blocked. However, if you are going to scale your application you might consider using proxies as well in order to avoid some unexpected troubles.

Praca równoległa

Możliwe jest uruchomienie sterowników w trybie multiprocessing (nie wielowątkowym), ale każdy sterownik będzie zużywał jeden procesor. Upewnij się, że masz ich wystarczająco dużo.

Najlepszy sposób na skrobanie map Google w skali przedsiębiorstwa

Ponieważ skrobanie w Google może być sporym wyzwaniem, wiele firm i dużych przedsiębiorstw chce zacząć skrobać miliony stron, nie tracąc czasu na tworzenie i utrzymywanie własnych robotów indeksujących.

Najprostszym sposobem na rozpoczęcie skrobania Map Google jest użycie Outscraper Platforma (aby uzyskać wyniki w plikach CSV), APIlub SDKs (w celu zintegrowania z kodem).

Najprostszy sposób na rozpoczęcie pracy z Google Maps Scraping

Zainstaluj pakiet SDK firmy Outscraper, wykonując następujące polecenie.

				
					pip install google-services-api.
				
			

Zainicjuj klienta i wyszukaj oferty w Google lub sprawdź konkretne oferty, wysyłając identyfikatory miejsc.

* możesz uzyskać token API (SECRET_API_KEY) z listy Strona profilu.

				
					from outscraper import ApiClient

api_client = ApiClient(api_key='SECRET_API_KEY')

# Wyszukaj firmy w określonych lokalizacjach:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Pobierz dane konkretnego miejsca według identyfikatora
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Wyszukiwanie za pomocą wielu zapytań (grupowanie)
result = api_client.google_maps_search([
    'restauracje brooklyn usa',
    'bary brooklyn usa'
], language='en')

print(result)
				
			

Wynik wyjściowy (skrócony).

				
					[
  [
    {
      "name": "Colonie",
      "full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough": "Brooklyn Heights",
      "street": "127 Atlantic Ave",
      "city": "Brooklyn",
      "postal_code": "11201",
      "country_code": "US",
      "country": "United States of America",
      "us_state": "New York",
      "state": "New York",
      "plus_code": null,
      "latitude": 40.6908464,
      "longitude": -73.9958422,
      "time_zone": "America/New_York",
      "popular_times": null,
      "site": "http://www.colonienyc.com/",
      "phone": "+1 718-855-7500",
      "type": "American restaurant",
      "category": "restaurants",
      "podtypy": "American restaurant", "Cocktail bar", "Italian restaurant", "Organic restaurant", "Restaurant", "Wine bar",
      "posts": null,
      "rating": 4.6,
      "reviews": 666,
      "reviews_data": null,
      "photos_count": 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": "Monday: 17:30 | wtorek: Nieczynne | Środa: Zamknięte | Czwartek: 17:30 | Piątek: 17:30 | Sobota: 11:00:00,17:00:30 | Niedziela: 11:00:00,17:00:30",
      "working_hours": {
        "Monday": "5AM\u20139:30PM",
        "Tuesday": "Zamknięte",
        "środa": "Zamknięte",
        "Czwartek": "5:30PM",
        "Piątek": "5:30PM", "5:30PM",
        "Sobota": "11AM\\u20133PM,5\\u20139:30PM",
        "niedziela": "11AM\\u20133PM,5\\u20139:30PM"
      },
      "business_status": "OPERATIONAL",
      },
      "reserving_table_link": "https://resy.com/cities/ny/colonie",
      "booking_appointment_link": "https://resy.com/cities/ny/colonie",
      "owner_id": "114275131377272904229",
      "verified": 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: Najprostszy sposób na rozpoczęcie pracy z Google Reviews Scraping

Aby wyodrębnić recenzje, należy wykonać poniższy kod (zakładając, że zainstalowano pakiet Python i uruchomiono klienta).

				
					# Pobierz recenzje określonego miejsca według id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Pobierz recenzje dla miejsc znalezionych na podstawie zapytania wyszukiwania
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Pobierz tylko nowe recenzje w ciągu ostatnich 24 godzin
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())

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

Wynik wyjściowy (skrócony).

				
					{
  "name": "Memphis Seoul",
  "address": "569 Lincoln Pl, Brooklyn, NY 11238, \u0421 \u043f\u043e\u043b \u0443 \u0447 \u0435 \u043d \u0456 \u0428 \u0428 \u0430 \u0438",
  "address_street": "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": "Bardzo dobre lokalne komfortowe jedzenie fusion! \\Coleslaw z kimchi !!! Taki niesamowity pomysł !",
      "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": "Świetne skrzydełka z kilkoma rodzajami ostrego sosu. Ramen z makaronem i serem jest wyśmienity. Wróciłem później, żeby spróbować slidera z klopsem, grubego, mięsnego plastra z plasterkami i fantastycznym sosem - pyszne. \\Uznaj mnie za stałego bywalca.",
      "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
    },
    ...
  ]
}.
				
			
Kategorie: Pythona

Vlad

Kierownik projektu Linkedin

0 Komentarze

Dodaj komentarz

Symbol zastępczy awatara