knuspermagier.de

Der privateste Blog von Philipp.

Amazon Bestellhistorie mit dem Chrome Debugging Protocol scrapen

Stellt euch vor, ihr habt mal wieder monatelang eure Ausgaben nicht vernünftig kategorisiert. Kein Problem das meiste passiert ja automatisch, wären da nur nicht die 200 Transaktionen mit dem Betreff “Amazon.de”. Amazon schafft es natürlich, wie die meisten, nicht irgendeine sinnvolle Betreffzeile in die Kreditkartenabrechnung zu schieben, warum auch. Wahrscheinlich ist das gar nicht möglich bei Kreditkarten, hab ich nämlich noch nie gesehen. Naja, egal.

Ich weiß nun also, an welchem Tag Amazon welchen Betrag abgebucht hat, nun könnte ich einfach meine Bestell-Liste durchgehen und die Werte per Hand vergleichen. Das wäre natürlich einfach, aber auch langweilig und langwierig, denn natürlich habe ich im Jahr 2020 mal wieder viel zu viel bei Amazon bestellt. Zusätzlich teilt Amazon die Fresh-Bestellungen immer in tausende kleine Einzel-Transaktion und zeigt die natürlich nicht in der normalen Bestellübersicht an.

Immerhin gibt es unter “Ihre Transaktionen” eine Liste aller Abbuchungen. Man müsste also nur zwanzig Mal auf den "Nächste Seite” Button drücken und sich alles kopieren und schon weiß man, welche Transaktion zu welcher Bestellnummer gehört. Leider weiß man dadurch noch immer nicht, was man da eigentlich bestellte, also muss man auch noch jede Bestellung einzeln aufrufen und das nachschauen.

Tja, das schreit doch nach Automatisierung. Mein alter amazon-account-crawler basierte ja auf Ruby und mechanize, oder so, aber ich denke, dass Amazon mittlerweile sicherlich diverse Abwehrmechanismen gegen Automationen hat, daher probierte ich etwas neues: direkt einen Chrome fernsteuern.


Mit chrome-remote-interface funktioniert das ziemlich einfach. Der Beispielcode auf der npm-Seite zeigt schon relativ gut, wie mein Code dafür aussah, abgesehen von einem kurzen Javascript-Snippet um die notwendigen Daten zu extrahieren.

 const result = await Runtime.evaluate({
     expression: `let items = [];
let is_fresh = false;
let wrapper = document.querySelector('.a-box.shipment');
if (wrapper) {
    items = Array.from(wrapper.querySelectorAll(".a-row .a-col-right .a-row:first-child .a-link-normal")).map(i => {
        return {
            name: i.innerHTML.trim(),
            url: i.getAttribute('href'),
            price: i.parentNode.parentNode.querySelector('.a-color-price nobr').innerHTML
        }
    });
} else {
    is_fresh = true;
    wrapper = document.querySelector('#fx-order-details-box');
    items = Array.from(wrapper.querySelectorAll(".a-row .a-span7 .a-link-normal")).map(i => {
        return {
            name: i.innerHTML.trim(),
            url: i.getAttribute('href'),
            price: 0
        }
    });
}

JSON.stringify({
    items,
    is_fresh
});`
});

Wundervoll nicht? Also, das ist jetzt nur der zweite Teil, der dann die Bestellübersichten öffnet und die Produkte grabbt, damit ich am Ende weiß, was genau hinter den Transaktionen steckt.


Das ging auf jeden Fall schneller als gedacht. Lässt sich natürlich eher schwierig automatisieren, da Amazon ja an und zu ein Captcha ausspielt, aber letztendlich braucht man es ja nur einmal im Jahr. Oder vielleicht nie wieder, wenn man die Transaktionen einfach zeitnah zuordnet!

Kommentare, Feedback und andere Anmerkungen? Schreib mir eine E-Mail 🤓