Häufige Fragen über Web Scraping - Antworten und Tipps

Mihai Maxim am 03. März 2023

blog-image

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

Vorschaubild
LeitfädenWie man Amazon-Produktdaten scrappt: Ein umfassender Leitfaden zu Best Practices & Tools

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.

Suciu Dan
Autorenavatar
Suciu Dan
15 Minuten lesen
Vorschaubild
Wissenschaft des Web ScrapingScrapy vs. Selenium: Ein umfassender Leitfaden zur Auswahl des besten Web-Scraping-Tools

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.

WebscrapingAPI
Autorenavatar
WebscrapingAPI
14 Minuten lesen
Vorschaubild
LeitfädenScrapy vs. Beautiful Soup: Ein umfassender Vergleichsleitfaden für Web-Scraping-Tools

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.

WebscrapingAPI
Autorenavatar
WebscrapingAPI
10 Minuten lesen