(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://clubcha.ru/catalog/" path "/?page=" page)) (local product-peg (* (parser.anywhere (parser.tag :a {:href (peg.Cg (parser.till "\"") :url) :class "*" :data-product (peg.Cg parser.pegs.number :id)} (* (parser.anywhere (parser.tag :img {:src (peg.Cg (parser.till "\"") :image) :alt "*"})) (parser.anywhere (parser.tag :span {:class "item__name"} (peg.Cg (parser.till "") :title)))))) (parser.anywhere (parser.tag :span {:class "js-prod-price"} (peg.Cg (^ (+ parser.pegs.number parser.pegs.spaces) 1) :price))) (+ (* (parser.anywhere (parser.tag :option {:selected "" :data-price "*" :data-stock "*" :data-units "*" :data-oldprice "*" :value "*"} (peg.Cg (parser.till "") :weight))) (parser.anywhere (parser.tag :button {:type "submit" :value "Купить" :data-added-text "В корзине" :class "*"} (parser.anywhere "Купить")))) (parser.anywhere (parser.tag :button {:type "submit" :value "Купить" :data-added-text "В корзине" :class "*"} (parser.anywhere "Купить")))))) (fn normalize [product] (local weight (parser.guess-weight product.weight)) (local price (number.string->number product.price)) {:site "clubcha" :id product.id :title product.title :url (.. "https://clubcha.ru/" product.url) :description "" :image product.image :year 0 :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 "shu-puer" :tags ["Шу пуэр"]} {:path "shen-puer" :tags ["Шен пуэр"]} {:path "bai-hao-puer"} {:path "hei-cha" :tags ["Хэй ча"]} {:path "yuzhnofutszyanskij-ulun" :tags ["Улун"]} {:path "guandunskij-ulun" :tags ["Улун"]} {:path "severofujianskiy-ulun" :tags ["Улун"]} {:path "taiwanskiy-ulun" :tags ["Улун"]} {:path "gaba-ulun-gaba-alishan-i-dr" :tags ["Улун"]} {:path "zelenyi-chay" :tags ["Зеленый чай"]} {:path "belyi-chay" :tags ["Белый чай"]} {:path "zheltyi-chay" :tags ["Желтый чай"]} {:path "kitajskij-krasnyj-chaj" :tags ["Красный чай"]} {:path "tajvanskij-krasnyj-chaj" :tags ["Красный чай"]} {:path "Nechaynyye_chai_i_tsvetochnyye_dobavki"} {:path "upakovka-dlya-puera"} {:path "upakovka-dlya-posudy"} {:path "iz-lichnoj-kollektsii"} {:path "gaivan" :tags ["Посуда"]} {:path "chashka" :tags ["Посуда"]} {:path "chaynyi-nabor" :tags ["Посуда"]} {:path "chaynik" :tags ["Посуда"]} {:path "glina-farfor" :tags ["Посуда"]} {:path "chaban-chajnaya-doska" :tags ["Посуда"]} {:path "chajnyj-podnos" :tags ["Посуда"]} {:path "chajnyj-prud" :tags ["Посуда"]} {:path "professionalnye" :tags ["Посуда"]} {:path "glinyanye" :tags ["Посуда"]} {:path "farforovye" :tags ["Посуда"]} {:path "zhestyanye-i-kartonnye" :tags ["Посуда"]} {:path "puernitsy" :tags ["Посуда"]} {:path "glina" :tags ["Посуда"]} {:path "farfor" :tags ["Посуда"]} {:path "steklo" :tags ["Посуда"]} {:path "kruzhka" :tags ["Посуда"]} {:path "Chaynyye_instrumenty" :tags ["Посуда"]} {:path "chahe" :tags ["Посуда"]} {:path "sito" :tags ["Посуда"]} {:path "Chaynyy_suvenir" :tags ["Посуда"]} {:path "Prochaya_utvar" :tags ["Посуда"]} {:path "farfor-eilong" :tags ["Посуда"]} {:path "butylka-dlya-zavarivaniya" :tags ["Посуда"]} {:path "Predmety_interyera_i_fenshuy"} {:path "fo-chzhu-chetki" :tags ["Четки"]} {:path "nefrit-1" :tags ["Нефрит"]}] format-url product-peg normalize)) {: products}