Häufige Fragen über Web Scraping - Antworten und Tipps
Mihai Maxim am 03. März 2023

Die Welt des Web Scraping kann ein wenig überwältigend sein. Man muss die richtige Programmiersprache und die richtige Bibliothek auswählen und sich mit vielen unvorhergesehenen Rückschlägen auseinandersetzen. Es wird schnell zu viel, was man verarbeiten muss. Aber lassen Sie sich davon nicht entmutigen! In diesem Artikel habe ich einige der am häufigsten gestellten Fragen zum Web Scraping beantwortet. Sie erfahren, was andere tun und mit welchen Herausforderungen sie konfrontiert wurden. Dies wird Ihnen helfen, Ihre eigenen Entscheidungen zu treffen. Egal, ob Sie neu auf dem Gebiet sind oder ein erfahrener Profi, hier ist für jeden etwas dabei.
Warum kann mein Scraper nicht die gleichen Daten wie mein Browser sehen?
You've written a script to fetch HTML from a website, but you're not getting the full data. You've tested your selectors in the browser and they should work, right? Not always. Websites that rely on JavaScript to render won't work with a simple GET request. There are libraries like Puppeteer and Selenium that use headless browsers to render JavaScript. They allow you to make the request in the context of a browser and wait for JavaScript to finish executing. This way, you can get the full HTML. You may not always need a headless browser to get the missing data. Search for <script> tags in the HTML. The missing data could be hidden inside <script> tags as JavaScript variables.
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 die Verwendung herkömmlicher CSS-Selektoren zur Bestimmung bestimmter Elemente erschweren.
Eine Lösung besteht darin, stattdessen XPath-Ausdrücke zu verwenden. XPath-Selektoren basieren auf dem Layout der Seite und nicht auf spezifischen Klassennamen. Das heißt, selbst wenn sich die Klassennamen ändern, kann der XPath-Selektor das gewünschte Element finden.
Wenn Sie zum Beispiel 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>
You can select the second <a> element with:
//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 und nicht die Möglichkeit hat, mit dem Browser zu interagieren, wie es Puppeteer kann.
Sind XPath-Selektoren besser als CSS-Selektoren?
Es kommt auf den Kontext an. Wenn Sie Daten auf der Grundlage der Position von Elementen extrahieren möchten, ist XPath die bessere Wahl. Wenn Sie jedoch Daten auf der Grundlage von Eigenschaften wie class oder id extrahieren möchten, sind CSS-Selektoren die bessere Wahl.
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 Registerkarten und Fenstern. Außerdem bietet es integrierte Unterstützung für den Umgang mit Browser-Kontexten, Cookies und Speicherplatz. Playwright ist besser für komplexe Projekte geeignet.
Wie kann ich IP-Sperren vermeiden?
Im Allgemeinen können Sie versuchen, Ihre Anfragen zeitlich zu verteilen. Verwenden Sie verschiedene IPs. Verwenden Sie Proxys. Versuchen Sie, den Fingerabdruck des Browsers zu ändern. Für die meisten Menschen ist dies ein nicht enden wollender Kampf. Die gute Nachricht ist, dass es nicht so sein muss. Sie können unsere Lösung, WebScrapingAPI, verwenden. WebScrapingAPI stellt eine API zur Verfügung, die Ihnen die ganze Arbeit abnimmt. Sie kann JavaScript ausführen, Proxys rotieren lassen und sogar CAPTCHAs verarbeiten. Sie müssen sich keine Sorgen machen, dass Ihre IP gesperrt wird. Aber verlassen Sie sich nicht 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 die Extraktion 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?
Hier sehen Sie, wie Sie das in Selenium tun können:
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")
# holt alle h2-Elemente
content = driver.find_element(By.TAG_NAME, "h2")
print(content.text)
# Druckt 'Aus dem heutigen vorgestellten Artikel'
Wie kann man mit BeautifulSoup HTML-Elemente nach Text auswählen?
With BeautifulSoup, you can use the soup.find method with the text=re.compile("<text>") parameter:
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 nach Text mit Selenium aus?
In Selenium können Sie 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/Hauptseite")
# Ermittelt alle Elemente mit der Klasse vector-body
span = driver.find_element(By.XPATH, "//span[contains(text(), 'Did')]")
print(span.text)
# Druckt 'Did you know ...'
driver.quit()
Wie findet man HTML-Elemente mit CSS-Selektoren in BeautifulSoup?
Hier sehen Sie, wie Sie das mit BeautifulSoup und den Methoden find und find_all machen können:
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 nach Klasse mit Selenium?
Hier sehen Sie, wie Sie dies mit Selenium erreichen können:
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/Hauptseite")
# liefert alle Elemente mit der Klasse vector-body
elements = driver.find_elements(By.CLASS_NAME, "vector-body")
for element in elements:
print(element.text)
driver.quit()
Wie benutzt 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))
#Druckt ['Hauptseite', 'Willkommen bei ', 'Wikipedia']
Wie wartet man in Selenium auf das Laden der Seite?
Wenn Sie einfach nur eine bestimmte Zeit warten wollen, bevor die Suche nach einem Element abbricht, können Sie die Funktion driver.implicitly_wait(time_in_secods) 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")
# das Element existiert nicht, aber es wird 10 Sekunden darauf gewartet
text = element.text
print(text)
# Schließen Sie den Browser
driver.quit()
Sie können sich auch dafür entscheiden, zu 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")
# Warten, bis das Element mit der ID 'content' auf der Seite vorhanden ist
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)
# Den Browser schließen
driver.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.$() wird verwendet, um das erste Element zu finden, das dem Selektor entspricht. Die Funktion page.$$() wird verwendet, um 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 können Sie es mit Playwright machen. Es ist dem Puppeteer sehr ähnlich:
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?
Mit Cheerio müssen Sie das HTML abrufen (ich habe dazu die Request-Bibliothek verwendet) und es 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 können Sie 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();
})();
Bei jeder Selektorzeichenkette, die mit // oder .. beginnt, wird davon ausgegangen, dass es sich um einen xpath-Selektor handelt. Playwright konvertiert zum Beispiel "//html/body" in "xpath=//html/body".
Wie findet man HTML-Elemente anhand von Text in Puppeteer?
In Puppeteer ist es am einfachsten, Elemente über Text zu finden, indem man die XPath-Funktion text() verwendet:
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 nach 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 kann man in Puppeteer auf Selektoren warten?
In Puppeteer können Sie die Funktion page.waitForSelector() verwenden, um zu warten, bis ein bestimmtes Element auf der Seite erscheint, bevor Sie mit dem Skript fortfahren. Sie können diese Funktion 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 ms an.
Sie können auch warten, bis ein Element einen bestimmten Zustand erreicht hat:
await page.waitForSelector('.basic-element', { visible: true });
// wait until the element becomes visible
Wie kann man in Playwright auf Selektoren warten?
Playwright ist ähnlich wie Puppeteer. Sie können die Methode page.waitForSelector() verwenden, um darauf zu warten, dass ein bestimmtes Element auf der Seite erscheint.
await page.waitForSelector('.element-class', { timeout: 10000 });
Sie können auch warten, bis ein Element einen bestimmten Zustand erreicht hat:
await page.waitForSelector('.basic-element', { state: 'visible' });
// wait for element to become visible
Einpacken
Web Scraping ist ein umfangreiches Thema, und dieser Artikel deckt nur die Oberfläche ab. Die Wahl des richtigen Tools für Ihren speziellen Anwendungsfall ist entscheidend. Wenn Sie zum Beispiel eine Website mit JavaScript scrapen wollen, 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 bessere Wahl. Web-Scraping ist eine Herausforderung, aber wenn man die Tools versteht, kann man sich eine Menge Kopfschmerzen ersparen. Ich hoffe, dieser Artikel hat Ihren Blickwinkel erweitert, und ich wünsche Ihnen alles Gute bei Ihren Web-Scraping-Bemühungen.
Nachrichten und Aktualisierungen
Bleiben Sie auf dem Laufenden mit den neuesten Web Scraping-Anleitungen und Nachrichten, indem Sie unseren Newsletter abonnieren.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Ähnliche Artikel

Entdecken Sie die Komplexität des Scrapens von Amazon-Produktdaten mit unserem ausführlichen Leitfaden. Von Best Practices und Tools wie der Amazon Scraper API bis hin zu rechtlichen Aspekten erfahren Sie, wie Sie Herausforderungen meistern, CAPTCHAs umgehen und effizient wertvolle Erkenntnisse gewinnen.


Erforschen Sie den detaillierten Vergleich zwischen Scrapy und Selenium für Web Scraping. Von der Datenerfassung in großem Maßstab bis hin zum Umgang mit dynamischen Inhalten - entdecken Sie die Vor- und Nachteile sowie die einzigartigen Funktionen der beiden Frameworks. Erfahren Sie, wie Sie das beste Framework für die Anforderungen und den Umfang Ihres Projekts auswählen können.


Erforschen Sie einen detaillierten Vergleich zwischen Scrapy und Beautiful Soup, zwei führenden Web-Scraping-Tools. Verstehen Sie ihre Funktionen, Vor- und Nachteile und entdecken Sie, wie sie zusammen verwendet werden können, um verschiedene Projektanforderungen zu erfüllen.
