de Quinn Langille

Cum să construiești un robot de căutare simplu în 30 de minute

Cum sa construiesti un robot de cautare simplu in 30

Vânătoarea de apartament e de rahat, mai ales în Montreal. Acest ghid vă va arăta cum să construiți un bot care să rămână în vârful vânătorii pentru dvs. În acest fel, nu va mai trebui niciodată să vă reîmprospătați fără sfârșit căutările.

Context

Spre deosebire de alte orașe, majoritatea oamenilor care închiriază apartamente în Montreal se află în același termen de închiriere. Noile contracte de leasing încep în iulie, durează 12 luni și se încheie pe 30 iunie. Deși s-ar putea susține că acest lucru simplifică o mulțime de lucruri – cum ar fi disponibilitatea și așteptările – înseamnă, de asemenea, că concurența este abruptă.

În fiecare zi mă trezeam, îmi reîmprospătam 10 deschise Kijiji pagini și trimiteți e-mailuri care vă întreabă despre toate anunțurile noi. Aș face asta din nou la prânz, cină și înainte de culcare. Rata mea de răspuns a fost scăzută – mult sub 10%. Când cineva răspundea, răspunsul lor era de obicei sumbru.

Următorul meu pas a fost să ridic ante-ul și să ridic de fapt telefonul. Apelurile mi-au făcut șansele puțin mai bune. Proprietarii au fost mai receptivi și de această dată erau de obicei mai puțin de 10 persoane în fața mea. Dar cu siguranță încă mai mult de 5. Înapoi la planșă.

ad-banner

Într-o zi, în timp ce mă plângeam unui coleg de serviciu că tot timpul meu mă mânca de această vânătoare de apartamente – mi-a venit în minte. Aș putea rezolva această problemă cu computerul meu.

Când am ajuns acasă am scris un mic program care urmărește Kijiji căutând modificări. Când îi vede, îmi trimite un mesaj Serviciu de mesaje scurte (SMS) pe telefonul meu cu informațiile relevante. Restul acestui articol va explica cum am făcut asta.

Notă: pentru cei cărora nu le pasă de tutorial, am pus răzuitorul Kijiji ca repo open source aici😕

Clădire Pad-Patrol

Când am ajuns acasă de la serviciu, mi-am scos laptopul și mi-am dat foc terminalului. Știam că programul ar trebui să fie ușor, deoarece îl voi rula 24/7 – sau cel puțin până când voi găsi un apartament. Am decis să construiesc doar un script de nod simplu pe care să-l pot executa de la terminalul meu.

Înființat

Presupunând că ai node și npm instalat, primul pas – al oricărui proiect nod – este inițializarea npm în directorul proiectului.

Apoi, să creăm un src director unde va locui codul nostru.

În interiorulsrc director, creați un index.js fișierul unde va merge scriptul nostru.

Puteți face asta așa:

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

Scrierea scenariului

Când fac un proiect solo, tind să fac freestyle – să rup lucruri și apoi să le rezolv (probabil cel mai bun mod de a învăța). Voi încerca să imit procesul de gândire inițială cu următoarele instrucțiuni, dar anunțați-mi dacă par peste tot.

Primul lucru pe care trebuie să-l facem este să facem o solicitare cu succes către Kijiji. Pentru a ne asigura că putem obține un răspuns adecvat, să facem o preluare foarte simplă.

Pentru a face acest lucru, va trebui să instalăm o bibliotecă de solicitări:

$ npm install request-promise

și apoi adăugați următoarele la index.js:

Odată ce este salvat, putem alerga $ node src/index.js și ar trebui să vedem niște marcaje HTML în consola noastră. Pasul unu completat – Ușor!

Deoarece nu ne pasă decât atunci când conținutul se schimbă, să facem un hash simplu al răspunsului. În acest fel, putem compara răspunsul și putem compara hashurile. În cazul în care trebuie să ne înregistrăm rezultatele, acest lucru va fi mult mai puțin greoi decât marcajul brut.

Pentru a face acest lucru, putem folosi un instrument de hashing numit checksum:

$ yarn add checksum

și apoi:

Ok cool, a funcționat! Cele 1500 de linii HTML ale noastre au fost reduse la 32 de cifre. Acum, să-l înfășurăm într-o funcție reutilizabilă:

Codul de mai sus va crea un hash din valoarea preluată. Apoi, la următoarea preluare, va compara hashurile originale și cele noi.

Dacă sunt diferiți, se va întoarce true. A funcționat grozav … cam, prea grozav. După cum veți vedea, se întoarce true de fiecare data ?

