Kako izraditi jednostavan bot za pretraživanje u 30 minuta

Lov na stanove je sranje, pogotovo u Montrealu. Ovaj vodič će vam pokazati kako izraditi bota koji će ostati na vrhu lova za vas. Na ovaj način nikada više nećete morati beskrajno osvježavati svoja pretraživanja.

Kontekst

Za razliku od ostalih gradova, većina ljudi koji iznajmljuju stanove u Montrealu imaju isti ugovor o najmu. Novi zakupi započinju u srpnju, traju 12 mjeseci, a završavaju 30. lipnja. Iako se može tvrditi da ovo pojednostavljuje mnoge stvari - poput dostupnosti i očekivanja - to također znači da je konkurencija velika.

Svaki dan bih se probudio, osvježio svojih 10 otvorenih Kijiji stranica i slao e-mailove s upitima o svim novim oglasima. To bih ponovio za vrijeme ručka, večere i prije spavanja. Moja stopa odgovora bila je niska - znatno ispod 10%. Kad bi netko odgovorio, njegov je odgovor obično bio mračan.

Sljedeći mi je korak bio povećati ante i zapravo podići telefon. Zvanje mi je malo poboljšalo šanse. Stanodavci su bili osjetljiviji, a ovaj put je ispred mene obično bilo manje od 10 ljudi. Ali definitivno i dalje više od 5. Natrag na ploču za crtanje.

Jednog dana, dok sam se žalio kolegi da me sve ovo vrijeme jede lov na stan - sinulo mi je. Mogao bih riješiti ovaj problem svojim računalom.

Kad sam se vratio kući, napisao sam mali program koji gleda kako Kijiji traži promjene. Kad ih vidi, na moj telefon šalje tekst usluge kratkih poruka (SMS) s relevantnim informacijama. Ostatak ovog članka objasnit će kako sam to učinio.

Napomena: za one kojima nije stalo do vodiča, ovdje sam stavio strugač Kijiji kao repo otvorenog koda:?

Izgradnja Pad-Patrole

Kad sam stigao kući s posla, izvadio sam laptop i upalio terminal. Znao sam da bi program trebao biti lagan, jer ću ga pokretati 24 sata dnevno, 7 dana u tjednu - ili barem dok ne pronađem stan. Odlučio sam samo napraviti jednostavnu skriptu čvora koju bih mogao izvršiti sa svog terminala.

Postaviti

Pod pretpostavkom da imate nodei npminstalirali, prvi korak - bilo kojeg projekta čvora - je inicijalizacija npm unutar direktorija projekta.

Dalje, kreirajmo srcdirektorij u kojem će živjeti naš kod.

Unutar srcdirektorija napravite index.jsdatoteku u koju će ići naša skripta.

To možete učiniti ovako:

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

Pisanje scenarija

Kad radim samostalni projekt, težim slobodnom stilu - lomim stvari, a zatim ih popravljam (vjerojatno najbolji način učenja). Pokušat ću oponašati svoj početni misaoni proces sljedećim uputama, ali javite mi ako se čine posvuda.

Prvo što moramo učiniti je uspješno zatražiti Kijiji. Da bismo bili sigurni da ćemo moći pravilno odgovoriti, napravimo vrlo osnovno dohvaćanje.

Da bismo to učinili, trebamo instalirati knjižnicu zahtjeva:

$ npm install request-promise

a zatim dodajte sljedeće u index.js:

Jednom kad se to spremi, možemo pokrenuti $ node src/index.jsi trebali bismo vidjeti neke HTML oznake u našoj konzoli. Prvi korak dovršen - Lako!

Budući da nam je stalo samo kada se sadržaj promijeni, omogućimo jednostavni raspršeni odgovor. Na taj način možemo usporediti odgovor i usporediti hasheve. U slučaju da trebamo prijaviti svoje rezultate, to će biti puno manje glomazno od neobrađene oznake.

Da bismo to učinili, možemo koristiti alat za raspršivanje nazvan checksum:

$ yarn add checksum

i onda:

Ok cool, ovo je uspjelo! Naših 1500 redaka HTML-a smanjeno je na 32 znamenke. Sad, umotajmo je u funkciju za višekratnu upotrebu:

Gornji kôd stvorit će raspršivanje od dohvaćene vrijednosti. Zatim će pri sljedećem dohvaćanju usporediti izvorno i novo raspršivanje.

Ako se razlikuju, vratit će se true. Ovo je izvrsno funkcioniralo ... kao, malo previše sjajno. Kao što ćete vidjeti, vraća se truesvaki put?

Nakon daljnje provjere odgovora iz dohvaćanja, možemo vidjeti da Kijiji ima vremensku oznaku u zaglavlju. To znači da će se hash razlikovati kod svakog dohvaćanja. Važno je napomenuti da bi se to moglo dogoditi i zbog rotiranja oglasa i hrpe drugog dinamičnog sadržaja.

Izvučeno iz gornjeg nadzora je uvijek pažljivo pregledati svoj odgovor kada se bavite API-jem koji niste napisali.

To znači da ćemo trebati pristupiti zrnastim bitovima oznake, pa instalirajmo paket treće strane koji će pomoći pri raščlanjivanju odgovora. Cheerio je knjižnica koja može unijeti HTML oznaku i pretvoriti je u pristupačni JavaScript API. Namjera mu je bila pomoći jQueryprogramerima da je ne koriste jQuery, ali namjere su precijenjene.

Za nas će to biti lažni skup alata za razvojne programere Chrome!

Kao preduvjet za korištenje Cheeria na ovaj način, moramo znati što tražiti u našem označavanju. Pa hajde da otvorimo Chrome i provjerimo naš URL.

Ako pregledamo oglase, možemo vidjeti da svi odgovori pretraživanja imaju klase .search-itemi .regular-ad. Savršen!

Možemo odabrati one s Cheeriom tako:

Baš kao što smo i planirali, ovo ispljuva niz uredno organiziranih predmeta. Prema Cheeriovoj dokumentaciji, svi atributi elementa ugniježđeni su u ključu tzv attribs. Ako se vratimo na Chrome Developer Tools, možemo vidjeti da svaki oglas ima jedinstveni atribut podataka koji se naziva ID. Ciljajmo to - zamijenite kod unutar checkURLfunkcije sljedećim:

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, sjajno, dobivamo popis jedinstvenih ID brojeva. Ovi su ID-ovi jedine informacije do kojih nam je stalo na stranici.

Pa, vratimo se našem izvornom planu usporedbe heševa, osim što ćemo raspršiti samo jedinstvene ID-ove:

Savršen! Radi točno onako kako je zamišljeno. Kad netko objavi novi oglas (ili ukloni stari oglas, upozorenje za praćenje redoslijeda osobnih iskaznica), ispisujemo truena našoj konzoli. Sve što je preostalo za to postavilo je naš alat za SMS.

Slanje SMS-a s terminala

Ovo je zapravo puno lakše nego što se čini. Da bismo to učinili, koristit ćemo softver treće strane nazvan Twilio. Dosta je toga, ali jedna od glavnih značajki je slanje SMS-a. Kao bonus, ima i sjajan JavaScript API! Da biste završili s vodičem, trebat će vam jedan od njihovih računa - besplatno probno razdoblje bit će više nego dovoljno za igranje - i možda čak i za dobivanje novog stana.

Ok, za početak moramo pokrenuti:

$ yarn add twilio

odatle, u index.jsomogućuje dodavanje Twilio i definiranje nove funkcije koja se zove 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.