diff options
Diffstat (limited to 'parser/chaekshop.fnl')
| -rw-r--r-- | parser/chaekshop.fnl | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/parser/chaekshop.fnl b/parser/chaekshop.fnl new file mode 100644 index 0000000..b1e4b4e --- /dev/null +++ b/parser/chaekshop.fnl @@ -0,0 +1,88 @@ +(import-macros {: map} :lib.macro) + +(local peg + (if (pick-values 1 (pcall require :lpeg)) + (require :lpeg) + (require :lpeglj))) +(local parser (require :parser.parser)) +(local number (require :lib.number)) +(local fetcher (require :fetcher)) + +(fn format-url [path page] + (.. "https://chaekshop.ru/catalog/" path "?page=" page)) + +(local data-v-peg + (* (peg.P "data-v-") (^ (+ parser.pegs.letters parser.pegs.number) 1))) + +(local product-peg + (* + (parser.anywhere + (parser.tag :a {data-v-peg "" :href (peg.Cg (parser.till "\"") :url) + :class "*" :itemprop "url" :section_id "*"})) + (parser.anywhere + (parser.tag :img {:src (peg.Cg (parser.till "\"") :image) + :alt "*" + :title (peg.Cg (parser.till "\"") :title) + :loading "lazy" + data-v-peg ""})) + (parser.anywhere + (parser.tag :p {:itemprop "price" :class "*" data-v-peg ""} + (* (peg.Cg (^ (+ parser.pegs.number " " ",") 1) :price) "₽"))) + (parser.anywhere + (parser.tag :p {:class "*" data-v-peg ""} + (+ (* (peg.Cg parser.pegs.number :weight) " грамм") + (* parser.pegs.number " шт")))))) + +(fn normalize [product] + (local weight (or (number.string->number product.weight) + (parser.guess-weight product.title))) + (local price (number.string->number (string.gsub product.price "," "."))) + {:site "chaekshop" + :id (.. "https://chaekshop.ru/" product.url) + :title product.title + :url (.. "https://chaekshop.ru/" product.url) + :description "" + :image (.. "https://chaekshop.ru" product.image) + :year (parser.guess-year product.title) + :price price + :weight weight + :price-per (if (and price weight (< 0 weight)) + (/ (math.ceil (* (/ price weight) 10)) 10) + nil)}) + +(fn products [] + (fetcher.from-html + [{:path "chay/belyy_chay" :category "Белый чай"} + {:path "chay/guandunskie_uluny" :category "Улун"} + {:path "chay/zhyeltyy_chay" :category "Желтый чай"} + {:path "chay/zelyenyy_chay" :category "Зеленый чай"} + {:path "chay/krasnyy_chay" :category "Красный чай"} + {:path "chay/severo_futszyanskie_uluny" :category "Улун"} + {:path "chay/tayvanskie_uluny" :category "Улун"} + {:path "chay/khey_cha" :category "Хэй ча"} + {:path "chay/shen_puer" :category "Шэн пуэр"} + {:path "chay/shu_puery" :category "Шу пуэр"} + {:path "chay/yuzhno_futszyanskie_uluny_" :category "Улун"} + {:path "chay/yunnanskie_uluny" :category "Улун"} + {:path "chay/gaba_chay" :category "Улун"} + {:path "chay/na_kazhdyy_den"} + {:path "chay/eksklyuziv"} + {:path "posuda_i_aksessuary/pialy" :category "Посуда"} + {:path "posuda_i_aksessuary/isinskaya_glina" :category "Посуда"} + {:path "posuda_i_aksessuary/keramika_iz_tszindechzhen" :category "Посуда"} + {:path "posuda_i_aksessuary/keramika_iz_tszyanshuy" :category "Посуда"} + {:path "posuda_i_aksessuary/kolby_termosy_nabory" :category "Посуда"} + {:path "posuda_i_aksessuary/chabani" :category "Посуда"} + {:path "posuda_i_aksessuary/chaynye_figurki" :category "Посуда"} + {:path "posuda_i_aksessuary/slivniki" :category "Посуда"} + {:path "posuda_i_aksessuary/gayvani" :category "Посуда"} + {:path "posuda_i_aksessuary/keramika_iz_tsinchzhou" :category "Посуда"} + {:path "posuda_i_aksessuary/aksessuary"} + {:path "posuda_i_aksessuary/pialy_tszindechzhen" :category "Посуда"} + {:path "posuda_i_aksessuary/keramika_dekhua" :category "Посуда"} + {:path "posuda_i_aksessuary/chayniki_iz_farfora" :category "Посуда"}] + format-url + product-peg + normalize)) + +{: products} |
