Скрапінг інформації з Yelp надає корисні дані про місцеві ресторани, включно з їхніми назвами, URL-адресами, типами кухні та рейтингами. У цьому посібнику показано, як скрапити дані з результатів пошуку на Yelp з використанням бібліотек Python, таких як requests і lxml. Також будуть розглянуті методи роботи з проксі, управління HTTP-заголовками і витяг даних через XPath.
Перед початком скрапінгу встановіть Python і необхідні бібліотеки:
pip install requests
pip install lxml
Ці бібліотеки необхідні для надсилання HTTP-запитів на Yelp, парсингу HTML-контенту та вилучення потрібної інформації.
Для початку виконайте 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-заголовки. Заголовки можуть містити метадані про запит, як-от юзер-агент користувача, що ідентифікує браузер або інструмент, який надсилає запит. Включення цих заголовків може допомогти уникнути блокування або обмеження швидкості з боку цільового веб-сайту.
Ось як можна налаштувати заголовки:
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)
Отримавши 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 являє собою ефективний інструмент для навігації та вибору вузлів з HTML-документа. У цьому посібнику ми застосуємо вирази XPath для вилучення інформації про назву ресторану, його URL-адресу, тип кухні та рейтинг для кожного елемента списку ресторанів.
Нижче наведено специфічні XPath вирази для кожного елемента даних:
Після отримання 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)
Після вилучення даних їх необхідно зберегти в структурованому форматі, в якості якого використовується 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-адрес, яку можна досягти завдяки використанню динамічних резидентських або мобільних проксі-серверів.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Коментарі: 0