So erstellen Sie einen einfachen Suchbot in 30 Minuten

Wohnungssuche ist zum Kotzen, besonders in Montreal. Diese Anleitung zeigt Ihnen, wie Sie einen Bot bauen, der für Sie auf der Jagd bleibt. Auf diese Weise müssen Sie Ihre Suche nie wieder endlos aktualisieren.

Kontext

Im Gegensatz zu anderen Städten haben die meisten Leute, die Wohnungen in Montreal mieten, die gleiche Mietdauer. Neue Mietverträge beginnen im Juli, dauern 12 Monate und enden am 30. Juni. Man könnte argumentieren, dass dies viele Dinge vereinfacht - wie Verfügbarkeit und Erwartungen -, aber es bedeutet auch, dass der Wettbewerb stark ist.

Jeden Tag wachte ich auf, aktualisierte meine 10 geöffneten Kijiji-Seiten und schickte E-Mails, in denen ich mich nach allen neuen Anzeigen erkundigte. Ich würde das wieder zum Mittag- und Abendessen und vor dem Schlafengehen tun. Meine Rücklaufquote war niedrig - deutlich unter 10%. Wenn jemand antwortete, war seine Antwort normalerweise düster.

Mein nächster Schritt war, den Einsatz zu erhöhen und tatsächlich den Hörer abzunehmen. Das Anrufen machte meine Chancen etwas besser. Die Vermieter reagierten schneller, und diesmal waren normalerweise weniger als 10 Personen vor mir. Aber definitiv noch mehr als 5. Zurück zum Zeichenbrett.

Eines Tages, als ich mich bei einem Kollegen beschwerte, dass meine ganze Zeit von dieser Wohnungssuche gefressen wurde, dämmerte es mir. Ich könnte dieses Problem mit meinem Computer lösen.

Als ich nach Hause kam, schrieb ich ein kleines Programm, das Kijiji bei der Suche nach Änderungen beobachtet. Wenn es sie sieht, sendet es einen SMS-Text (Short Message Service) mit den relevanten Informationen an mein Telefon. Der Rest dieses Artikels wird erklären, wie ich das gemacht habe.

Hinweis: Für diejenigen, die sich nicht für das Tutorial interessieren, habe ich den Kijiji-Scraper hier als Open-Source-Repo bereitgestellt :?

Pad-Patrol bauen

Als ich von der Arbeit nach Hause kam, holte ich meinen Laptop heraus und schaltete mein Terminal ein. Ich wusste, dass das Programm leicht sein sollte, da ich es rund um die Uhr ausführen werde - oder zumindest bis ich eine Wohnung finde. Ich habe beschlossen, einfach ein einfaches Knotenskript zu erstellen, das ich von meinem Terminal aus ausführen kann.

Installieren

Angenommen, Sie haben nodeund npminstalliert, besteht der erste Schritt - eines beliebigen Knotenprojekts - darin, npm im Projektverzeichnis zu initialisieren.

Als nächstes erstellen wir ein srcVerzeichnis, in dem unser Code gespeichert wird.

Erstellen Sie im srcVerzeichnis eine index.jsDatei, in die unser Skript verschoben wird.

Sie können das so machen:

$ npm init // this will ask a few questions$ mkdir src$ cd src && touch index.js

Das Skript schreiben

Wenn ich ein Solo-Projekt mache, neige ich dazu, Freestyle-Sachen zu machen und sie dann zu reparieren (wohl der beste Weg, um zu lernen). Ich werde versuchen, meinen anfänglichen Denkprozess mit den folgenden Anweisungen nachzuahmen, aber lassen Sie mich wissen, ob sie überall zu sein scheinen.

Das allererste, was wir tun müssen, ist eine erfolgreiche Anfrage an Kijiji zu richten. Um sicherzustellen, dass wir eine angemessene Antwort erhalten, führen wir einen sehr einfachen Abruf durch.

Dazu müssen wir eine Anforderungsbibliothek installieren:

$ npm install request-promise

und fügen Sie dann Folgendes hinzu index.js:

Sobald dies gespeichert ist, können wir es ausführen $ node src/index.jsund es sollte ein HTML-Markup in unserer Konsole angezeigt werden. Schritt eins abgeschlossen - Einfach!

Da es uns nur wichtig ist, wenn sich der Inhalt ändert, können Sie einen einfachen Hash der Antwort erstellen. Auf diese Weise können wir die Antwort und die Hashes vergleichen. Für den Fall, dass wir unsere Ergebnisse protokollieren müssen, ist dies viel weniger umständlich als das rohe Markup.

Dazu können wir ein Hashing-Tool namens verwenden checksum:

$ yarn add checksum

und dann:

Ok cool, das hat funktioniert! Unsere 1500 HTML-Zeilen wurden auf 32 Stellen reduziert. Lassen Sie es uns jetzt in eine wiederverwendbare Funktion einwickeln:

Der obige Code erstellt einen Hash aus dem abgerufenen Wert. Beim folgenden Abruf werden dann die ursprünglichen und neuen Hashes verglichen.

