Оглавление

Как вы, возможно, уже знаете, Официальный API Google Places ограничено 5 отзывами только для одного места. Поэтому разработчики рассматривают возможность скраппинга, чтобы иметь возможность получить все отзывы о любом предприятии на Google Maps.

Скраппинг Google со всеми его защитами и динамически отображаемыми страницами может оказаться сложной задачей. К счастью, существует множество инструментов, которые вы можете использовать для скраппинга отзывов на python или любом другом языке программирования. В этой статье вы увидите два наиболее распространенных инструмента для скраппинга отзывов Google: эмуляцию браузера и платформу Outscraper. Каждого из них достаточно, чтобы получить все отзывы с любого объявления на картах.

Скраппинг отзывов Google в Python с использованием браузера для рендеринга динамического контента

Мы будем использовать Селен для управления браузером Chrome. Браузер будет отображать динамические страницы Google Reviews. Для начала создания скрепера отзывов с помощью Selenium нам понадобятся:

  1. Python 3+.
  2. Установлен браузер Chrome.
  3. Selenium 3.141.0+ (пакет python).
  4. Драйвер Chrome (для вашей ОС).
  5. Parsel или любую другую библиотеку для извлечения данных из HTML, например, Beautiful Soup.

Установка Selenium и других пакетов

Установите пакеты Selenium и Parsel, выполнив следующие команды. Мы будем использовать Parsel позже, когда будем разбирать содержимое HTML.

				
					pip install selenium
pip install parsel # для извлечения данных из HTML с помощью XPath или CSS-селекторов
				
			

Запуск браузера

Перед запуском драйвера убедитесь, что вы выполнили предыдущие шаги и у вас есть путь к файлу chromedriver. Инициализируйте драйвер следующим кодом. У вас должно открыться новое окно браузера.

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # используйте путь к драйверу, который вы скачали на предыдущих шагах
driver = webdriver.Chrome(chromedrive_path)
				
			

На mac вы можете увидеть следующее: "chromedriver не может быть открыт, потому что разработчик не может быть проверен". Чтобы решить эту проблему, щелкните хромированный драйвер в Finder, выберите Open в меню, а затем нажмите Open в появившемся диалоговом окне. В открывшемся окне терминала вы должны увидеть надпись "ChromeDriver was started successfully". Закройте его, и после этого вы сможете запускать ChromeDriver из вашего кода.

Загрузить страницу Все отзывы

После запуска драйвера вы можете открыть некоторые страницы. Чтобы открыть любую страницу, используйте команду "get".

				
					url = 'https://www.google.com/maps/place/Central+Park+Zoo/@40.7712318,-73.9674707,15z/data=!3m1!5s0x89c259a1e735d943:0xb63f84c661f84258!4m16!1m8!3m7!1s0x89c258faf553cfad:0x8e9cfc7444d8f876!2sTrump+Tower!8m2!3d40.7624284!4d-73.973794!9m1!1b1!3m6!1s0x89c258f1fcd66869:0x65d72e84d91a3f14!8m2!3d40.767778!4d-73.9718335!9m1!1b1?hl=en&hl=en'
driver.get(url)
				
			

Разбор Отзывы

После открытия страницы вы увидите в окне Chrome страницу, управляемую вашим кодом. Вы можете выполнить следующий код, чтобы получить содержимое HTML-страницы от драйвера.

				
					page_content = driver.page_source
				
			

Чтобы удобно видеть HTML-содержимое, откройте консоль разработчика в Chrome, открыв меню Chrome в правом верхнем углу окна браузера и выбрав More Tools > Developer Tools. Теперь вы должны иметь возможность видеть элементы вашей страницы.

scrape google reviews in python
Поиск xpath к отзывам, которые мы хотим получить с помощью консоли разработчика

Вы можете разобрать содержимое HTML-страницы с помощью ваших любимых инструментов разбора. Мы будем использовать Parsel в этом учебнике.

				
					from parsel import Selector

response = Selector(page_content)
				
			

Итеративно просмотрите отзывы.

				
					results = []

for el in response.xpath('//div/div[@data-review-id]/div[contains(@class, "content")]'):
    results.append({
        'title': el.xpath('.//div[contains(@class, "title")]/span/text()').extract_first(''),
        'rating': el.xpath('.//span[contains(@aria-label, "stars")]/@aria-label').extract_first('').replace('stars' ,'').strip(),
        'body': el.xpath('.//span[contains(@class, "text")]/text()').extract_first(''),
    })
    
