Inhaltsverzeichnis
Schritt 3: Scrollen zum Laden dynamischer Inhalte implementieren
Um dynamisch geladene Antworten auf Quora vollständig zu erfassen, definieren wir als Nächstes eine scroll_to_bottom()
Funktion.
In dieser Funktion greifen wir zunächst auf den aktuellen unteren Rand der Seite zu. Dann betreten wir eine Schleife, in der wir das Drücken von simulieren Endtaste Verwendung der send_keys()
Funktion, die uns nach unten scrollt.
Nach jedem Scrollen warten wir etwas, bis neue Inhalte geladen werden. Wir überprüfen, ob wir wirklich ganz unten angekommen sind, indem wir die Seitenhöhe vor und nach dem Scrollen vergleichen. Wenn sich nichts geändert hat, sind wir am Ende angelangt und jeder Inhalt ist geladen und kann von uns durchsucht werden.
def scroll_to_bottom(driver):
"""Scrolls the webdriver instance to the bottom of the page."""
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
time.sleep(10)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
Dieser Schritt ist der Schlüssel, um sicherzustellen, dass wir nichts verpassen, was dynamisch geladen wird, während wir uns durch die Seite bewegen.
Schritt 4: Daten mit BeautifulSoup extrahieren
Nachdem unsere Seite nun vollständig geladen ist, ist es an der Zeit, mit BeautifulSoup in den Inhalt einzutauchen. Wir suchen nach Antworten auf unsere Quora-Frage, also erstellen wir eine scrape_answers()
Funktion, die unsere übernimmt seleniumwire
Fahrer als Argument.
In dieser Funktion BeautifulSoup
übernimmt die Seitenquelle von unserem Treiber und wandelt sie in eine navigierbare Struktur um. Wir zielen auf den Hauptinhaltsbereich ab, in dem die Antworten gespeichert werden, nämlich den div
Element, das wir zuvor identifiziert haben, und durchlaufen jede Antwort, um alle herauszufiltern, die als Anzeigen markiert sind.
def scrape_answers(driver):
soup = BeautifulSoup(driver.page_source, 'html.parser')
main_content = soup.find("div", attrs={"id": "mainContent"})
all_results = main_content.find_all("div", class_="q-click-wrapper qu-display--block qu-tapHighlight--none qu-cursor--pointer ClickWrapper___StyledClickWrapperBox-zoqi4f-0 iyYUZT")
non_ad_results = (result for result in all_results if not result.find_parents(class_="q-box dom_annotate_ad_promoted_answer"))
return non_ad_results
Schritt 5: Extrahierte Daten in einer CSV-Datei speichern
Nachdem Sie alle Ergebnisse gesammelt haben, ist es an der Zeit, sie für die zukünftige Verwendung zu organisieren und zu speichern. Dazu erstellen wir eine CSV-Datei, ein Format, das leicht zu lesen und zu analysieren ist. Wir definieren a write_to_csv()
Funktion, um dies zu tun.
Wir beginnen mit dem Schaffen quora_answers.csv. Dann erstellen wir eine csv.writer
Objekt und verwenden Sie es, um die Kopfzeile mit „Frage“, „Antwort“ und „Upvotes“ zu schreiben.
def write_to_csv(results, query):
"""Writes the scraped results to a CSV file."""
with open('quora_answers.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(("Question", "Answer", "Upvotes"))
Wir ziehen sorgfältig die Frage, die Antwort und vor allem die positiven Stimmen für jedes extrahierte Datenelement heraus. Die Upvotes sind schwierig, da sie sich nicht in der direkten HTML-Struktur der Antwort befinden, sondern in einem enthaltenden oder übergeordneten Div.
Wir gebrauchen find_parent()
um den HTML-Baum von der Antwort bis zur Position der Upvotes aufzusteigen
for result in results:
question = result.find('div', class_="q-text qu-dynamicFontSize--regular_title qu-fontWeight--bold qu-color--gray_dark_dim qu-passColorToLinks qu-lineHeight--regular qu-wordBreak--break-word")
answer = result.find('div', class_="q-box spacing_log_answer_content puppeteer_test_answer_content")
parent = result.find_parent("div")
upvote = parent.find("span", class_="q-text qu-whiteSpace--nowrap qu-display--inline-flex qu-alignItems--center qu-justifyContent--center")
answer_text = answer.text if answer else "No answer text available"
question_text = question.text.replace("Related", "") if question else query
upvote = upvote.text if upvote else "0"
Für jede Antwort, die wir verarbeitet haben, stellen wir eine Datenzeile zusammen:
- Der Fragetext (mit einer kleinen Änderung, um der Klarheit halber den Text „Verwandt“ aus der Frage zu entfernen)
- Der Antworttext
- Die Anzahl der Upvotes
Wenn wir keine Antwort oder Upvotes finden, verwenden wir Standardwerte wie „Kein Antworttext verfügbar“ oder „0“.
writer.writerow((question_text, answer_text, upvote))
Nachdem alle Daten geschrieben wurden, drucken wir eine Bestätigungsmeldung aus, die angibt, wie viele Antworten wir in unserer CSV-Datei gespeichert haben.
print(f"Written {len(results)} answers to quora_answers.csv")
Schritt 6: Ausführen des Skripts zur Datenerfassung
In dieser Phase sind wir bereit, alles zusammenzuführen und unser Skript für eine bestimmte Quora-Fragenseite auszuführen.
Wir konfigurieren zunächst den WebDriver mit dem Proxy von ScraperAPI für einen nahtlosen Zugriff auf Quora und vermeiden mögliche Blockaden mit unserem configure_selenium_wire_proxy()
Funktion und übergibt unseren ScraperAPI-API-Schlüssel als Argument.
chrome_options = webdriver.ChromeOptions()
API_KEY = "YOUR_API_KEY"
proxy_options = configure_selenium_wire_proxy(API_KEY)
driver = webdriver.Chrome(options=chrome_options, seleniumwire_options=proxy_options)
Anschließend speichern wir unsere Frage in einem query
Variable und erstellen Sie die URL, um genau zu der Quora-Seite zu gelangen, auf der sich diese Frage befindet.
Wir ersetzen Leerzeichen in unserer Frage durch Bindestriche, um dem URL-Format von Quora zu entsprechen und sicherzustellen, dass unser WebDriver genau weiß, wohin er gehen muss.
query = "What is the easiest way to learn to code?"
driver.get(f"https://www.quora.com/{query.replace(' ', '-')}-q{query.replace(' ', '-')}")
Nachdem Sie auf die Verwendung der Seite gewartet haben time.sleep(100)
wir führen unsere aus scroll_to_bottom()
um sicherzustellen, dass alle dynamisch geladenen Antworten sichtbar sind.
Nächste, scrape_answers()
sammelt diese Antworten und write_to_csv()
speichert sie in einer strukturierten CSV-Datei.
time.sleep(100) # Initial wait for page to load
scroll_to_bottom(driver) # Scroll to the bottom of the page
answers = scrape_answers(driver) # Scrape non-ad answers
write_to_csv(answers, query) # Write the answers to a CSV file
Wir werden alles innerhalb eines platzieren try-except-finally
Block.
Der try
Block stellt sicher, dass unser Skript versucht, den Scraping-Prozess auszuführen, während der except
Der Block ist dazu da, etwaige Fehler ordnungsgemäß zu behandeln. Wir stellen auch sicher, dass der WebDriver ordnungsgemäß geschlossen ist finally
-Klausel unabhängig vom Erfolg oder Misserfolg des Skripts.
try:
query = "What is the easiest way to learn to code?"
driver.get(f"https://www.quora.com/{query.replace(' ', '-')}-q{query.replace(' ', '-')}")
time.sleep(100)
scroll_to_bottom(driver)
answers = scrape_answers(driver)
write_to_csv(answers, query)
except Exception as e:
print("An error occurred:", e)
finally:
driver.quit() # Ensure the driver is quit properly
Zusammenfassung
Wir haben es geschafft! Wir haben durch Quora navigiert und dabei Selenium und ScraperAPI verwendet, um alle Hürden zu umgehen und Daten zu sammeln. Heute haben wir Folgendes behandelt:
- Verwenden Sie Python und BeautifulSoup, um Quora zu durchsuchen und nützliche Q&A-Daten zu extrahieren.
- Die Speicherung der extrahierten Daten in einer CSV-Datei erleichtert unsere Analyse.
- Nutzung von ScraperAPI im Proxy-Modus mit Selenium Wire, um Quoras Abwehrmechanismen geschickt zu navigieren, um auf öffentliche Erkenntnisse zuzugreifen.
Bei Fragen wenden Sie sich bitte an unser Support-Team; Wir helfen Ihnen gerne weiter, oder schauen Sie sich unsere Dokumentation an, um mehr darüber zu erfahren, wie Sie ScraperAPI effektiv nutzen können.
Benötigen Sie mehr als 3 Millionen API-Credits pro Monat? Kontaktieren Sie den Vertrieb und erhalten Sie einen individuellen Plan mit Premium-Support und einem engagierten Account Manager.
Bis zum nächsten Mal viel Spaß beim Schaben und denken Sie daran, verantwortungsbewusst zu kratzen!