Wenn sie unterschiedlich sind, wird es zurückkehren true. Das hat großartig funktioniert ... ein bisschen zu großartig. Wie Sie sehen werden, kehrt es truejedes Mal zurück?

Nach einer weiteren Überprüfung der Antwort vom Abruf können wir sehen, dass Kijiji einen Zeitstempel im Header hat. Dies bedeutet, dass der Hash bei jedem Abruf anders ist. Es ist wichtig zu beachten, dass dies auch aufgrund rotierender Anzeigen und einer Reihe anderer dynamischer Inhalte geschehen wäre.

Die Erkenntnis aus dem obigen Versehen besteht darin, Ihre Antwort immer sorgfältig zu überprüfen, wenn Sie sich mit einer API befassen, die Sie nicht geschrieben haben.

Dies bedeutet, dass wir auf granulare Teile des Markups zugreifen müssen. Installieren wir also ein Paket eines Drittanbieters, um die Antwort zu analysieren. Cheerio ist eine Bibliothek, die HTML-Markups aufnehmen und in eine zugängliche JavaScript-API verwandeln kann. Der Zweck war es, jQueryEntwicklern dabei zu helfen , nicht zu verwenden jQuery, aber Absichten werden überbewertet.

Für uns wird es ein gefälschter Satz von Chrome Developer Tools sein!

Um Cheerio auf diese Weise verwenden zu können, müssen wir wissen, worauf wir in unserem Markup achten müssen. Öffnen wir also Chrome und überprüfen Sie unsere URL.

Wenn wir die Anzeigen überprüfen, können wir sehen, dass alle Suchantworten die Klassen .search-itemund haben .regular-ad. Perfekt!

Wir können diejenigen mit Cheerio so auswählen:

Genau wie wir es geplant hatten, spuckt dies eine Reihe ordentlich organisierter Objekte aus. Gemäß der Dokumentation von Cheerio sind alle Attribute eines Elements in einem Schlüssel namens verschachtelt attribs. Wenn wir zu den Chrome Developer Tools zurückkehren, sehen wir, dass jede Anzeige ein eindeutiges Datenattribut namens ID hat. Lassen Sie uns darauf abzielen - ersetzen Sie den Code in Ihrer checkURLFunktion durch den folgenden:

rp(siteToCheck).then(response => { const $ = co.load(HTMLresponse); let apartmentString = "";
 // use cheerio to parse HTML response and find all search results $(".search-item.regular-ad").each((i, element) => { console.log(element.attribs["data-ad-id"]); });});

Ok, großartig, wir bekommen eine Liste mit eindeutigen ID-Nummern. Diese IDs sind die einzigen Informationen, die uns auf der Seite wichtig sind.

Kehren wir also zu unserem ursprünglichen Plan zurück, Hashes zu vergleichen, außer wir werden nur die eindeutigen IDs hashen:

Perfekt! Es funktioniert genau wie beabsichtigt. Wenn jemand eine neue Anzeige veröffentlicht (oder eine alte Anzeige entfernt, eine Einschränkung beim Beobachten der Reihenfolge der IDs), drucken wir truein unserer Konsole. Alles, was dazu übrig bleibt, ist das Einrichten unseres SMS-Tools.

Senden von SMS vom Terminal

Das ist eigentlich viel einfacher als es scheint. Dazu verwenden wir eine Software von Drittanbietern namens Twilio. Es macht viel, aber eine seiner Hauptfunktionen ist das Senden von SMS. Als Bonus hat es auch eine großartige JavaScript-API! Um das Tutorial zu beenden, benötigen Sie eines ihrer Konten - eine kostenlose Testversion ist mehr als genug, um herumzuspielen - und möglicherweise sogar eine neue Wohnung zu bekommen.

Ok, um zu beginnen, müssen wir laufen:

$ yarn add twilio

Von dort aus index.jskönnen Sie Twilio hinzufügen und eine neue Funktion mit dem Namen definieren SMS:

const twilio = require(twilio);
// you'll need to get your own credentials for this oneconst client = new Twilio("accountID", "authKey");
function SMS({ body, to, from }) { client.messages .create({ body, to, from }) .then(() => { console.log(`? Success! Message has been sent to ${to}`); }) .catch(err => { console.log(err); });} 

This simple function takes two phone numbers (to and from) and a message (body). Instead of console logging the result of our checkURL function, we can call SMS with whatever message we want:

There you have it! Every time our script sees a change between the site hashes, it will send a text message with the URL right to your phone ?.

Happy Hunting!

The actual script that I’ve built is a little more complicated than the above example — I’ve put it up as an open source repo on GitHub.

Eventually, I’d like to make some additions to it — the first of which will be making it more generic and not just a Kijiji scraper. It’s pretty basic, so it will be a great first-time project for new contributors.

Feel free to contribute in any way you see fit ?

Also, in case anyone was wondering, I just signed a lease last Sunday. The apartment I ended up renting was from the very first update pad-patrol sent me — it was destiny ✨

I’m currently working as a software developer at luxury fashion company in Montreal. I’ve been doing that for about a year, after finishing a web dev bootcamp last summer. I spend my free time learning hot new tech and, up until a few days ago, hunting for apartments.