Web Scraping

Diskutiere Web Scraping im Java Basics - Anfänger-Themen Bereich.
N

Nexuz89

Die letzte Zeile stellt den Spaß einfach als JSON-String dar. Du kannst es darstellen, wie Du möchtest. Zum Beispiel kannst Du products.map(productObject).map(p => '"' + p.title + '",' + p.price + ',"' + p.url + '"').join('\n') schreiben, dann bekommst Du eine CSV-like-Ausgabe.
Da ich ein echter Anfänger bin :/ könntest du mir den Code vollständig schreiben... Danke
 
N

Nexuz89

Die letzte Zeile stellt den Spaß einfach als JSON-String dar. Du kannst es darstellen, wie Du möchtest. Zum Beispiel kannst Du products.map(productObject).map(p => '"' + p.title + '",' + p.price + ',"' + p.url + '"').join('\n') schreiben, dann bekommst Du eine CSV-like-Ausgabe.

Ich bekomme leider ein Syntex fehler, :/ an was könnte dass liegen ?
 

Anhänge

MoxxiManagarm

MoxxiManagarm

Die Zeile von mihe fehlt da, daher ist products undefined
Code:
const products = Array.prototype.map.call(document.querySelectorAll("div[data-producttile-wrapper]"), e => e)
 
mihe7

mihe7

Du könntest Dir auch Tampermonkey installieren und dann das folgende Script reinkopieren:
Javascript:
// ==UserScript==
// @name         coop2csv
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  coop2csv
// @author       mihe7
// @match        https://www.coop.ch/de/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    window.setTimeout(installButton, 1000)

    function installButton() {
        const elem = document.createElement('button')
        elem.innerText = 'Copy'
        elem.style = 'z-index: 1000; position:fixed; top:0; left:0';
        document.body.appendChild(elem);
        elem.addEventListener('click', _ => exportCsv())
    }

    function exportCsv() {
        let products = Array.prototype.map.call(document.querySelectorAll("div[data-producttile-wrapper]"), e => e)
        let csv = products.map(productObject).map(p => '"' + p.title + '",' + p.price + ',"' + p.url + '"').join('\n')
        console.log(csv)
        navigator.clipboard.writeText(csv)
            .then(_ => window.alert('In Zwischenablage kopiert'),
                  _ => window.alert('Fehler beim Kopieren in Zwischenablage'))
    }

    function productObject(e) {
        const result = {};
        result.title = e.querySelector('h2').innerText.trim()
        result.price = e.querySelector('dd[data-product-price]').innerText
        result.url = e.querySelector('a').href
        return result
    }
})();
Wenn Du die Seite dann lädst, sollte nach etwa einer Sekunde oben ein Copy-Button erscheinen. Wenn Du auf diesen klickst, wird das CSV erzeugt, in der Konsole ausgegeben und, wenn Du Glück hast, in die Zwischenablage kopiert.
 
N

Nexuz89

Vielen dank

könnte ich in Excel VBA ein Makro schreiben der die Text Datei in eine Excel Tabelle einfügt ?
 
mihe7

mihe7

Klar, aber warum nicht einfach per Strg+V bzw. Strg+Shift+V einfügen?
 
N

Nexuz89

Klar, aber warum nicht einfach per Strg+V bzw. Strg+Shift+V einfügen?
Da es bestimmt über 10ts daten sind,
Ich hab schon ein Code entworfen bei Excel VBA leider stimmt der Code nicht ganz könnte da evtl jemand rüber schauen ?

Vielen dank

Sub InformationenImportieren()
'Variablen Definieren
Dim QuellDatei As String 'SpeicherOrt der TextDatei
Dim Zeile As Integer 'Laufvariable
Dim Inhalt As String 'Inhalt der TextDatei
Dim Information() As String 'Array der TextDatei
Dim i As Integer 'Laufvariable2
'Fehlermarker einf?gen

