Как я могу очистить ссылки на мероприятия и контактную информацию с веб-сайта с помощью Python?Python

Программы на Python
Ответить
Anonymous
 Как я могу очистить ссылки на мероприятия и контактную информацию с веб-сайта с помощью Python?

Сообщение Anonymous »

Я пытаюсь получить ссылки на мероприятия и контактную информацию с веб-сайта RaceRoster (https://raceroster.com/search?q=5k&t=upcoming), используя Python, запросы, Pandas и BeautifulSoup. Цель состоит в том, чтобы извлечь название события, URL-адрес события, имя контактного лица и адрес электронной почты для каждого события и сохранить данные в файл Excel, чтобы мы могли обращаться к этим событиям в целях развития бизнеса.
Однако скрипт постоянно сообщает, что на странице результатов поиска не обнаружено ссылок на события, несмотря на то, что ссылки видны при проверке HTML в браузере. Вот соответствующий HTML-код для ссылок на мероприятия со страницы результатов поиска:

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

[url=https://raceroster.com/events/2025/98542/13th-annual-delaware-tech-chocolate-run-5k]
13th Annual Delaware Tech Chocolate Run 5k
[/url]
Предпринятые шаги:
  • Проверен правильный селектор для ссылок на события:

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

    soup.select("a.search-results__card-event-name")
    
  • Проверил содержимое ответа на вызов Request.get() с помощью Soup.prettify(). В HTML-коде отсутствуют ссылки на события, видимые в браузере, что позволяет предположить, что контент может загружаться динамически через JavaScript.
  • Попытка парсинга данные с помощью BeautifulSoup, но последовательно получаем:

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

Found 0 events on the page.
Scraped 0 events.
No contacts were scraped.
В чем мне нужна помощь:
  • Как мне справиться с этим контентом, загруженным JavaScript? Есть ли способ очистить его напрямую или мне нужно использовать такой инструмент, как Selenium?
  • Если требуется Selenium, как мне правильно интегрировать его с BeautifulSoup для анализа визуализированного HTML?
Текущий сценарий:

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

import requests
from bs4 import BeautifulSoup
import pandas as pd

def scrape_event_contacts(base_url, search_url):
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"
}
event_contacts = []

# Fetch the main search page
print(f"Scraping page: {search_url}")
response = requests.get(search_url, headers=headers)

if response.status_code != 200:
print(f"Failed to fetch page: {search_url}, status code: {response.status_code}")
return event_contacts

soup = BeautifulSoup(response.content, "html.parser")
# Select event links
event_links = soup.select("a.search-results__card-event-name")

print(f"Found {len(event_links)} events on the page.")

for link in event_links:
event_url = link['href']
event_name = link.text.strip()  # Extract Event Name

try:
print(f"Scraping event: {event_url}")
event_response = requests.get(event_url, headers=headers)
if event_response.status_code != 200:
print(f"Failed to fetch event page: {event_url}, status code: {event_response.status_code}")
continue

event_soup = BeautifulSoup(event_response.content, "html.parser")

# Extract contact name and email
contact_name = event_soup.find("dd", class_="event-details__contact-list-definition")
email = event_soup.find("a", href=lambda href: href and "mailto:" in href)

contact_name_text = contact_name.text.strip() if contact_name else "N/A"
email_address = email['href'].split("mailto:")[1].split("?")[0] if email else "N/A"

if contact_name or email:
print(f"Found contact: {contact_name_text}, email: {email_address}")
event_contacts.append({
"Event Name": event_name,
"Event URL": event_url,
"Event Contact": contact_name_text,
"Email": email_address
})
else:
print(f"No contact information found for {event_url}")
except Exception as e:
print(f"Error scraping event {event_url}: {e}")

print(f"Scraped {len(event_contacts)} events.")
return event_contacts

def save_to_spreadsheet(data, output_file):
if not data:
print("No data to save.")
return
df = pd.DataFrame(data)
df.to_excel(output_file, index=False)
print(f"Data saved to {output_file}")

if __name__ == "__main__":
base_url = "https://raceroster.com"
search_url = "https://raceroster.com/search?q=5k&t=upcoming"
output_file = "/Users/my_name/Documents/event_contacts.xlsx"

contact_data = scrape_event_contacts(base_url, search_url)
if contact_data:
save_to_spreadsheet(contact_data, output_file)
else:
print("No contacts were scraped.")
Ожидаемый результат:
  • Извлечение всех ссылок на события со страницы результатов поиска.
  • Перейдите на страницу сведений о каждом событии.
  • Удалите имя контакта () и адрес электронной почты () со страницы сведений.
  • Сохраните результаты. в файл Excel.


Подробнее здесь: https://stackoverflow.com/questions/793 ... ith-python
Ответить

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

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

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

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

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