print(results)
				
			

Вывод из Google Reviews Crwaler (сокращенный).

				
					[
  {
    'title': 'Ванда Гарретт',
    'rating': '5',
    'body': 'Прекрасный ✨ парк с дружелюбной семейной атмосферой! Я прекрасно провела здесь время; увидеть всех животных и узнать все интересные факты было фантастическим способом провести день. Зоопарк прекрасно озеленен и окружен ...'
  },
  {
    'title': 'Бернадетт Беннетт',
    'rating': '4',
    'body': 'Стоит пойти ради тюленей! Они являются главной достопримечательностью и находятся в центре зоопарка. Мы смотрели живое кормление, и это было здорово. Дети были в восторге. Зоопарк хорошо ухожен, окружен великолепными садами. Много скамеек для отдыха...
  },
  {
    'title': 'Мэри Катруфелли',
    'rating': '3',
    'body': "Не буду врать... Мы приехали из штата Пенсильвания. Мой ребенок ожидал увидеть львов, бегемотов и зебр с Мадагаскара. Ничего этого нет. Там чисто, хороший зоопарк. Но я бы не пошел туда снова".
  },
  ...
]
				
			

Остановить браузер

Важно запускать и останавливать драйвер до и после скрапбукинга соответственно. Это аналогично тому, как вы открываете и закрываете браузер до и после работы в Интернете. Остановите браузер, выполнив следующий код.

				
					driver.quit()
				
			

Несмотря на сложную HTML-структуру Google Reviews, с помощью Selenium и хороших знаний XPath и селекторов CSS можно добиться неплохих результатов в скрейпинге. Этот метод использования эмулятора браузера должен защитить вас от блокировки. Однако, если вы собираетесь масштабировать свое приложение, вы можете рассмотреть возможность использования прокси-серверов, чтобы избежать неожиданных проблем.

Многопроцессорная обработка и другие рекомендации

Можно запускать драйверы в многопроцессорном режиме (не многопоточном), но каждый драйвер будет потреблять один процессор. Убедитесь, что у вас их достаточно.

Самый простой способ поиска отзывов Google на Python

Извлечение данных из Google с помощью браузеров имеет свои плюсы и минусы. Хотя скрепер можно разработать самостоятельно, при масштабировании это может привести к большим затратам на использование серверов с огромным количеством процессоров для обработки эмуляций браузеров. Кроме того, должен быть человек, который будет поддерживать краулер и обновлять его во время изменений на сайте Google.

Используя Платформа Outscraper, API, или SDKs Outscraper предоставляет самое простое решение для предприятий и частных лиц, чтобы начать скраппинг отзывов из Google без использования прокси, эмуляции браузера и инвестиций в разработку.


Поиск отзывов в Python с помощью SDK

1. Вам понадобится python3 + и это пакет python. Установите пакет, выполнив команду.

				
					pip install google-services-api
				
			

2. Получите свой ключ API из Profile page.

3. Импортируйте пакет и инициализируйте его с помощью ключа.

4. Specify the location by providing a link, place Id, or name.

				
					from outscraper import ApiClient


api_cliet = ApiClient(api_key='KEY_FROM_OUTSCRAPER')
response = api_cliet.google_maps_reviews(
    'https://www.google.com/maps/place/Do+or+Dive+Bar/@40.6867831,-73.9570104,17z/data=!3m2!4b1!5s0x89c25b96a0b10eb9:0xfe4f81ff249e280d!4m5!3m4!1s0x89c25b96a0b30001:0x643d0464b3138078!8m2!3d40.6867791!4d-73.9548217',
    language='en',
    limit=100
)
				
			