'Tabllenblatt aktivieren
ThisWorkbook.Worksheets("Milch-k?se").Activate
'Startwerte zuweisen
Zeile = 2
'QuellDatei ansprechen
QuellDatei = "C:\Users\Marcel\Desktop\Milch-K?se.txt"
'QuellDatei ?ffnen
Open QuellDatei For Input As #1
'Informationen in das Tabellenblatt eintragen
Do While Not EOF(1) 'Schleifen bis DatenEnde

'inhalt der Quelldatei zeilenweisen einlesen
Line Input #1, Inhalt
Informationen = Split(Inhalt, ",")
For i = 0 To UBound(Informationen)
'Infos , auf die richitig spalte aufteilen
If IsNumeric(Informationen(i)) Then
'wenn der wert im Array ein Name ist
ActiveSheet.Cells(Zeile, 2) = Informationen(i)
Else
'wenn der Wert im Array eine Zahl ist
ActiveSheet.Cells(Zeile, 1) = Informationen(i)
End If
Next
Zeile = Zeile + 1
Loop
'quelldatei schliessen
Close #1

End Sub
 
mihe7

mihe7

Äh, Dir ist schon klar, dass Excel CSV-Dateien verarbeiten kann? Daten -> Aus Text ...
 
N

Nexuz89

Du könntest Dir auch Tampermonkey installieren und dann das folgende Script reinkopieren:
Javascript:
// ==UserScript==
// @name         coop2csv
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  coop2csv
// @author       mihe7
// @match        https://www.coop.ch/de/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    window.setTimeout(installButton, 1000)

    function installButton() {
        const elem = document.createElement('button')
        elem.innerText = 'Copy'
        elem.style = 'z-index: 1000; position:fixed; top:0; left:0';
        document.body.appendChild(elem);
        elem.addEventListener('click', _ => exportCsv())
    }

    function exportCsv() {
        let products = Array.prototype.map.call(document.querySelectorAll("div[data-producttile-wrapper]"), e => e)
        let csv = products.map(productObject).map(p => '"' + p.title + '",' + p.price + ',"' + p.url + '"').join('\n')
        console.log(csv)
        navigator.clipboard.writeText(csv)
            .then(_ => window.alert('In Zwischenablage kopiert'),
                  _ => window.alert('Fehler beim Kopieren in Zwischenablage'))
    }

    function productObject(e) {
        const result = {};
        result.title = e.querySelector('h2').innerText.trim()
        result.price = e.querySelector('dd[data-product-price]').innerText
        result.url = e.querySelector('a').href
        return result
    }
})();
Wenn Du die Seite dann lädst, sollte nach etwa einer Sekunde oben ein Copy-Button erscheinen. Wenn Du auf diesen klickst, wird das CSV erzeugt, in der Konsole ausgegeben und, wenn Du Glück hast, in die Zwischenablage kopiert.

Könntest du mir noch ein Code schreiben für Migros.ch schreiben dann kann ich vergleichen wie ich den Code in Zukunft umschreiben muss wäre echt nice
 
mihe7

mihe7

Im Prinzip musst Du halt einfach schauen, über welche Elemente Du an die benötigten Informationen kommst, deren CSS-Selektoren bestimmen, per querySelector bzw. querySelectorAll die Elemente rausfischen und z. B. per innerText oder auch href die gewünschten Inhalte extrahieren.

Für Migros könnte funktionieren:

Javascript:
// ==UserScript==
// @name         micros2csv
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       mihe7
// @match        https://produkte.migros.ch/sortiment/supermarkt/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    window.setTimeout(installButton, 1000)

    function installButton() {
        const elem = document.createElement('button')
        elem.innerText = 'Copy'
        elem.style = 'z-index: 1000; position:fixed; top:0; left:0';
        document.body.appendChild(elem);
        elem.addEventListener('click', _ => exportCsv())
    }

    function exportCsv() {
        let products = Array.prototype.map.call(document.querySelectorAll("article[data-testid='msrc-articles--article'"), e => e)
        let csv = products.map(productObject).map(p => '"' + p.title + '",' + p.price + ',"' + p.url + '"').join('\n')
        console.log(csv)
        navigator.clipboard.writeText(csv)
            .then(_ => window.alert('In Zwischenablage kopiert'),
                  _ => window.alert('Fehler beim Kopieren in Zwischenablage'))
    }

    function productObject(e) {
        const result = {};
        result.title = e.querySelector('[data-testid="msrc-articles--article-name"').innerText
        result.price = e.querySelector('[data-testid="msrc-articles--article-price"').innerText
        result.url = e.querySelector('[data-testid="msrc-articles--article-link"').href
        return result
    }
})();
 
