summaryrefslogtreecommitdiff
path: root/parser/clubcha.fnl
blob: affee2bd5038029cb8be6e3838437a2154432e5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
(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 "</span>") :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 "</option>") :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
   :volume (parser.guess-volume product.title)
   :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" :tags ["Белый пуэр"]}
     {: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 products :title "Железный Феникс" :url "https://clubcha.ru"}