Naplnění databáze – bash/sed/awk style

Slíbil jsem známé vytvořit web s jejím zbožím, konečně mám volný večer a tak se do toho pustím. Hlavním bodem je naplnění databáze, kde bude prozatím 190 výrobků a časem bude toto číslo pomalu narůstat. Nedostal jsem však tato data v žádné formě, jsou už všechny přidány na webu www.fler.cz, stačí tedy „pouze“ daná data najít a vytvořit z nich tabulku. Jednoduché ne? Takový praktický příklad ze života. Jelikož jsem nikdy neudělal pořádný web ani databázi, ale celkem rád ve volném čase skriptuji, popíši řešení daného problému ze svého pohledu :)

Vstupem je funkční web – eshop – kde je 190 přidaných produktů. Výstupem je SQL Insert script pro MySQL.

Vím, že důležité informace jsou – název, popis, cena zboží, cena poštovného a obrázky.
Tyto informace jsou na samostatné webové stránce pro každý produkt.

Zjišťuji strukturu webových stránek, z aktuální html linky (na každý produkt) nedostanu, přes „Inspect element“ v Google Chrome se však k linkům dostanu. Vykopíruji vše do jednoho souboru a doufám, že to byla moje jediná práce s GUI.

Aktuální soubor má zhruba tuto strukturu:

Obsahuje tedy název produktu, link, cenu, ale ne popis, poštovné, atd… Budu tedy muset opravdu navštívit každou stránku pro každý produkt. Potřebuji tedy pouze link na danou stránku. Ze struktury je jasné, že odkazuje do složky /zbozi/, jednoduchým grepem si odstraníme zbytek.

Nyní mám soubor urls.txt, nepřemýšlím dlouho a pošlu ho wgetu na stažení všech url

No, možná jsem byl až moc líný, kdybych se totiž do urls.txt podíval, zjistil bych, že je tam každá url 2x, wget defaultně soubory nepřepisuje,

za jméno přilepí ‚.1‘, přepíši skript a stáhnu vše znova? Sort -u urls.txt? Blbost! Nač stahovat vše znovu?

Nyní mám stažené všechna jednotlivá html. Teď už jen z každého vykuchat potřebné. Po zkouknutí jejich struktury se rozhodnu pro jednoduché awk

Teď už jen provést tento skript pro všechny html a máme skoro vyhráno… Sakra, můj find neumí použít chlupaté závorky 2x,

awk nemá inplace nahrazení a do sedu se mi to už nechce přepisovat (sed na to není moc vhodný). Pro každý soubor zvlášť by to spouštěl jen hlupák.

Co takhle udělat super skript, který budu pomocí -exec volat? Zkusím to…

Jednoduchým findem spustím náš super skript pro každý soubor a ten se s tím popere, jak ale bude vypadat?

Jednoduše!

Využili jsme sílu argumentů skriptu, škoda, že to neumím jedním findem a škoda že awk neumí inplace nahrazení, ale mám to brzy hotovo (pokud by souborů bylo opravdu hodně, doporučuji u findu použít a v awkchoose while $# a shift)

Vykuchali jsme si potřebné řádky, co ale konkrétně z řádku potřebujeme?

Ještě, že těch souborů je jen 190, při vyšším počtu bych totiž předešlou prasárnu musel alespoň trochu zoptimalizovat. Ale co, splnilo to účel :)

Ve výsledné struktuře je na druhém řádku nepotřebný odpad

A už není :)

Nyní máme zhruba tuto strukturu

Problém je, že nikdy nevím, kolik těch linků tam je, hodilo by se vše zřetězit za sebe, oddělit mezerou a dát do uvozovek.

Nejdřív si ale vše pohodlně spojíme do jedné řádky.

Sakra, tr pracuje jen přes pipe nebo přesměrování! Já ale potřebuji zachovat název souboru. Stejně se mi hodí inplace nahrazení. Sed mám opravdu rád, ale ne teď… než dopíšu „sed“ a mezeru, dojde mi, že sed pracuje po řádcích, a awk zase neumí to blbé inplace nahrazení… nahradit newline v jednom souboru je hrozně jednoduché, když jich je ale víc, vše se takto zkomplikuje… možná se podívám, jestli ty nové řádky vadí… NE! Nepodívám! Nevzdám se, chci je odstranit!

Dělal jsem to přece nedávno, tak si vzpomeň, je tam potřeba nějaký goto label a v cyklu načítat nové řádky, nepamatuji si přesně syntaxi,
odpověď mám rovnou jak na talíři na milovaném StackOverflow (po drobné úpravě)

Pokračujeme spojením linků

Výsledek vypadá následovně

Takže máme vše potřebné – popis, linky, cena zboží a cena poštovného. Teď už to jen narvat do databáze… SQL jsem hoooodně dlouho neviděl, minuta googlení a máme vzor

Tak to už je spíš jen psaní…

Nyní to vypadá zhruba takto

Pro pohodlnost si vše spojíme do jednoho souboru (ano, až teď, aspoň procesor nemusel odpočívat)

Náš insert skript je hotov a ještě před spaním stihnu zkouknout nějakej ten seriál :)

 

Be Sociable, Share!

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *