Der Einstieg in die Welt des Web-Scrapings kann etwas überwältigend sein. Man muss die richtige Programmiersprache und die richtige Bibliothek auswählen und mit vielen unvorhergesehenen Rückschlägen fertig werden. Das wird schnell zu einer großen Herausforderung. Aber lass dich davon nicht entmutigen! In diesem Artikel habe ich einige der am häufigsten gestellten Fragen zum Thema Web-Scraping beantwortet. Du erfährst, was andere tun und mit welchen Herausforderungen sie konfrontiert waren. Das wird dir helfen, deine eigenen Entscheidungen zu treffen. Egal, ob du neu auf diesem Gebiet bist oder ein erfahrener Profi – hier ist für jeden etwas dabei.
Warum sieht mein Scraper nicht dieselben Daten wie mein Browser?
Du hast ein Skript geschrieben, um HTML von einer Website abzurufen, aber du erhältst nicht die vollständigen Daten. Du hast deine Selektoren im Browser getestet und sie sollten funktionieren, oder? Nicht immer. Websites, die auf JavaScript zum Rendern angewiesen sind, funktionieren nicht mit einer einfachen GET-Anfrage. Es gibt Bibliotheken wie Puppeteer und Selenium, die Headless-Browser verwenden, um JavaScript darzustellen. Sie ermöglichen es dir, die Anfrage im Kontext eines Browsers zu stellen und zu warten, bis JavaScript die Ausführung beendet hat. Auf diese Weise kannst du den vollständigen HTML-Code abrufen. Möglicherweise benötigst du nicht immer einen Headless-Browser, um die fehlenden Daten zu erhalten. Suche im HTML-Code nach <script>-Tags. Die fehlenden Daten könnten als JavaScript-Variablen innerhalb von <script>-Tags versteckt sein.
Wie kann ich eine Website scrapen, die generierte CSS-Klassen verwendet?
Einige Websites verwenden Bibliotheken, die automatisch eindeutige Klassennamen für verschiedene Seitenkomponenten erstellen. Dies kann es schwierig machen, mit herkömmlichen CSS-Selektoren bestimmte Elemente anzusprechen.
Eine Lösung besteht darin, stattdessen XPath-Ausdrücke zu verwenden. XPath-Selektoren stützen sich auf das Layout der Seite und nicht auf bestimmte Klassennamen. Das bedeutet, dass der XPath-Selektor das gewünschte Element auch dann noch finden kann, wenn sich die Klassennamen ändern.
Wenn Sie beispielsweise eine HTML-Komponente haben, die wie folgt aussieht:
<div class="container">
<div class="subcontainer_af21">
<ul class="ul_ax1">
<li class="li_adef">
<a href="https://link1">Winter Storm</a>
</li>
</ul>
<ul class="ul_cgt4">
<li class="li_ocv2">
<a href="https://lin2">SpaceX</a>
</li>
</ul>
</div>
</div>können Sie das zweite <a>-Element mit folgendem Ausdruck auswählen:
//div[@class='container']/div/ul[2]/li/a
Ist Cheerio schneller als Puppeteer?
Ja, Cheerio gilt allgemein als schneller als Puppeteer. Das liegt daran, dass Cheerio eine serverseitige Bibliothek ist, die direkt mit dem HTML-Inhalt arbeitet. Puppeteer ist eine Browser-Automatisierungsbibliothek, die einen Headless-Browser steuert, um Webseiten zu laden und mit ihnen zu interagieren. Cheerio ist insofern eingeschränkt, als es nur mit statischen Seiten arbeiten kann; es verfügt nicht über die Fähigkeit, mit dem Browser zu interagieren, wie es Puppeteer tut
Sind XPath-Selektoren besser als CSS-Selektoren?
Das hängt vom Kontext ab. Wenn Sie Daten anhand der Position von Elementen extrahieren möchten, ist XPath die bessere Wahl. Wenn Sie jedoch Daten anhand von Eigenschaften wie Klasse oder ID extrahieren möchten, sind CSS-Selektoren die bessere Option.
Ist Playwright besser als Puppeteer?
Beide bieten ähnliche Funktionen, aber: Playwright unterstützt mehrere Browser, darunter Chrome, Firefox und Safari. Puppeteer unterstützt nur Chrome und Chromium.
Playwright bietet eine bessere Unterstützung für die Arbeit mit mehreren Tabs und Fenstern. Es verfügt außerdem über integrierte Unterstützung für die Verwaltung von Browserkontexten, Cookies und Speicher. Playwright eignet sich besser für komplexe Projekte.
Wie kann ich IP-Sperren vermeiden?
Im Allgemeinen kannst du versuchen, deine Anfragen zeitlich zu staffeln. Verwende verschiedene IP-Adressen. Nutze Proxys. Versuche, den Browser-Fingerabdruck zu verändern. Für die meisten Menschen ist dies ein nie endender Kampf. Die gute Nachricht ist, dass es nicht so sein muss. Sie können unsere Lösung, WebScrapingAPI, nutzen. WebScrapingAPI bietet eine API, die Ihnen die ganze Arbeit abnimmt. Sie kann JavaScript ausführen, Proxys wechseln und sogar CAPTCHAs bewältigen. Sie müssen sich nie wieder Sorgen machen, dass Ihre IP gesperrt wird. Aber verlassen Sie sich nicht nur auf unser Wort. Sie können es kostenlos ausprobieren.
Wie extrahiert man Text aus HTML mit BeautifulSoup?
Sie können die BeautifulSoup-Bibliothek verwenden. Hier ist ein Beispiel für das Extrahieren von Text mit der Funktion .get_text():
from bs4 import BeautifulSoup
html_doc = """
<html>
<head>
<title>title of the page</title>
</head>
<body>
<p>a paragraph</p>
<a href='https://link.com'>a link</a>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
paragraph_text = soup.find('p').text
print(paragraph_text)
#Prints 'a paragraph'
link_text = soup.find('a').text
print(link_text)
#Prints 'a link'
all_text = soup.get_text()
print(all_text)
"""
title of the page
a paragraph
a link
"""Wie extrahiert man Text aus HTML mit Selenium?
So geht das in Selenium:
from selenium import webdriver
from selenium.webdriver.common.by import By
DRIVER_PATH = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get("https://en.wikipedia.org/wiki/Main_Page")
# get all the h2 elements
content = driver.find_element(By.TAG_NAME, "h2")
print(content.text)# Prints 'From today's featured article'
Wie wählt man HTML-Elemente anhand von Text mit BeautifulSoup aus?
Mit BeautifulSoup können Sie die Methode soup.find mit dem Parameter text=re.compile("<text>") verwenden:
from bs4 import BeautifulSoup
import re
html_doc = """
<html>
<body>
<p class="my_paragraph">a paragraph.</p>
<p class="my_paragraph">another paragraph.</p>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
# find the first pTag that contains the text 'a par'
pTag = soup.find("p", text=re.compile("a par"))
print(pTag)Wie wählt man HTML-Elemente anhand von Text mit Selenium aus?
In Selenium kannst du dies mit XPath tun:
from selenium import webdriver
from selenium.webdriver.common.by import By
DRIVER_PATH = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get("https://en.wikipedia.org/wiki/Main_Page")
# get all the elements with class vector-body
span = driver.find_element(By.XPATH, "//span[contains(text(), 'Did')]")
print(span.text)
# Prints 'Did you know ...'driver.quit()
Wie findet man HTML-Elemente mit CSS-Selektoren in BeautifulSoup?
So geht das mit BeautifulSoup und den Methoden `find` und `find_all`:
from bs4 import BeautifulSoup
html_doc = """
<html>
<body>
<p class="my_paragraph">First paragraph.</p>
<p class="my_paragraph">Second paragraph..</p>
<p>Last paragraph.</p>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
# find all elements with class 'my_paragraph
elements = soup.find_all(class_="my_paragraph")
for element in elements:
print(element.text)
# prints 'First paragraph.' and 'Second paragraph..'Wie findet man HTML-Elemente anhand ihrer Klasse mit Selenium?
So geht das mit Selenium:
from selenium import webdriver
from selenium.webdriver.common.by import By
DRIVER_PATH = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get("https://en.wikipedia.org/wiki/Main_Page")
# get all the elements with class vector-body
elements = driver.find_elements(By.CLASS_NAME, "vector-body")
for element in elements:
print(element.text)
driver.quit()Wie verwendet man XPath mit BeautifulSoup?
Sie benötigen die Python-Bibliothek lxml:
import requests
from bs4 import BeautifulSoup
from lxml import etree
response = requests.get("https://en.wikipedia.org/wiki/Main_Page")
soup = BeautifulSoup(response.content, 'html.parser')
dom = etree.HTML(str(body))
xpath_str = '//h1//text()'
print(dom.xpath(xpath_str))
#Prints ['Main Page', 'Welcome to ', 'Wikipedia']
Wie wartet man in Selenium, bis die Seite geladen ist?
Wenn Sie beim Suchen eines Elements einfach eine bestimmte Zeit abwarten möchten, bevor ein Timeout erfolgt, können Sie die Funktion driver.implicitly_wait(time_in_seconds) verwenden:
from selenium import webdriver
from selenium.webdriver.common.by import By
DRIVER_PATH = 'C:/Users/Michael/Desktop/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.implicitly_wait(10)
driver.get("https://en.wikipedia.org/wiki/Main_Page")
element = driver.find_element(By.ID, "not_found_id")
# the element does not exist, but it waits 10 seconds for it
text = element.text
print(text)
# Close the browserdriver.quit()
Sie können auch warten, bis eine bestimmte Bedingung erfüllt ist:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
DRIVER_PATH = 'C:/Users/Michael/Desktop/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get("https://en.wikipedia.org/wiki/Main_Page")
# Wait for the element with id 'content' to be present on the page
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "content")))
element = driver.find_element(By.ID, "content")
text = element.text
print(text)
# Close the browserdriver.quit()
Wie findet man HTML-Elemente mit CSS-Selektoren in Puppeteer?
In Puppeteer können Sie die Funktionen page.$() und page.$$() verwenden, um Elemente mit CSS-Selektoren auszuwählen. Die Funktion page.$() dient dazu, das erste Element zu finden, das dem Selektor entspricht. Die Funktion page.$$() dient dazu, alle Elemente zu finden, die dem Selektor entsprechen.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await page.goto('https://www.scrapethissite.com/pages/simple/');
// Extract the first odd row element
const firstOddRow = await page.$('.container .row');
console.log(await firstOddRow.evaluate(node => node.textContent));
// Extract all the odd rows
const allOddRows = await page.$$('.container .row');
for (const oddRow of allOddRows) {
console.log(await oddRow.evaluate(node => node.textContent));
}
await browser.close();
})();Wie findet man HTML-Elemente mit CSS-Selektoren in Playwright?
So geht das mit Playwright. Es ist sehr ähnlich wie bei Puppeteer:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: false,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://www.scrapethissite.com/pages/simple/');
// Extract the first odd row element
const firstOddRow = await page.$('.container .row');
console.log(await firstOddRow.textContent());
// Extract all the odd rows
const allOddRows = await page.$$('.container .row');
for (const oddRow of allOddRows ) {
console.log(await oddRow.textContent());
}
await browser.close();
})();Wie findet man HTML-Elemente mit CSS-Selektoren in Cheerio?
Bei cheerio müssen Sie den HTML-Code abrufen (ich habe dafür die request-Bibliothek verwendet) und ihn dann an die cheerio-Bibliothek übergeben:
const request = require('request');
const cheerio = require('cheerio');
const url = 'https://www.scrapethissite.com/pages/simple/';
request(url, (error, response, html) => {
if (!error && response.statusCode === 200) {
const $ = cheerio.load(html);
const firstOddRow = $('.container .row').first();
console.log(firstOddRow.text());
const allOddRows = $('.container .row');
allOddRows.each((i, oddRow) => {
console.log($(oddRow).text());
});
}
});Wie verwendet man XPath mit Puppeteer?
Mit Puppeteer kannst du die Funktion page.$x() verwenden, um Elemente mit XPath-Selektoren auszuwählen:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.scrapethissite.com/pages/forms/');
// Extract the table header elements
const allTableHeaders = await page.$x('//table/tbody/tr[1]//th');
for(let i = 0; i < allTableHeaders.length; i++) {
const header = await page.evaluate(el => el.textContent, allTableHeaders[i]);
console.log(header.trim());
}
await browser.close();
})();
// Output:
// Team Name
// Year
// Wins
// Losses
// OT Losses
// Win %
// Goals For (GF)
// Goals Against (GA)
// + / -Wie verwendet man XPath mit Playwright?
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: false,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://www.scrapethissite.com/pages/forms/');
// Extract the table header elements
const allTableHeaders = await page.locator('xpath=//table/tbody/tr[1]//th').all();
for (let i = 0; i < allTableHeaders.length; i++) {
const headerText = await allTableHeaders[i].innerText();
console.log(headerText);
}
await browser.close();
})();Jede Selektorzeichenfolge, die mit // oder .. beginnt, wird als XPath-Selektor interpretiert. Playwright wandelt beispielsweise '//html/body' in 'xpath=//html/body' um.
Wie findet man HTML-Elemente anhand von Text in Puppeteer?
In Puppeteer ist die einfachste Methode, Elemente anhand von Text zu finden, die Verwendung der XPath-Funktion text():
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: false,
});
const page = await browser.newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
// Select all the p tags texts that contain the word "prevent"
const pTags = await page.$x('//p[contains(text(), "prevent")]/text()');
for(let i = 0; i < pTags.length; i++) {
const pTag = await page.evaluate(el => el.textContent, pTags[i]);
console.log(pTag,"\n");
}
await browser.close();
})();
//Output:
There are methods that some websites use to prevent web scraping, such as detecting and disallowing bots from crawling (viewing) their pages. In response, there are web scraping systems that rely on using techniques in ... Wie findet man HTML-Elemente anhand von Text in Playwright?
Wenn Sie in Playwright Elemente anhand von Text suchen möchten, können Sie die Funktion allInnerTexts() in Kombination mit XPath verwenden.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: false,
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
// Select all the p tags texts that contain the word "prevent"
const pTags = await page.locator('//p[contains(text(), "prevent")]').allInnerTexts();
for (let i = 0; i < pTags.length; i++) {
console.log(pTags[i], "\n");
}
await browser.close();
})();Wie findet man HTML-Elemente anhand von Text in Cheerio?
const request = require('request');
const cheerio = require('cheerio');
const url = 'https://en.wikipedia.org/wiki/Web_scraping';
request(url, (error, response, html) => {
if (!error && response.statusCode === 200) {
const $ = cheerio.load(html);
// Select all the p tags texts that contain the word "prevent"
const elements = $('p').filter((i, el) => $(el).text().includes('prevent'));
elements.each((i, el) => {
console.log($(el).text());
});
}
});Wie wartet man in Puppeteer auf Selektoren?
In Puppeteer kannst du die Funktion page.waitForSelector() verwenden, um darauf zu warten, dass ein bestimmtes Element auf der Seite erscheint, bevor du mit dem Skript fortfährst. Du kannst sie sowohl mit CSS- als auch mit XPath-Selektoren verwenden:
await page.waitForSelector('.basic-element', { timeout: 10000 });
await page.waitForXPath("//div[@class='basic-element']"), { timeout: 10000 });Der Parameter „timeout“ gibt die maximale Wartezeit in Millisekunden an.
Sie können auch darauf warten, dass ein Element einen bestimmten Zustand erreicht:
await page.waitForSelector('.basic-element', { visible: true });// wait until the element becomes visible
Wie wartet man in Playwright auf Selektoren?
Playwright funktioniert ähnlich wie Puppeteer. Mit der Methode page.waitForSelector() kannst du darauf warten, dass ein bestimmtes Element auf der Seite erscheint.
await page.waitForSelector('.element-class', { timeout: 10000 });
Sie können auch darauf warten, dass ein Element einen bestimmten Zustand erreicht:
await page.waitForSelector('.basic-element', { state: 'visible' });// wait for element to become visible
Zusammenfassung
Web-Scraping ist ein umfangreiches Thema, und dieser Artikel kratzt nur an der Oberfläche. Die Wahl des richtigen Tools für Ihren spezifischen Anwendungsfall ist entscheidend. Wenn Sie beispielsweise eine Website mit JavaScript scrapen möchten, ist die cheerio-Bibliothek eine gute Option. Wenn die Website jedoch JavaScript benötigt, um vollständig geladen zu werden, sind Puppeteer oder Playwright die besseren Optionen. Web-Scraping ist eine Herausforderung, aber wenn Sie die Tools verstehen, können Sie sich viel Ärger ersparen. Ich hoffe, dieser Artikel hat Ihren Horizont erweitert, und wünsche Ihnen viel Erfolg bei Ihren Web-Scraping-Projekten.




