Spis treści

Korzystanie z witryny Selen w skrobaniu danych jest dość powszechną rzeczą. Automatyzuje przeglądarki i pozwala symulować rzeczywiste działania użytkownika, aby uniknąć zablokowania. Jest to szczególnie pomocne podczas skrobania dynamicznie generowanych witryn JavaScript, takich jak Google. Ponadto pomaga uniknąć wszelkiego rodzaju ochrony przed indeksowaniem, ponieważ zasadniczo symuluje zachowanie prawdziwych klientów.

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.

sprawdzanie map google przez selen
Kontrolowanie przeglądarki Chrome za pomocą Selenium

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 odpowiadającą wersji przeglądarki i typowi systemu operacyjnego. Numer wersji 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 # to extract data from HTML using XPath or CSS selectors
				
			

Inicjalizacja i uruchomienie Webdrivera

Przed zainicjowaniem Webdrivera upewnij się, że wykonałeś poprzednie kroki i masz ścieżkę do pliku chromedriver. Zainicjuj sterownik za pomocą następującego kodu. Powinieneś zobaczyć nowe okno Chrome.

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # use the path to the driver you downloaded from previous steps
driver = webdriver.Chrome(chromedrive_path)
				
			

Na Macu może pojawić się następujący komunikat: "chromedriver nie może zostać otwarty, ponieważ nie można zweryfikować dewelopera". Aby przezwyciężyć ten problem, kliknij chromedriver w Finderze, wybierz Otwórz z menu, a następnie kliknij Otwórz w wyświetlonym oknie dialogowym. Powinieneś zobaczyć "ChromeDriver został uruchomiony pomyślnie" w otwartym oknie terminala. Zamknij je, a następnie będziesz mógł uruchomić ChromeDriver ze swojego kodu.

Pobierz stronę Mapy Google

Po uruchomieniu sterownika można otworzyć niektóre strony. Aby otworzyć dowolną stronę, użyj polecenia "get".

				
					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.

				
					page_content = driver.page_source
				
			

Aby wygodnie zobaczyć zawartość HTML, otwórz konsolę programisty w Chrome, otwierając menu Chrome w prawym górnym rogu okna przeglądarki i wybierając Więcej narzędzi > Narzędzia programisty. Teraz powinieneś być w stanie zobaczyć elementy swojej strony.

mapy google parsowanie HTML
Znajdowanie XPath do elementów, które chcemy uzyskać za pomocą Developer Console

Zawartość strony HTML można przeanalizować za pomocą ulubionych narzędzi do parsowania. My użyjemy Parsel w tym poradniku.

				
					from parsel import Selector

response = Selector(page_content)
				
			

Iteruj po ofertach i pobieraj dane każdego miejsca.

				
					results = []

for el in response.xpath('//div[contains(@aria-label, "Results for")]/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 Google Maps (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 zatrzymywać sterownik przed i po skrobaniu. To tak samo, jak otwieranie i zamykanie przeglądarki przed i po surfowaniu po Internecie. Zamknij sterownik, uruchamiając następujący kod.

				
					driver.quit()
				
			

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

Pomimo podstępnej struktury HTML Map Google, dzięki Selenium i dobrej znajomości XPath i selektorów CSS można osiągnąć całkiem dobre wyniki w skrobaniu. Ta metoda korzystania z emulatora przeglądarki powinna uchronić cię przed zablokowaniem. Jeśli jednak zamierzasz skalować swoją aplikację, możesz rozważyć użycie proxy, aby uniknąć niespodziewanych kłopotów.

Praca równoległa

Możliwe jest uruchamianie sterowników w trybie wieloprocesowym (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 Outscraper, uruchamiają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')

# Search for businesses in specific locations:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Get data of the specific place by id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Search with many queries (batching)
result = api_client.google_maps_search([
    'restaurants brooklyn usa',
    'bars 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",
      "subtypes": "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: 5\\u20139:30PM | Tuesday: Closed | Wednesday: Closed | Thursday: 5\\u20139:30PM | Friday: 5\\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\\u20133PM,5\\u20139:30PM",
      "working_hours": {
        "Monday": "5\\u20139:30PM",
        "Tuesday": "Closed",
        "Wednesday": "Closed",
        "Thursday": "5\\u20139:30PM",
        "Friday": "5\\u20139:30PM",
        "Saturday": "11AM\\u20133PM,5\\u20139:30PM",
        "Sunday": "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).

				
					# Get reviews of the specific place by id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Get reviews for places found by search query
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Get only new reviews during last 24 hours
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())

result = api_client.google_maps_reviews(
    'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', 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\\u0442\\u0430\\u0442\\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": "Very good local comfort fusion food ! \\nKimchi coleslaw !! Such an amazing idea !",
      "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": "Great wings with several kinds of hot sauce. The mac and cheese ramen is excellent.\\nUPDATE:\\nReturned later to try the meatloaf slider, a thick meaty slice  topped with slaw and a fantastic sauce- delicious. \\nConsider me a regular.\\ud83d\\udc4d",
      "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
    },
    ...
  ]
}
				
			

FAQ

Najczęściej zadawane pytania i odpowiedzi

Dzięki SDK Outscraper możliwe jest skrobanie danych z Google Maps za pomocą Python Selenium. Zapoznaj się z dokumentacją Outscraper Google Maps Places API, aby zobaczyć, co możesz zrobić.

Korzystając z Pythona i Selenium, można zautomatyzować proces pobierania danych z Google Maps. Outscraper oferuje Interfejs API miejsc w Mapach Google i SDK, które upraszczają to zadanie.

Możliwe jest zautomatyzowanie skrobania Map Google przy użyciu Pythona i Selenium. Outscraper Google Maps Places API a zestawy SDK pozwalają to zrobić w najprostszy sposób.

Kategorie: Pythona

Vlad

Kierownik projektu Linkedin

0 Komentarze

Dodaj komentarz

Symbol zastępczy awatara