Vasaris 5, 2008Kaip aš svetainių vorą dariau
Vienas projektas nenumaldomai artėja prie pabaigos, tačiau iki šiol vis dar atsiranda darbų, taigi iki normalaus testavimo dar liko šiek tiek laiko. Visai neseniai sužinojau, kad turi būti galimybė importuoti duomenis iš teikėjų sandėlio turinio sąrašo į mūsų sistemos duomenų bazę. Atrodytų viskas paprasta, tačiau kaip parodė vėlesni bandymai - netvarkingi duomenys sudaro tiek daug problemų, kad be žmogaus patikros su jais dirbti beveik neįmanoma. Kadangi pradinių duomenų kiekis buvo gana didelis, tai pasitelkti žmogiškaisiais ištekliais nebūtų visiškai protinga, todėl nusprendžiau dalį žmogaus darbo perkelti kompiuteriui.
Pradėjau nuo to, kad gavau Excel rinkmeną su 1000 įrašų - gana įspūdingas skaičius, nes visą 1000 prekių reikia įkelti. Blogiausia, kad prekių sąrašas yra sudarytas be jokios padorios tvarkos - panašūs pavadinimai skiriasi tik tarpu, informacijos pateikimo forma ne visada vienoda ir pan. Žinoma, tiekėjai neturi noro surašyti visus prekės parametrus, todėl pateikė tik pavadinimus ir kažkokius neaiškius prekių kodus, kurie beveik neatitiko realybės. Kadangi tiek duomenų yra žymiai per mažai išsamiam prekės aprašymui, tai teko ieškoti būdų kaip gauti papildomos informacijos apie prekes. Vienintelis įmanomas variantas - internetas. Pateiktieji priekių kodai neatitiko jokių duomenų internete, todėl teko pasikliauti prekės pavadinimu. Paieškos sistemoje Google tikrai būtų galima susirasti pačios įvairiausios informacijos apie bet kokią prekę, tačiau informacijos ieškojimas negalėtų būti pavestas kompiuteriui, nes aprašyti reikalingos informacijos ieškojimą svetainės turinyje būtų gana sudėtinga. Labai gerai būtų tam panaudoti žmones(!), tačiau internete surasti 1000 prekių tikriausiai užtruktų keletą savaičių. Nieko kito nebeliko, kaip bandyti panaudoti netikėtai atrastą tiekėjo svetainę. Gaila, tačiau svetainė neturi jokios normalaus katalogo, todėl teko programiškai aprašyti tokią veiksmų seką, kuri žinant prekės pavadinimą suranda išsamesnę informaciją:
- Prisijungiame prie tiekėjo svetainės paieškos puslapio
- Į paieškos laukelį įvedame prekės pavadinimą
- Rezultatuose surandame patį pirmą įrašą (labiausiai tikėtina, kad visada bus tik vienas rezultatas)
- Pereiname į įrašo puslapį ir nuskaitome dominančią informaciją
Veiksmai neatrodo sudėtingi, tačiau tai yra gana problematiškas procesas, nes ne tik, kad prireiks 2000 prisijungimų į tiekėjų serverį, tačiau ir įrašo puslapyje reikės tinkamai atsirinkti naudingą informaciją. Kadangi svetainė yra parašyta nesilaikant W3C reikalavimų, tai pasinaudoti DOM galimybėmis tikriausiai nebūtų pavykę, o gaišti laiką bandymams nelabai norėjau. Realiausia buvo kuo daugiau atkurti žmogaus informacijos ieškojimo principą, kuris remiasi tuo, kad informacija randama pagal ją supančius duomenis. Taigi turbūt vienintelis įmanomas variantas - informaciją ieškoti pagal įvairiausius parametrus pačiame html kode. Pavyzdžiui: prekės kainą randame prie „Kaina: X.X Lt.“, prekės nuotrauką randame pagal nuorodos adresą ir t.t. Tiesiog pagrindinis dalykas norint programiškai apdoroti bet kokį dokumentą ar internetinį puslapį - būtinai reikia išsamiai išanalizuoti jo turinį ir atrasti vietas, už kurių galėtų „užsikabinti“ informacijos ieškojimo ciklas. Be to, labai svarbu rasti išskirtinius atvejus, kai standartinėje informacijos pateikimo formoje atsiranda papildomi duomenis, kurie gali iškreipti rezultatus, todėl būtina prieš analizuojant informaciją įvertinti ir jos padėti dokumente. O liūdniausia, kad atakuojamos svetainės autoriai bet kada gali pakeisti svetainės struktūrą ir informacijos ieškojimas nustos veikti.
Tai yra viena įdomiausių paskutiniuoju metu daromų užduočių, nes tiesiog nėra pasirinkimo daryti taip, kaip būtų geriausia ir optimaliausią - tiesiog reikia naudoti tą informaciją, kuri yra pasiekiama, o daugiau informacijos ieškoti itin įdomiais būdais. Nenoriu atskleisti mano „taikinio“ pavadinimo, nes pyktelėję darbuotojai gali užblokuoti mano įrankius ir viską reikėtų daryti iš naujo. Sunku net pasakyti kokia šio įrašo prasmė - galbūt tai vienas iš tų įrašų, kai dalinamasi nestandartine ir galbūt kitiems įdomia asmenine patirtimi. Tikiuosi atradote ką nors naudingo!
Patiko ką perskaitei? Užsiprenumeruok RSS srautą ir visada gauk mano naujausius įrašus pats pirmas! Tai ne tik, kad yra be galo patogu, tačiau ir leis tau nepraleisti nei vieno mano įrašo. Jei kiltų problemų - rašyk.



2008-02-06 10:30:42
Susidūriau su analogiška problema kai vienos senos sistemos duomenis reikėjo perkelti į naują sistemą. Įrašų skaičius apie 1000 taip pat. Tos pačios problemos beje - nevalidus kodas, skirtingi vaizdavimo formatai, skirtingas informacijos kiekis ir t.t. Tai kas man labiausiai patiko, kad nevalidus kodas nėra didelė problema, jei naudoji BeautifulSoup (python biblioteka, yra ir Ruby analogas to paties autoriaus, dėl PHP nežinau). Suvalgo nevalidų kodą ir tada jau galima ieškoti informacijos taip kaip nori turimame medyje.
2008-02-13 10:47:23
Čia tikriausiai beveik visiems programuotojams tai tenka daryti. Pvz.: reklamos sistema ir reikia sužinoti kiek yra reklamos skydelių įdėta į svetainę - ne tik, kad sužinot didžiausius skaičius kiek yra jų įsidėję, bet tam, kad apskaičiuoti tikimybes, ar vartotojas nesukčiauja ir pan.
O dėl prekių skaitymo nuotoliniu būdu būtinas cache :)
Beje svarbiausia nepadaryti užklausų prašymų vienu metu ir neapkrauti kažkokio serverio savo voru vienu metu. Viskas po valiai turi būti :)