5. Wait a few seconds till the reviews will be fetched.

				
					[
    {
        "name": "Do or Dive Bar",
        "full_address": "1108 Bedford Ave, Brooklyn, NY 11216, United States",
        "borough": "Bedford-Stuyvesant",
        "street": "1108 Bedford Ave",
        "city": "Brooklyn",
        "postal_code": "11216",
        "country_code": "US",
        "country": "United States of America",
        "us_state": "New York",
        "state": "New York",
        "plus_code": null,
        "latitude": 40.686779099999995,
        "longitude": -73.9548217,
        "time_zone": "America/New_York",
        "site": "https://www.doordivebedstuy.com/",
        "phone": "+1 917-867-5309",
        "type": "Bar",
        "rating": 4.5,
        "reviews": 425,
        "reviews_data": [
            {
                "google_id": "0x89c25b96a0b30001:0x643d0464b3138078",
                "autor_link": "https://www.google.com/maps/contrib/115539085325450648866?hl=en-US",
                "autor_name": "Sam Grjaznovs",
                "autor_id": "115539085325450648866",
                "autor_image": "https://lh3.googleusercontent.com/a-/AOh14GgxmEH7a10v6Bo8AFb6OkbyxxfIBPXbMYVAxeSIRA=c0x00000000-cc-rp-ba3",
                "review_text": "Cozy shin dig with an assortment of drinks. They have a strong specialty for 10bucks and merch too. They have out side dining as well as back yard area. Ask for Brandon every other Saturday. He\u2019s hella cute!",
                "review_img_url": "https://lh5.googleusercontent.com/p/AF1QipPNs8QvvdkBonV5wuxdoylFjLY3k7L6muepbDq-",
                "owner_answer": null,
                "owner_answer_timestamp": null,
                "owner_answer_timestamp_datetime_utc": null,
                "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s115539085325450648866!2s0x0:0x643d0464b3138078?hl=en-US",
                "review_rating": 5,
                "review_timestamp": 1603781021,
                "review_datetime_utc": "10/27/2020 06:43:41",
                "review_likes": 0,
                "reviews_id": "7222934207919784056"
            },
            {
                "google_id": "0x89c25b96a0b30001:0x643d0464b3138078",
                "autor_link": "https://www.google.com/maps/contrib/110571545135018844510?hl=en-US",
                "autor_name": "Arabella Stephens",
                "autor_id": "110571545135018844510",
                "autor_image": "https://lh3.googleusercontent.com/a-/AOh14GisqDfheDO0Aq0cu1Z7YBTbzLyvSEvM3IMDKg3q=c0x00000000-cc-rp",
                "review_text": "Great atmosphere, always fun vibe and good beers. I live in the area and this is a very reliable standby. Would recommend to anyone who is not pretentious and likes a bit of clutter in their watering hole.",
                "review_img_url": "https://lh3.googleusercontent.com/a-/AOh14GisqDfheDO0Aq0cu1Z7YBTbzLyvSEvM3IMDKg3q",
                "owner_answer": null,
                "owner_answer_timestamp": null,
                "owner_answer_timestamp_datetime_utc": null,
                "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s110571545135018844510!2s0x0:0x643d0464b3138078?hl=en-US",
                "review_rating": 5,
                "review_timestamp": 1614111762,
                "review_datetime_utc": "02/23/2021 20:22:42",
                "review_likes": 0,
                "reviews_id": "7222934207919784056"
            },
            {
                "google_id": "0x89c25b96a0b30001:0x643d0464b3138078",
                "autor_link": "https://www.google.com/maps/contrib/101725757133547547783?hl=en-US",
                "autor_name": "Jack Parker",
                "autor_id": "101725757133547547783",
                "autor_image": "https://lh3.googleusercontent.com/a-/AOh14GjFK9CLb8__u5PtJzH1rGuX4DVgPvjaEeIkSJnCNw=c0x00000000-cc-rp",
                "review_text": "All the bartenders are rad. Cheap drinks, and a nice backyard. They have space heaters, but I would still recommend bundling up if you plan on spending a while there. Jeopardy night is always fun too. Can\u2019t wait to sit inside again!",
                "review_img_url": "https://lh3.googleusercontent.com/a-/AOh14GjFK9CLb8__u5PtJzH1rGuX4DVgPvjaEeIkSJnCNw",
                "owner_answer": null,
                "owner_answer_timestamp": null,
                "owner_answer_timestamp_datetime_utc": null,
                "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s101725757133547547783!2s0x0:0x643d0464b3138078?hl=en-US",
                "review_rating": 5,
                "review_timestamp": 1611947492,
                "review_datetime_utc": "01/29/2021 19:11:32",
                "review_likes": 0,
                "reviews_id": "7222934207919784056"
            },
            ...
        ]
]
				
			

Video Tutorial on How to Scrape Google Maps Reviews in Python


Extra

Sign up now and use the promotion code OUTSCRAPER1 чтобы получить - 10% скидка.

Пакет Python ► https://pypi.org/project/google-services-api
API ► https://app.outscraper.com/api-docs

Влад

Project Manager Linkedin