Wie kann ich mit Python Veranstaltungslinks und Kontaktinformationen von einer Website entfernen?
Posted: 03 Jan 2025, 09:59
Ich versuche, Event-Links und Kontaktinformationen von der RaceRoster-Website (https://raceroster.com/search?q=5k&t=upcoming) mithilfe von Python, Requests, Pandas und BeautifulSoup zu extrahieren. Das Ziel besteht darin, den Veranstaltungsnamen, die Veranstaltungs-URL, den Kontaktnamen und die E-Mail-Adresse für jede Veranstaltung zu extrahieren und die Daten in einer Excel-Datei zu speichern, damit wir diese Veranstaltungen zu Geschäftsentwicklungszwecken erreichen können.
Das Skript meldet jedoch regelmäßig, dass auf der Suchergebnisseite keine Ereignislinks gefunden werden, obwohl die Links bei der Überprüfung des HTML-Codes im Browser sichtbar waren. Hier ist der relevante HTML-Code für die Veranstaltungslinks auf der Suchergebnisseite:
Durchgeführte Schritte:
Wobei ich Hilfe benötige:
Erwartetes Ergebnis:
Das Skript meldet jedoch regelmäßig, dass auf der Suchergebnisseite keine Ereignislinks gefunden werden, obwohl die Links bei der Überprüfung des HTML-Codes im Browser sichtbar waren. Hier ist der relevante HTML-Code für die Veranstaltungslinks auf der Suchergebnisseite:
Code: Select all
[url=https://raceroster.com/events/2025/98542/13th-annual-delaware-tech-chocolate-run-5k]
13th Annual Delaware Tech Chocolate Run 5k
[/url]
- Überprüfte den richtigen Selektor für Event-Links:
Code: Select all
soup.select("a.search-results__card-event-name")
- Überprüfte den Antwortinhalt aus dem request.get()-Aufruf mit der Suppe.prettify(). Dem HTML scheinen die im Browser sichtbaren Ereignislinks zu fehlen, was darauf hindeutet, dass der Inhalt möglicherweise dynamisch über JavaScript geladen wird.
- Versuch eines Scrapings die Daten mithilfe von BeautifulSoup, erhalten jedoch konsistent:
Code: Select all
Found 0 events on the page.
Scraped 0 events.
No contacts were scraped.
- Wie kann ich mit diesem mit JavaScript geladenen Inhalt umgehen? Gibt es eine Möglichkeit, es direkt zu scrapen, oder muss ich ein Tool wie Selenium verwenden?
- Wenn Selenium erforderlich ist, wie integriere ich es richtig in BeautifulSoup, um den gerenderten HTML-Code zu analysieren?
Code: Select all
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.")
- Extrahieren Sie alle Veranstaltungslinks von der Suchergebnisseite.
- Navigieren Sie zur Detailseite jedes Ereignisses.
- Entfernen Sie den Kontaktnamen () und die E-Mail-Adresse () von der Detailseite.
- Speichern Sie die Ergebnisse in eine Excel-Datei.