Веб-скребок Python не возвращает результаты Yelp для глобальных местоположенийPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Веб-скребок Python не возвращает результаты Yelp для глобальных местоположений

Сообщение Anonymous »

Я работаю над веб-скребком на базе Python, использующим BeautifulSoup и HTTPX для извлечения списков компаний (электронных писем) из Yelp для определенных мест и отраслей. Цель состоит в том, чтобы собрать данные о компании, включая адреса электронной почты (если они есть), и сохранить их в файле JSON.
Парсер работает для некоторых поисковых запросов в США, но когда я пытаюсь выполнить поиск, для компаний, расположенных по всему миру (например, «Эскильстуна, Швеция»), он постоянно не возвращает результатов, хотя выполнение того же поиска вручную на веб-сайте Yelp дает действительные списки.
Вот краткое описание что я делаю:
Ввод в графическом интерфейсе: пользователи могут ввести нишу поиска (например, «гостиницы», «рестораны») и местоположение (например, «Париж, Франция»).
Создание URL-адреса Yelp: программа создает URL-адрес поиска для Yelp, используя параметры find_desc (ниша) и find_loc (местоположение).
Очистка HTML: я использую BeautifulSoup для очистки страницы результатов поиска на наличие ссылок на отдельные компании. списков.
Извлечение электронной почты: парсер ищет ссылки mailto: на каждой бизнес-странице для извлечения адресов электронной почты.
Проблема:
Хотя я вижу действительные результаты при ручном поиске компаний в Yelp, мой Парсер постоянно не может получить какие-либо ссылки за пределами США. Вот пример поискового запроса, который работает вручную, но ничего не возвращает через парсер:
Работа в браузере: Yelp — Отели в Эскильстуне, Швеция
Парсер не дает результатов: When I поищите «гостиницы» в «Эскильстуна, Швеция», парсер не выдаст данных о компаниях.

Код: Выделить всё

My code:

import httpx
from bs4 import BeautifulSoup
import re
import json
from tkinter import filedialog, messagebox, Tk, Label, Entry, Button

# Function to scrape the Yelp search results
def scrape_yelp_search(main_url: str):
links = []
response = httpx.get(url=main_url)
soup = BeautifulSoup(response.text, "html.parser")

# Loop through all business boxes in the search result page
for link_box in soup.select("div.container__09f24__21w3G"):
# Extract the link of each business page and add it to Yelp base URL
link = "https://www.yelp.com" + link_box.select_one("a.link__09f24__1kwXV").attrs["href"]
links.append(link)

return links

# Function to scrape emails from the business pages
def scrape_emails(links: list):
emails = {}
for link in links:
page_response = httpx.get(url=link)
soup = BeautifulSoup(page_response.text, "html.parser")

# Extract the business name from the HTML
business_name = soup.select_one("h1.heading--inline__09f24__3qgPE").text
# Find all "mailto" links (Yelp typically doesn't show emails, but we'll try)
for link in soup.findAll("a", attrs={"href": re.compile("^mailto:")}):
email = link.get("href").replace("mailto:", "")
if business_name not in emails:
emails[business_name] = []
emails[business_name].append(email)

return emails

# Function to build the search URL based on user input
def build_yelp_url(niche, location):
# Replace spaces with + for URL format
niche = niche.replace(" ", "+")
location = location.replace("  ", "+")

# Construct the Yelp URL based on the niche and location
return f"https://www.yelp.com/search?find_desc={niche}&find_loc={location}"

# Save data to JSON file
def save_to_json(data, file_path):
with open(file_path, 'w') as file:
json.dump(data, file, indent=4)
print(f"Data saved to {file_path}")

# Start scraping process
def start_scraping():
niche = niche_entry.get()
location = location_entry.get()

if not niche or not location:
messagebox.showwarning("Input Error", "Please enter both a niche and a location.")
return

# Build the URL from user input
url = build_yelp_url(niche, location)
print(f"Scraping URL: {url}")

# Scrape links
links = scrape_yelp_search(url)

if links:
# Scrape emails (Yelp might not show emails, but this is an example)
emails = scrape_emails(links)

if emails:
# Ask user where to save the JSON file
file_path = filedialog.asksaveasfilename(defaultextension=".json", filetypes=[("JSON files", "*.json")])
if file_path:
save_to_json(emails, file_path)
messagebox.showinfo("Success", f"Data saved to {file_path}")
else:
messagebox.showwarning("No Emails", "No emails found on the scraped pages.")
else:
messagebox.showwarning("No Links", "No business listings found for the given niche and location.")

# GUI Setup
app = Tk()
app.title("Global Email Scraper (Yelp)")
app.geometry("400x300")

# GUI Labels and Inputs
Label(app, text="Search Niche (e.g., hotels, restaurants):").pack(pady=10)
niche_entry = Entry(app, width=40)
niche_entry.pack(pady=5)

Label(app, text="Location (e.g., Paris, France):").pack(pady=10)
location_entry = Entry(app, width=40)
location_entry.pack(pady=5)`your text`

# Save and Start Scraping Button
Button(app, text="Start Scraping", command=start_scraping).pack(pady=20)

# Start the GUI loop
app.mainloop()
Есть ли что-то особенное в обработке местоположения Yelp, которое не позволяет моему парсеру работать за пределами США?
Существуют ли какие-либо ограничения геоблокировки, которые могут помешать парсеру получить доступ к странам за пределами США? Данные Yelp?
Как настроить селекторы BeautifulSoup или конструкцию URL-адресов для правильного сбора глобальных списков Yelp?
Может ли кто-нибудь предложить улучшения для более надежного сбора данных о компаниях и электронных писем?
Будет очень полезна любая помощь. приветствуем!
Создание URL-адреса: я убедился, что URL-адрес поиска построен правильно и имеет правильный формат как для поискового запроса (ниши), так и для местоположения (например, отель и Эскильстуна, Швеция).Проверка структуры страницы: я убедился, что структура HTML, на которую я ориентируюсь с помощью BeautifulSoup, подходит для списков компаний, но, похоже, она по-прежнему не работает для местоположений за пределами США.
Тестирование вручную: когда я вручную выполняя поиск компаний в Yelp по тому же запросу (например, отели в Эскильстуне), я получаю релевантные результаты, но парсер не может получить ни одной ссылки.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -locations
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Веб-скребок Python не возвращает результаты Yelp для глобальных местоположений
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Почему этот веб-скребок, использующий Selenium, не возвращает весь сайт?
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Почему этот веб-скребок, использующий Selenium, не возвращает весь сайт?
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Почему этот веб-скребок, использующий Selenium, не возвращает весь сайт?
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Почему этот веб-скребок, использующий Selenium, не возвращает весь сайт?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»