Скрапінг даних з Yelp з використанням Python

Коментарі: 0

Скрапінг інформації з Yelp надає корисні дані про місцеві ресторани, включно з їхніми назвами, URL-адресами, типами кухні та рейтингами. У цьому посібнику показано, як скрапити дані з результатів пошуку на Yelp з використанням бібліотек Python, таких як requests і lxml. Також будуть розглянуті методи роботи з проксі, управління HTTP-заголовками і витяг даних через XPath.

Крок 1: Підготовка середовища

Перед початком скрапінгу встановіть Python і необхідні бібліотеки:

pip install requests
pip install lxml

Ці бібліотеки необхідні для надсилання HTTP-запитів на Yelp, парсингу HTML-контенту та вилучення потрібної інформації.

Крок 2: Надсилання запиту на Yelp

Для початку виконайте GET-запит до сторінки результатів пошуку на Yelp, щоб отримати HTML-контент. Приклад коду:

import requests

# URL сторінки пошуку Yelp
url = "Ссылка HTTPS"

# Надсилання GET-запиту для отримання HTML-контенту
response = requests.get(url)

# Перевірка успішності запиту
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

Важливість HTTP-заголовків

Під час надсилання запитів на веб-сайт дуже важливо включати відповідні HTTP-заголовки. Заголовки можуть містити метадані про запит, як-от юзер-агент користувача, що ідентифікує браузер або інструмент, який надсилає запит. Включення цих заголовків може допомогти уникнути блокування або обмеження швидкості з боку цільового веб-сайту.

Ось як можна налаштувати заголовки:

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}

response = requests.get(url, headers=headers)

Реалізація ротації проксі

Під час скрапінгу великого обсягу сторінок ваша IP-адреса може бути заблокована цільовим сайтом. Щоб уникнути цього, рекомендується використовувати проксі-сервери.

Для цього посібника рекомендується застосувати динамічні проксі-сервери з автоматичною ротацією. Вам необхідно лише налаштувати параметри проксі-сервера.

proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

response = requests.get(url, headers=headers, proxies=proxies)

Крок 3: Парсинг HTML-контенту за допомогою lxml

Отримавши HTML-контент, наступним кроком буде його парсинг і витяг відповідних даних. Для цієї мети ми будемо використовувати бібліотеку lxml.

from lxml import html

# Парсинг HTML-контенту за допомогою lxml
parser = html.fromstring(response.content)

Визначення елементів для парсингу

Нам потрібно виділити окремі дані про ресторани на сторінці результатів пошуку. Ці елементи можна ідентифікувати за допомогою виразів XPath. На Yelp записи зазвичай знаходяться в елементі div з певним атрибутом data-testid.

# Витяг елементів кожного ресторану
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

Використання XPath для вилучення даних

XPath являє собою ефективний інструмент для навігації та вибору вузлів з HTML-документа. У цьому посібнику ми застосуємо вирази XPath для вилучення інформації про назву ресторану, його URL-адресу, тип кухні та рейтинг для кожного елемента списку ресторанів.

Нижче наведено специфічні XPath вирази для кожного елемента даних:

  1. Назва ресторану: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()
  2. Посилання на ресторан: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href
  3. Кухня: .//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()
  4. Рейтинг: .//div[@class="y-css-9tnml4"]/@aria-label

Крок 4: Витяг даних зі списку ресторанів

Після отримання HTML-вмісту й опрацювання можливих блокувань IP-адрес можна перейти до вилучення даних із кожного ресторану.

restaurants_data = []

# Перебираємо кожен запис ресторану
for element in elements:
    # Отримуємо назву ресторану
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Отримуємо URL ресторану
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Отримуємо інформацію про кухню
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Отримуємо рейтинг
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Створюємо словник для зберігання даних про ресторан
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Додаємо дані ресторану до списку
    restaurants_data.append(restaurant_info)

Крок 5: Збереження даних у форматі JSON

Після вилучення даних їх необхідно зберегти в структурованому форматі, в якості якого використовується JSON.

import json

# Зберігаємо дані у файл JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Фінальна версія коду

import requests
from lxml import html
import json

# URL сторінки пошуку Yelp
url = "Ссылка HTTPS"

# Налаштування заголовків для імітації запиту з браузера
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.5'
}

# Налаштування проксі
proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

# Надсилання GET-запиту для отримання HTML-вмісту
response = requests.get(url, headers=headers, proxies=proxies)

# Перевірка успішності запиту
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

# Парсинг HTML-вмісту за допомогою lxml
parser = html.fromstring(response.content)

# Витяг елементів кожного ресторану
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

# Ініціалізація списку для збереження витягнутих даних
restaurants_data = []

# Ітерація по кожному елементу ресторану
for element in elements:
    # Витяг назви ресторану
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Витяг URL ресторану
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Скрапінг типу кухні
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Витяг рейтингу
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Створення словника для збереження даних
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Додавання інформації про ресторан до списку
    restaurants_data.append(restaurant_info)

# Збереження даних у файл JSON
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Користувачам рекомендується акцентувати увагу на правильному налаштуванні HTTP-заголовків і використанні проксі для обходу обмежень і блокувань. Для оптимізації процесу та мінімізації ризиків варто розглянути автоматизацію ротації IP-адрес, яку можна досягти завдяки використанню динамічних резидентських або мобільних проксі-серверів.

Коментарії:

0 Коментаріїв