Acasă » Blog » Import numar mare de articole din site-uri externe

Import numar mare de articole din site-uri externe

Share this post on social!

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

 

Traian Constantin Predan

Traian Constantin Predan

Inginer absolvent al Politehnicii București proiectează și construiește sisteme online. Lucrează proiecte extrem de diverse, îi plac viziunile noi care provoacă la dezvoltarea unor soluții tehnice eficiente și stabile.