Obiectiv: import numar mare d epagini dintr-un site extern
Etapele de construire a solutiei tehnice: Analiza. Proiectare. implementare. Testare. Corectare. Lansare
Analiza + Proiectare
Ne bazam pe webscrapping.
Initializare: import toate anunturile existente pana in momentul de fata.
Provocare: cantitate mare de date care impun limitarti si solutii tehnice de lucru functionale
Ne trebuie o lista de pagini. Cum construiesc lista?
Solutie: intru pe lista de autoturisme (autovit.ro/autoturisme) care afiseaza anunturile auto descrescator in ordinea datei de publicare. Au prioritate anunturile promovate, care nu respecta aceasta ordine.
Dar sunt zeci de mii / 20 cate sunt pe pagina – ia o viata sa strang toate anunturile prin webscraping
Atunci tine seama de sablon url: https://www.autovit.ro/autoturisme/?page=x
Folosesc un program de descarcare site-uri (HTTrack).
Generez un fisier .txt lista de url-uri dupa sablonul de mai sus: https://www.autovit.ro/autoturisme/?page=x
Creez un proiect in HTTRACK si livrez fisierul .txt. Configurez sa descarce doar paginile html (liste de anunturi pe autovit.ro)
La final obtin html-urile pe care le slavez intr-un director lista-anunturi
Parcurg directorul si parsez fiecare html cu url-urile obtinute construiesc acum lista mult mai mare (~23000 de url-uri) cu url-urile paginilor de anunturi site-ului
Salvez lista in format .txt i o livrez catre HTTRACK pentru importul tuturor paginilor html de anunturi
Dupa import, le sparg in mai multe directoare (cate 1000 per director) si le urc online (obtinerea listei numarul 2 am facut-o local, pentru viteza, pentur ca nu aveam nevoie de baza de date autohint.ro – site-ul agregator de anutnuri auto)
Acum rulez scriptul care parcurge fiecare director, ia fiecare fisier html, il parseaza, extrage datele anuntului (depinde de su=rsa html a paginii; implica functii PHP regexp) adaug marca/model daca nu exista in autohint.ro si inserez noul anunt (am pregatit in prelabil vectorul de insert); daca este ok, sterg html-ul din director
Am obtinut 23 de directoare cu cate 1000 html-uri fiecare; incarcarea in baza de date a luat 5 zile (cate 10 anunturi/minut)
Rularea am efectuat-o cu un cuplu: index.php/ajax.php (fiecare apel de anunt nou se efectueaza printr-un jaax declansat la fiecare 3.5 secunde); in acest fel scriptul php apelat prin ajax se incheie dupa stergerea html-ului din director…rularea directa nu mergea, pentru ca exista limitari pentru timpul de executie, memoria alocata, etc
Urmeaza dezvotlarea unui cron job care parcurge ultimele anunturi si le insereaza;
Aici am ales asa:
(Principiul este acelasi: fragmentare pentru consum redus resurse; astfel incat pentru fiecare url inspectat: marca/model sa fie suficient rularea unui singur script…) Pentur marcile si modelel cu anunturi f numeroase, va trebui gandit o solutie alternativa
Inspectez: https://www.autovit.ro/sitemap/ si verific fiecare marca/model. Verific paginile pana cand ultimul anunt din pagina NU este promovat si are data publicarii mai veche decat data ultimei rulari a cron job-ului.
Apoi urc in pagina respectiva pana cand obtin primul anunt nepromovat care are data mai recenta sau egala cu data ultimei rulari a cron job-ului (data contine si ora, min, secunda)
De aici incepnad pana la inceputul listei incarca intr-un vector toate url-urile de anunturi;
Salvez fisierele respective intr-un director de procesare daca id-urile (prezente in paginile lista anunturi) nu au coresponcdent in anunturile din autohint (salvate in postmeta)
Deci in director am doar anunturile noi (fata de ultima executie a cronjobului) care nu au fost adaugate in autohint (p[entru cele promovate in autovit pot fi mai vechi, dar fiind promovate ocupa o pozitie mai vizibila, mai la inceputul listelor)
Parcurg directorul si pentru fiecare html il parsez si in=l adaug in autohint
Alt detaliu: pozele. Pozele nu au fost importate. Dar in pagina de articol, acestea sunt generate inainte de afisare (am in postmeta url-urile pozelor din autovit, preluate la parsare – regexp!)
Alt detaliu: la fiecare afisare de lista de anunturi in autohint, va trebui in bucla de afisare anunturi (loop) sa inspectez url-ul autovit (salvat in postmeta) si verificat daca anuntul este inca activ in autovit; daca nu mai este activ, il elimin din lista. Sau la accesul in pagina anuntului sa fac acest apel si sa afisez un mesaj: acest anunt a fost eliminat din pagina site-uluioriginal, si vom proceda si noi la fel; apoi se trece anuntul pe draft