blob: 71fbc0fb422b1ba3456fb283a148d755876bb8e6 (
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
|
(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
: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 :title "Железный Феникс" :url "https://clubcha.ru"}
|