CoderCastrov logo
CoderCastrov
Zomato

Парсинг списка ресторанов с помощью Python и BeautifulSoup

Парсинг списка ресторанов с помощью Python и BeautifulSoup
просмотров
3 мин чтение
#Zomato

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

Вот простой скрипт, который делает это. Мы будем использовать BeautifulSoup для извлечения информации, а данные о ресторанах будем получать с сайта Zomato.

Для начала, вот основной код, который нам нужен для получения страницы с результатами поиска на Zomato и настройки BeautifulSoup для использования CSS-селекторов для запроса страницы с полезными данными.

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'}
url = 'https://www.zomato.com/ncr/restaurants/pizza'response=requests.get(url,headers=headers)soup=BeautifulSoup(response.content,'lxml')#print(soup.select('[data-lid]'))
for item in soup.select('.search-result'):
    try:
        print('----------------------------------------')
        print(item)    except Exception as e:
        #raise e
        print('')

Мы также передаем заголовки пользовательского агента, чтобы имитировать вызов браузера и избежать блокировки.

Теперь давайте проанализируем результаты поиска Zomato для нужного нам направления. Вот как это выглядит.

И когда мы проверяем страницу, мы видим, что каждый элемент HTML находится в теге с классом search-result.

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

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'}
url = 'https://www.zomato.com/ncr/restaurants/pizza'response=requests.get(url,headers=headers)soup=BeautifulSoup(response.content,'lxml')#print(soup.select('[data-lid]'))
for item in soup.select('.search-result'):
    try:
        print('----------------------------------------')
        print(item)    except Exception as e:
        #raise e
        print('')

И когда вы запускаете его..

python3 scrapeZomato.py

Вы можете видеть, что код выделяет HTML-карты.

При более детальном рассмотрении вы можете увидеть, что название ресторана всегда имеет класс result-title. Давайте попробуем получить его.

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'}
url = 'https://www.zomato.com/ncr/restaurants/pizza'response=requests.get(url,headers=headers)soup=BeautifulSoup(response.content,'lxml')#print(soup.select('[data-lid]'))
for item in soup.select('.search-result'):
    try:
        print('----------------------------------------')
        #print(item)        print(item.select('.result-title')[0].get_text())    except Exception as e:
        #raise e
        print('')

Так мы получим названия...

Бинго!

Теперь давайте получим остальные данные...

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9'}
url = 'https://www.zomato.com/ncr/restaurants/pizza'response=requests.get(url,headers=headers)soup=BeautifulSoup(response.content,'lxml')#print(soup.select('[data-lid]'))
for item in soup.select('.search-result'):
    try:
        print('----------------------------------------')
        #print(item)        print(item.select('.result-title')[0].get_text().strip())
        print(item.select('.search_result_subzone')[0].get_text().strip())
        print(item.select('.res-rating-nf')[0].get_text().strip())
        print(item.select('[class*=rating-votes-div]')[0].get_text().strip())
        print(item.select('.res-timing')[0].get_text().strip())
        print(item.select('.res-cost')[0].get_text().strip())
    except Exception as e:
        #raise e
        print('')

И при запуске.

Мы получаем всю нужную информацию, включая рейтинги, отзывы, цену и адрес.

В более сложных реализациях вам может потребоваться даже изменять строку пользовательского агента, чтобы Zomato не мог определить, что это один и тот же браузер!

Если мы становимся немного более продвинутыми, вы поймете, что Zomato может просто заблокировать ваш IP-адрес, игнорируя все ваши другие трюки. Это печально, и именно здесь большинство проектов по веб-парсингу терпят неудачу.

Преодоление блокировки IP-адреса

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

Плюс с 1000 бесплатных вызовов API, предлагаемых в акции, у вас почти нет риска использовать нашу систему ротации прокси и сравнить результаты. Для интеграции требуется всего одна строка кода, поэтому это практически не вызывает проблем.

Наш сервер с ротацией прокси Proxies API предоставляет простое API, которое мгновенно решает все проблемы блокировки IP-адреса.

  • С миллионами высокоскоростных ротирующих прокси, расположенных по всему миру,
  • С нашей автоматической ротацией IP-адресов
  • С нашей автоматической ротацией строки User-Agent (которая имитирует запросы от разных действительных веб-браузеров и их версий)
  • С нашей автоматической технологией решения CAPTCHA,

Сотни наших клиентов успешно решили проблему блокировки IP-адреса с помощью простого API.

Весь процесс доступен через простое API, как показано ниже на любом языке программирования.

curl "http://api.proxiesapi.com/?key=API_KEY&url=https://example.com"

У нас есть акция, в рамках которой предоставляется 1000 бесплатных вызовов API. Зарегистрируйтесь и получите свой бесплатный API-ключ здесь.

Оригинальная статья была опубликована здесь.