Ein Web-Crawler oder Spider ist eine Art Bot, der eine Website durchläuft und mithilfe von benutzerdefinierten Feldern über CSS-Selektoren Daten extrahiert. Ein Crawler kann alle Links einer Seite extrahieren und bestimmte davon (wie Paginierungslinks) nutzen, um weitere Daten zu crawlen.
Es ist an der Zeit, die Grundlage für den Crawler zu schaffen: Erstellen Sie die Datei ebay_scraper.ex im Ordner lib/elixir_spider und fügen Sie den folgenden Code ein:
# lib/elixir_spider/ebay.ex
defmodule EbayScraper do
use Crawly.Spider
@impl Crawly.Spider
def base_url(), do: ""
@impl Crawly.Spider
def init() do
end
@impl Crawly.Spider
def parse_item(response) do
end
end
Dies ist lediglich das Grundgerüst der Datei; sie wird noch nicht ausgeführt und liefert keine Ergebnisse. Lassen Sie uns zunächst die einzelnen Funktionen besprechen und sie dann nacheinander ausfüllen.
Die Funktion `base_url()` wird einmal aufgerufen und gibt die Basis-URL der Zielwebsite zurück, die der Crawler scrapen soll; sie wird auch verwendet, um externe Links zu filtern und zu verhindern, dass der Crawler ihnen folgt. Du willst ja nicht das gesamte Internet scrapen.
@impl Crawly.Spider
def base_url(), do: "https://www.ebay.com/"
Die Funktion init() wird einmal aufgerufen und dient dazu, den Standardzustand für den Crawler zu initialisieren; in diesem Fall gibt die Funktion die start_url zurück, von der aus das Scraping beginnen soll.
Ersetze deine leere Funktion durch diese:
@impl Crawly.Spider
def init() do
[start_urls: ["https://www.ebay.com/sch/i.html?_nkw=ps5"]]
end
Die gesamte Magie der Datenextraktion findet in der Funktion `parse_item()` statt. Diese Funktion wird für jede gecrawlte URL aufgerufen. Innerhalb dieser Funktion verwenden wir den Floki-HTML-Parser, um die benötigten Felder zu extrahieren: Titel, URL und Preis.
Die Funktion sieht wie folgt aus:
@impl Crawly.Spider
def parse_item(response) do
# Parse response body to document
{:ok, document} = Floki.parse_document(response.body)
# Create item (for pages where items exists)
items =
document
|> Floki.find(".srp-results .s-item")
|> Enum.map(fn x ->
%{
title: Floki.find(x, ".s-item__title span") |> Floki.text(),
price: Floki.find(x, ".s-item__price") |> Floki.text(),
url: Floki.find(x, ".s-item__link") |> Floki.attribute("href") |> Floki.text(),
}
end)
%{items: items}
end
Wie du vielleicht bemerkt hast, verwenden wir die Klassen, die wir im Abschnitt „Erste Schritte – Das Ziel untersuchen“ gefunden haben, um die benötigten Daten aus den DOM-Elementen zu extrahieren.