N

Nexuz89

Im Prinzip musst Du halt einfach schauen, über welche Elemente Du an die benötigten Informationen kommst, deren CSS-Selektoren bestimmen, per querySelector bzw. querySelectorAll die Elemente rausfischen und z. B. per innerText oder auch href die gewünschten Inhalte extrahieren.

Für Migros könnte funktionieren:

Javascript:
// ==UserScript==
// @name         micros2csv
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       mihe7
// @match        https://produkte.migros.ch/sortiment/supermarkt/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    window.setTimeout(installButton, 1000)

    function installButton() {
        const elem = document.createElement('button')
        elem.innerText = 'Copy'
        elem.style = 'z-index: 1000; position:fixed; top:0; left:0';
        document.body.appendChild(elem);
        elem.addEventListener('click', _ => exportCsv())
    }

    function exportCsv() {
        let products = Array.prototype.map.call(document.querySelectorAll("article[data-testid='msrc-articles--article'"), e => e)
        let csv = products.map(productObject).map(p => '"' + p.title + '",' + p.price + ',"' + p.url + '"').join('\n')
        console.log(csv)
        navigator.clipboard.writeText(csv)
            .then(_ => window.alert('In Zwischenablage kopiert'),
                  _ => window.alert('Fehler beim Kopieren in Zwischenablage'))
    }

    function productObject(e) {
        const result = {};
        result.title = e.querySelector('[data-testid="msrc-articles--article-name"').innerText
        result.price = e.querySelector('[data-testid="msrc-articles--article-price"').innerText
        result.url = e.querySelector('[data-testid="msrc-articles--article-link"').href
        return result
    }
})();
Vielen dank

habe ich es mit lidl probiert leider funzt es nicht weis nicht was ich falsch mache
 

Anhänge

N

Nexuz89

Hier sind product, name und product-item-name CSS-Klassen. Die werden mit Punkt selektiert: "strong.product.name.product-item-name"

Hi ich hab da eine Idee ich hab ca 30 shop von denen ich den Code brauche bzw. die daten ! bist du evtl. interessiert mir dabei zu helfen und dafür belohnt zu werden ?
 
L

LimDul

Hi ich hab da eine Idee ich hab ca 30 shop von denen ich den Code brauche bzw. die daten ! bist du evtl. interessiert mir dabei zu helfen und dafür belohnt zu werden ?
An der Stelle mal ein kleiner Hinweis, da es nicht mehr nach einem reinen Hobby-Projekt aussieht. Das Scraping der Preis-Daten ist mindestens ein rechtlicher Graubereich, vermutlich eher verboten. Sprich, dafür kann dir unter Umständen eine Abmahnung ins Haus flattern.
 
N

Nexuz89

wäre echt nice wenn du die seiten noch auslesen würdest.


würde dir echt dankbar sein
 
J

JustNobody

Der Weg wurde doch beschrieben. Woran scheitert die Umsetzung auf Deiner Seite?
 
N

Nexuz89

ich hab es die letzten 4 stunden versucht selber zumachen, leider scheiter es an diesen punkten:
  1. function productObject(e) {
  2. const result = {};
  3. result.title = e.querySelector('h2').innerText.trim()data-t-id
  4. result.price = e.querySelector('dd[data-product-price]').innerText
  5. result.url = e.querySelector('a').href
  6. return result
Ich weiss leider nicht wie ich den Http code auslese, ich erkenne die elemente nicht bzw sind sie immer anderest geschrieben :/
 
Thema: 

Web Scraping

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben