Sådan oprettes en simpel søgebot på 30 minutter

Lejlighedsjagt stinker, især i Montreal. Denne guide viser dig, hvordan du bygger en bot, der forbliver på toppen af ​​jagten på dig. På denne måde behøver du aldrig at uendeligt opdatere dine søgninger igen.

Sammenhæng

I modsætning til andre byer er de fleste mennesker, der lejer lejligheder i Montreal, på samme lejeperiode. Nye lejekontrakter starter i juli, varer 12 måneder og slutter den 30. juni. Mens man kunne argumentere for, at dette forenkler mange ting - såsom tilgængelighed og forventninger - betyder det også, at konkurrencen er stejl.

Hver dag vågnede jeg op, opdaterede mine 10 åbne Kijiji-sider og sendte e-mails forespørgsel om alle de nye annoncer. Jeg ville gøre dette igen til frokost, middag og før sengetid. Min svarprocent var lav - langt under 10%. Når nogen svarede, var deres svar normalt dystre.

Mit næste skridt var at løfte ante og faktisk tage telefonen. Opkald gjorde mine chancer lidt bedre. Udlejere var mere lydhøre, og denne gang var der normalt mindre end 10 mennesker foran mig. Men bestemt stadig mere end 5. Tilbage til tegnebrættet.

En dag mens jeg klagede til en kollega om, at al min tid blev spist af denne lejlighedsjagt - gik det op for mig. Jeg kunne jeg løse dette problem med min computer.

Da jeg kom hjem, skrev jeg et lille program, der ser Kijiji søge efter ændringer. Når den ser dem, sender den en SMS-tekst (Short Message Service) til min telefon med de relevante oplysninger. Resten af ​​denne artikel vil forklare, hvordan jeg gjorde det.

Bemærk: For dem der ikke er ligeglade med vejledningen, har jeg sat Kijiji-skraberen op som en open source-repo her:?

Building Pad-Patrol

Da jeg kom hjem fra arbejde, fik jeg min bærbare computer ud og fyrede min terminal op. Jeg vidste, at programmet skulle være let, da jeg kører det 24/7 - eller i det mindste indtil jeg finder en lejlighed. Jeg besluttede bare at opbygge et simpelt node-script, som jeg kunne udføre fra min terminal.

Opsætning

Forudsat at du har nodeog npminstalleret, er det første trin - i ethvert knudeprojekt - at initialisere npm inde i projektmappen.

Lad os derefter oprette en srcmappe, hvor vores kode vil bo.

Opret srcen index.jsfil inde i biblioteket, hvor vores script vil gå.

Du kan gøre det sådan:

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

Skrivning af manuskriptet

Når jeg laver et soloprojekt, har jeg tendens til at freestyle - bryde ting og derefter rette det (uden tvivl den bedste måde at lære) på. Jeg vil prøve at efterligne min oprindelige tankeproces med følgende instruktioner, men lad mig vide, hvis de ser ud overalt.

Den allerførste ting, vi skal gøre, er at stille en vellykket anmodning til Kijiji. For at sikre, at vi er i stand til at få et ordentligt svar, lad os lave en meget grundlæggende hentning.

For at gøre det skal vi installere et anmodningsbibliotek:

$ npm install request-promise

og tilføj derefter følgende til index.js:

Når det er gemt, kan vi køre, $ node src/index.jsog vi skal se nogle HTML-markeringer i vores konsol. Trin et komplet - let!

Fordi vi kun er interesserede, når indhold ændres, kan vi lave en simpel hash af svaret. På den måde kan vi sammenligne svaret og sammenligne hashene. I tilfælde af at vi skal logge vores resultater, vil dette være meget mindre besværligt end den rå markering.

For at gøre dette kan vi bruge et hashing-værktøj kaldet checksum:

$ yarn add checksum

og så:

Ok cool, dette fungerede! Vores 1500 linjer med HTML er skåret ned til 32 cifre. Lad os nu pakke det ind i en genanvendelig funktion:

Ovenstående kode opretter en hash fra den hentede værdi. Derefter sammenligner den den oprindelige og nye hash ved den følgende hentning.

Hvis de er forskellige, vender det tilbage true. Dette fungerede godt ... ligesom lidt for godt. Som du vil se, vender det tilbage truehver gang?

Efter yderligere inspektion af svaret fra hentningen kan vi se, at Kijiji har et tidsstempel i overskriften. Dette betyder, at hashen vil være forskellig på hver hentning. Det er vigtigt at bemærke, at dette også ville være sket på grund af roterende annoncer og en masse andet dynamisk indhold.

Takeaway fra ovenstående tilsyn er altid nøje at inspicere dit svar, når du beskæftiger dig med en API, du ikke skrev.

Dette betyder, at vi bliver nødt til at få adgang til kornede bits i markeringen, så lad os installere en tredjepartspakke for at hjælpe med at analysere svaret. Cheerio er et bibliotek, der kan indtage HTML-markering og gøre det til en tilgængelig JavaScript API. Det tilsigtede formål var at hjælpe jQueryudviklere med ikke at bruge jQuery, men intentioner er overvurderede.

For os bliver det et falsk sæt Chrome Developer Tools!

As a pre-requisite to using Cheerio in this way, we need to know what to look for in our markup. So let’s bust open Chrome and inspect our URL.

If we inspect at the ads, we can see all search responses have the classes .search-item and .regular-ad. Perfect!

We can select those with Cheerio like so:

Just like we had planned, this spits out an array of neatly organized objects. According to Cheerio’s documentation, all attributes of an element are nested in a key called attribs. If we go back to the Chrome Developer Tools, we can see that each ad has a unique data-attribute called ID. Let’s target that — replace the code inside your checkURL function with the following:

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 great, we’re getting a list of unique ID numbers. These ID’s are the only information we care about on the page.

So let’s go back to our original plan of comparing hashes, except we’ll only hash the unique IDs:

Perfect! It’s working exactly as intended. When someone posts a new ad (or removes an old ad, a caveat of watching the order of IDs) we print true in our console. All that’s left to do it set up our SMS tool.

Sending SMS from the Terminal

This is actually much easier than it seems. To do this we’ll use a third party software called Twilio. It does a lot, but one of it’s core features is to send SMS. As a bonus, it also has great JavaScript API! To finish the tutorial, you’ll need one of their accounts — a free trial will be more than enough to play around — and maybe even get a new apartment.

Ok, so to start we need to run:

$ yarn add twilio

from there, in index.js lets add Twilio and define a new function called 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 ?

Også, hvis nogen spekulerede på, underskrev jeg netop en lejekontrakt sidste søndag. Lejligheden, som jeg endte med at leje, var fra den allerførste opdatering, pad-patrulje sendte mig - det var skæbnen ✨

Jeg arbejder i øjeblikket som softwareudvikler hos luksusmodefirmaet i Montreal. Jeg har gjort det i omkring et år efter at have afsluttet et web dev bootcamp sidste sommer. Jeg bruger min fritid på at lære varm ny teknologi og indtil indtil for et par dage siden på jagt efter lejligheder.