După o inspecție suplimentară a răspunsului de la preluare, putem vedea că Kijiji are un marcaj de timp în antet. Aceasta înseamnă că hash-ul va fi diferit la fiecare preluare. Este important să rețineți că acest lucru s-ar fi întâmplat și din cauza reclamei rotative și a unei grămezi de alte conținuturi dinamice.

Luarea de la supravegherea de mai sus este să vă inspectați întotdeauna cu atenție răspunsul atunci când aveți de-a face cu un API pe care nu l-ați scris.

Aceasta înseamnă că va trebui să accesăm biți granulari ai marcajului, așa că haideți să instalăm un pachet terță parte pentru a ajuta la analiza răspunsului. Cheerio este o bibliotecă care poate ingera marcarea HTML și o poate transforma într-un API JavaScript accesibil. Scopul intenționat a fost de a ajuta jQuery dezvoltatorii nu folosesc jQuery, dar intențiile sunt supraevaluate.

Pentru noi, va fi un set fals de instrumente pentru dezvoltatori Chrome!

Ca o condiție prealabilă pentru utilizarea Cheerio în acest mod, trebuie să știm ce să căutăm în marcajul nostru. Deci, haideți să deschidem Chrome și să inspectăm adresa URL.

Dacă inspectăm anunțurile, putem vedea că toate răspunsurile de căutare au clasele .search-item și .regular-ad. Perfect!

Îi putem selecta pe cei cu Cheerio astfel:

La fel cum am planificat, acest lucru scuipă o serie de obiecte bine organizate. Conform documentației lui Cheerio, toate atributele unui element sunt imbricate într-o cheie numită attribs. Dacă ne întoarcem la Instrumentele pentru dezvoltatori Chrome, putem vedea că fiecare anunț are un atribut de date unic numit ID. Să vizăm asta – înlocuiți codul din interiorul dvs. checkURL funcționează cu următoarele:

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, grozav, primim o listă de numere de identificare unice. Aceste ID-uri sunt singurele informații care ne interesează pe pagină.

Deci, să ne întoarcem la planul nostru original de comparare a hashurilor, cu excepția faptului că vom hash doar ID-urile unice:

Perfect! Funcționează exact așa cum se intenționează. Când cineva postează un anunț nou (sau elimină un anunț vechi, avertismentul privind urmărirea ordinii ID-urilor), imprimăm true în consola noastră. Tot ce mai rămâne de făcut, configurați instrumentul nostru SMS.

Trimiterea de SMS-uri de la terminal

Acest lucru este de fapt mult mai ușor decât pare. Pentru a face acest lucru, vom folosi un software terță parte numit Twilio. Face multe, dar una dintre caracteristicile sale de bază este trimiterea de SMS-uri. Ca bonus, are și un API JavaScript excelent! Pentru a termina tutorialul, veți avea nevoie de unul dintre ele conts – o încercare gratuită va fi mai mult decât suficientă pentru a vă juca – și poate chiar pentru a obține un apartament nou.

Ok, deci pentru a începe trebuie să rulăm:

$ yarn add twilio

de acolo, în index.js permite să adăugăm Twilio și să definim o nouă funcție numită 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);    });} 

Această funcție simplă necesită două numere de telefon (to și from) și un mesaj (body). În loc să consolăm înregistrarea rezultatului nostru checkURL funcție, putem apela SMS cu orice mesaj dorim:

Iată-l! De fiecare dată când scriptul nostru vede o schimbare între hash-urile site-ului, acesta va trimite un mesaj text cu adresa URL direct pe telefonul dvs.?.

Vanatoare placuta!

Scriptul real pe care l-am construit este puțin mai complicat decât exemplul de mai sus – l-am pus ca repo sursă deschisă GitHub.

În cele din urmă, aș dori să aduc câteva adăugiri la acesta – primul dintre acestea îl va face mai generic și nu doar un răzuitor Kijiji. Este destul de simplu, deci va fi un proiect minunat pentru prima dată pentru noii colaboratori.

Simțiți-vă liber să contribuiți în orice mod considerați potrivit?

De asemenea, în caz că cineva se întreabă, tocmai am semnat un contract de închiriere duminica trecută. Apartamentul pe care am ajuns să-l închiriez a fost chiar de la prima actualizare pe care mi-a trimis-o patrulă – a fost destinul ✨

În prezent lucrez ca dezvoltator de software la o companie de modă de lux din Montreal. Fac asta de aproximativ un an, după ce am terminat un web dev bootcamp vara trecuta. Îmi petrec timpul liber învățând noi tehnologii fierbinți și, până acum câteva zile, vânând apartamente.