Парсер работает для некоторых поисковых запросов в США, но когда я пытаюсь выполнить поиск, для компаний, расположенных по всему миру (например, «Эскильстуна, Швеция»), он постоянно не возвращает результатов, хотя выполнение того же поиска вручную на веб-сайте 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?
Как настроить селекторы BeautifulSoup или конструкцию URL-адресов для правильного сбора глобальных списков Yelp?
Может ли кто-нибудь предложить улучшения для более надежного сбора данных о компаниях и электронных писем?
Будет очень полезна любая помощь. приветствуем!
Создание URL-адреса: я убедился, что URL-адрес поиска построен правильно и имеет правильный формат как для поискового запроса (ниши), так и для местоположения (например, отель и Эскильстуна, Швеция).Проверка структуры страницы: я убедился, что структура HTML, на которую я ориентируюсь с помощью BeautifulSoup, подходит для списков компаний, но, похоже, она по-прежнему не работает для местоположений за пределами США.
Тестирование вручную: когда я вручную выполняя поиск компаний в Yelp по тому же запросу (например, отели в Эскильстуне), я получаю релевантные результаты, но парсер не может получить ни одной ссылки.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -locations