X

Import numar mare de articole din site-uri externe

By

Traian

Blog IT, HTML, PHP, Software

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

 

 

Comments are closed.