summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2024-10-09 10:49:19 +0600
committerunwox <me@unwox.com>2024-10-09 10:49:19 +0600
commit469a210832d2e89038a8732414aafe42f928a14f (patch)
treecb3f79b361f7c08766f4128447bc063db30dc53e /parser
parentaf76f6151244bdccd745f86b1edca3038718b551 (diff)
integrate chaekshop.ru
Diffstat (limited to 'parser')
-rw-r--r--parser/chaekshop.fnl88
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}