![FDF Bike Shop (fdfbikeshop.cz) scraper avatar](https://images.apifyusercontent.com/nYFDH5zxk0-9aQdCNGwlFpQb3_RVC9mXEjRfv6-5-sk/rs:fill:92:92/aHR0cHM6Ly9pLmltZ3VyLmNvbS95RjRkSU5YLnBuZw.webp)
FDF Bike Shop (fdfbikeshop.cz) scraper
DeprecatedView all Actors![FDF Bike Shop (fdfbikeshop.cz) scraper](https://images.apifyusercontent.com/nYFDH5zxk0-9aQdCNGwlFpQb3_RVC9mXEjRfv6-5-sk/rs:fill:92:92/aHR0cHM6Ly9pLmltZ3VyLmNvbS95RjRkSU5YLnBuZw.webp)
![](data:image/png;base64,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giAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIggffC8MAAAO7SURBVJAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACAIgiAIGUICgCAIgiBkCAkAgiAIgpAhJAAIgiAIQoaQACD+f7t1IAAAAAAgyN96kIsiAIYEAACGBAAAhgQAAIYEAACGBAAAhgQAAIYEAACGAkDYdAumPEa8AAAAAElFTkSuQmCC)
This Actor is deprecated
This Actor is unavailable because the developer has decided to deprecate it. Would you like to try a similar Actor instead?
See alternative Actors![FDF Bike Shop (fdfbikeshop.cz) scraper](https://images.apifyusercontent.com/nYFDH5zxk0-9aQdCNGwlFpQb3_RVC9mXEjRfv6-5-sk/rs:fill:92:92/aHR0cHM6Ly9pLmltZ3VyLmNvbS95RjRkSU5YLnBuZw.webp)
FDF Bike Shop (fdfbikeshop.cz) scraper
strajk/fdf-bike-shop-fdfbikeshop-cz-scraper
Scrapes products titles, prices, images and availability. Does NOT scrape product details.
Dockerfile
1FROM apify/actor-node:16
2
3COPY package.json ./
4
5RUN npm --quiet set progress=false \
6 && npm install --only=prod --no-optional
7
8COPY . ./
INPUT_SCHEMA.json
1{
2 "title": "FDF Bike Shop (fdfbikeshop.cz) scraper",
3 "description": "Scrapes products titles, prices, images and availability. Does NOT scrape product details.",
4 "type": "object",
5 "schemaVersion": 1,
6 "properties": {
7 "mode": {
8 "title": "Mode",
9 "description": "",
10 "type": "string",
11 "editor": "select",
12 "default": "TEST",
13 "prefill": "TEST",
14 "enum": [
15 "TEST",
16 "FULL"
17 ],
18 "enumTitles": [
19 "TEST",
20 "FULL"
21 ]
22 },
23 "APIFY_DONT_STORE_IN_DATASET": {
24 "sectionCaption": "Advanced",
25 "sectionDescription": "Advanced options, use only if you know what you're doing.",
26 "title": "Don't store in dataset",
27 "description": "If set to true, the actor will not store the results in the default dataset. Useful when using alternative storage, like own database",
28 "type": "boolean",
29 "default": false,
30 "editor": "checkbox"
31 },
32 "PG_CONNECTION_STRING_NORMALIZED": {
33 "title": "Postgres connection string for normalized data",
34 "description": "If set, actor will store normalized data in Postgres database in PG_DATA_TABLE and PG_DATA_PRICE_TABLE tables",
35 "type": "string",
36 "editor": "textfield"
37 },
38 "PG_DATA_TABLE": {
39 "title": "Postgres table name for product data",
40 "description": "Table name for storing product name, url, image, ...",
41 "type": "string",
42 "editor": "textfield"
43 },
44 "PG_DATA_PRICE_TABLE": {
45 "title": "Postgres table name for price data",
46 "description": "Table name for storing price, original price, stock status, ...",
47 "type": "string",
48 "editor": "textfield"
49 }
50 },
51 "required": [
52 "mode"
53 ]
54}
apify.json
1{
2 "name": "fdf-bike-shop-fdfbikeshop-cz-scraper",
3 "version": "0.1",
4 "buildTag": "latest",
5 "env": null,
6 "defaultRunOptions": {
7 "build": "latest",
8 "timeoutSecs": 3600,
9 "memoryMbytes": 1024
10 }
11}
main.js
1import { Actor } from "apify3";
2import { CheerioCrawler, createCheerioRouter } from "crawlee";
3import { init, save, toNumberOrNull } from "./_utils/common.js";
4
5const LABELS = {
6 INDEX: `INDEX`,
7 PRODUCTS: `PRODUCTS`,
8};
9
10var MODE;
11
12(function (MODE) {
13 MODE["TEST"] = "TEST";
14 MODE["FULL"] = "FULL";
15})(MODE || (MODE = {}));
16
17const baseUrl = `https://www.fdfbikeshop.cz`;
18
19async function enqueueInitial(mode, crawler) {
20 if (mode === MODE.FULL) {
21 await crawler.addRequests([
22 {
23 userData: { label: LABELS.INDEX },
24 url: `${baseUrl}/sitemap.xml`,
25 },
26 ]);
27 } else if (mode === MODE.TEST) {
28 await crawler.addRequests([
29 {
30 userData: { label: LABELS.PRODUCTS },
31 url: `${baseUrl}/znacka/crankbrothers/`,
32 },
33 ]);
34 await crawler.addRequests([
35 {
36 userData: { label: LABELS.PRODUCTS },
37 url: `${baseUrl}/znacka/dt-swiss/`,
38 },
39 ]);
40 await crawler.addRequests([
41 {
42 userData: { label: LABELS.PRODUCTS },
43 url: `${baseUrl}/znacka/galfer/`,
44 },
45 ]);
46 }
47}
48
49const router = createCheerioRouter();
50
51router.addHandler(LABELS.INDEX, async ({ $, crawler }) => {
52 const urls = $(`url loc`)
53 .map((i, x) => $(x).text())
54 .toArray();
55 // https://www.fdfbikeshop.cz/znacka/100/ » brands, only type of urls we are interested in
56 // https://www.fdfbikeshop.cz/nahradni-dily-loziska/
57 // https://www.fdfbikeshop.cz/kazety-12sp/
58 // @ts-ignore
59 const brandsUrls = urls.filter((url) => url?.includes(`/znacka/`));
60 const requests = [];
61 for (const url of brandsUrls) {
62 requests.push({
63 userData: { label: LABELS.PRODUCTS },
64 // @ts-ignore
65 url,
66 });
67 }
68 await crawler.addRequests(requests);
69});
70
71router.addHandler(LABELS.PRODUCTS, async ({ $, crawler, request }) => {
72 console.log(`Processing ${request.url}`);
73
74 // on first page » handle pagination
75 if (!request.url.match(/\/strana-\d+\//)) {
76 // /znacka/fox/strana-2/
77 let totalPages;
78 try {
79 totalPages = parseInt(
80 // $('.pagination-description-pages:eq(0) strong:eq(1)').text() » this does not work
81 $(`.pagination-description-pages`).eq(0).find(`strong`).eq(1).text()
82 );
83 } catch (e) {
84 totalPages = 1;
85 }
86 if (totalPages > 1) {
87 console.log(`> …found ${totalPages} pages, enqueuing them…`);
88 }
89 for (let i = 2; i <= totalPages; i++) {
90 // skip first page, that is already handled
91 void crawler.addRequests([
92 {
93 userData: { label: LABELS.PRODUCTS },
94 url: `${request.url}strana-${i}/`,
95 },
96 ]);
97 }
98 }
99
100 const products = [];
101 $(`#category-products-wrapper .product`).each((i, el) => {
102 const id = $(el).attr(`data-micro-product-id`); // e.g. 20080005-40200770
103
104 const relUrl = $(el).find(`a.p-name`).attr(`href`);
105 const url = `${baseUrl}${relUrl}`;
106 const title = $(el).find(`[data-micro='name']`).text();
107
108 const priceRaw = $(el).find(`.p-det-main-price`).text().trim(); // e.g. `39 990 Kč`
109 const price = priceRaw.replace(/[^\d,]/g, ``); // keep comma as it's decimal separator
110
111 const priceOrigRaw = $(el)
112 .find(`.p-standard-price span.line`)
113 .text()
114 .trim();
115 const priceOrig = priceOrigRaw.replace(/[^\d,]/g, ``);
116
117 const img = $(el).find(`img[data-micro='image']`).attr(`src`);
118
119 let inStock = false;
120 try {
121 inStock = $(el).find(`.p-cat-availability`).text().includes(`Skladem`);
122 } catch (err) {
123 // ignore
124 }
125
126 const product = {
127 pid: id,
128 name: title,
129 url: url,
130 img: img,
131 inStock,
132 currentPrice: toNumberOrNull(price),
133 originalPrice: toNumberOrNull(priceOrig),
134 currency: `CZK`,
135 };
136 products.push(product);
137 });
138 void save(products);
139});
140
141void Actor.main(async () => {
142 const input = await Actor.getInput();
143 const { mode = MODE.FULL, ...rest } = input ?? {};
144 await init({ actorNameOverride: `fdfbikeshop-cz` }, rest);
145 const crawler = new CheerioCrawler({ requestHandler: router });
146 await enqueueInitial(mode, crawler);
147 await crawler.run();
148});
package.json
1{
2 "name": "fdf-bike-shop-fdfbikeshop-cz-scraper",
3 "description": "Scrapes products titles, prices, images and availability. Does NOT scrape product details.",
4 "type": "module",
5 "scripts": {
6 "start": "node ./main.js",
7 "push-to-apify-platform": "npx apify push"
8 },
9 "dependencies": {
10 "apify3": "npm:apify@^3.0.2",
11 "crawlee": "*",
12 "pg": "*",
13 "pg-connection-string": "*",
14 "dotenv": "*",
15 "find-config": "*",
16 "@elastic/elasticsearch": "*",
17 "filenamify": "*"
18 },
19 "apify": {
20 "title": "FDF Bike Shop (fdfbikeshop.cz) scraper",
21 "description": "Scrapes products titles, prices, images and availability. Does NOT scrape product details.",
22 "isPublic": true,
23 "isDeprecated": false,
24 "isAnonymouslyRunnable": true,
25 "notice": "",
26 "pictureUrl": "",
27 "seoTitle": "",
28 "seoDescription": "",
29 "categories": [
30 "ECOMMERCE"
31 ]
32 }
33}
.actor/actor.json
1{
2 "actorSpecification": 1,
3 "name": "fdf-bike-shop-fdfbikeshop-cz-scraper",
4 "title": "FDF Bike Shop (fdfbikeshop.cz) scraper",
5 "description": "Scrapes products titles, prices, images and availability. Does NOT scrape product details.",
6 "version": "0.1.0",
7 "storages": {
8 "dataset": {
9 "actorSpecification": 1,
10 "title": "FDF Bike Shop (fdfbikeshop.cz) scraper",
11 "description": "Scrapes products titles, prices, images and availability. Does NOT scrape product details.",
12 "views": {
13 "overview": {
14 "title": "Overview",
15 "description": "Overview of the most important fields",
16 "transformation": {
17 "fields": [
18 "pid",
19 "name",
20 "url",
21 "img",
22 "inStock",
23 "currentPrice",
24 "originalPrice",
25 "currency"
26 ]
27 },
28 "display": {
29 "component": "table",
30 "columns": [
31 {
32 "label": "Pid",
33 "field": "pid",
34 "format": "text"
35 },
36 {
37 "label": "Name",
38 "field": "name",
39 "format": "text"
40 },
41 {
42 "label": "Url",
43 "field": "url",
44 "format": "link"
45 },
46 {
47 "label": "Img",
48 "field": "img",
49 "format": "image"
50 },
51 {
52 "label": "In Stock",
53 "field": "inStock",
54 "format": "boolean"
55 },
56 {
57 "label": "Current Price",
58 "field": "currentPrice",
59 "format": "number"
60 },
61 {
62 "label": "Original Price",
63 "field": "originalPrice",
64 "format": "number"
65 },
66 {
67 "label": "Currency",
68 "field": "currency",
69 "format": "text"
70 }
71 ]
72 }
73 }
74 }
75 }
76 }
77}
.actor/logo.png
_utils/common.js
1import { createHash } from 'crypto'
2import os from "os"
3import path from "path"
4// eslint-disable-next-line @apify/apify-actor/no-forbidden-node-internals
5import fs from "fs"
6import pg from "pg"
7import pgConnectionString from 'pg-connection-string'
8import { config } from 'dotenv'
9import findConfig from "find-config"
10import { Client as ElasticClient } from "@elastic/elasticsearch"
11import filenamify from 'filenamify'
12import { Dataset } from 'crawlee'
13
14config({ path: findConfig(`.env`) })
15
16const elasticIndexName = `actors-monorepo-shops`
17
18const globalLogsProps = {
19 __NODE_STARTED: new Date().toISOString(),
20}
21
22let actorName
23let pgClient
24let pgClientNormalized
25let elasticClient
26export async function init ({ actorNameOverride }, restInput) {
27 parseEnvFromInput(restInput)
28
29 if (os.platform() === `darwin`) {
30 const filePath = process.argv[1] // ~/Projects/apify-actors-monorepo/actors/foo.ts
31 const basename = path.basename(filePath) // foo.ts
32 actorName = actorNameOverride ?? basename.split(`.`)[0] // foo
33 const gitBranch = fs.readFileSync(path.join(process.cwd(), `..`, `.git/HEAD`), `utf8`)
34 .split(` `)[1]
35 .trim()
36 .replace(`refs/heads/`, ``)
37 const gitCommit = fs.readFileSync(path.join(process.cwd(), `..`, `.git/refs/heads/${gitBranch}`), `utf8`)
38 const gitCommitShort = gitCommit.substring(0, 7)
39 globalLogsProps.__GIT_COMMIT = gitCommitShort
40 }
41
42 if (process.env.APIFY_IS_AT_HOME) {
43 actorName = actorNameOverride ?? process.env.APIFY_ACTOR_ID // Name would be better, but it's not in ENV
44 }
45
46 /* ELASTIC */
47 /* ======= */
48 if (process.env.ELASTIC_CLOUD_ID) {
49 elasticClient = new ElasticClient({
50 cloud: { id: process.env.ELASTIC_CLOUD_ID },
51 auth: { apiKey: process.env.ELASTIC_CLOUD_API_KEY },
52 })
53
54 // const mapping = await elasticClient.indices.getMapping({ index: actorName })
55
56 // eslint-disable-next-line no-inner-declarations
57 async function enforceIndexMapping () {
58 const doesIndexExist = await elasticClient.indices.exists({ index: elasticIndexName })
59 if (!doesIndexExist) await elasticClient.indices.create({ index: elasticIndexName })
60 await elasticClient.indices.putMapping({
61 index: elasticIndexName,
62 body: {
63 properties: {
64 _discount: { type: `float` },
65 originalPrice: { type: `float` },
66 currentPrice: { type: `float` },
67 },
68 },
69 })
70 }
71
72 try {
73 await enforceIndexMapping()
74 } catch (err) {
75 if (err.message.includes(`cannot be changed from type`)) {
76 console.log(`Elastic index ${elasticIndexName} already exists with incorrect mappings. As existing mapping cannot be changed, index will be deleted and recreated.`)
77 await elasticClient.indices.delete({ index: elasticIndexName })
78 await enforceIndexMapping()
79 }
80 }
81 }
82
83 /* POSTGRESQL */
84 /* ========== */
85 if (process.env.PG_CONNECTION_STRING) {
86 const pgConfig = pgConnectionString(process.env.PG_CONNECTION_STRING)
87 // const pgPool = new pg.Pool(pgConfig)
88
89 pgClient = new pg.Client(pgConfig)
90 await pgClient.connect()
91
92 // Check if table exists and have proper columns
93 const { rows: tables } = await pgClient.query(`
94 SELECT table_name
95 FROM information_schema.tables
96 WHERE table_schema = 'public'
97 `)
98
99 // eslint-disable-next-line camelcase
100 const tableExists = tables.some(({ table_name }) => table_name === process.env.PG_DATA_TABLE)
101 if (!tableExists) {
102 throw new Error(`Table ${process.env.PG_DATA_TABLE} does not exist in database ${pgConfig.database}`)
103 }
104
105 // TODO: Handle pgClient closing
106 }
107
108 if (process.env.PG_CONNECTION_STRING_NORMALIZED) {
109 const pgConfig = pgConnectionString(process.env.PG_CONNECTION_STRING_NORMALIZED)
110
111 pgClientNormalized = new pg.Client(pgConfig)
112 await pgClientNormalized.connect()
113
114 // Check if table exists and have proper columns
115 const { rows: tables } = await pgClientNormalized.query(`
116 SELECT table_name
117 FROM information_schema.tables
118 WHERE table_schema = 'public'
119 `)
120
121 // eslint-disable-next-line camelcase
122 const tableMainExists = tables.some(({ table_name }) => table_name === process.env.PG_DATA_TABLE)
123 // eslint-disable-next-line camelcase
124 const tablePricesExists = tables.some(({ table_name }) => table_name === process.env.PG_DATA_PRICE_TABLE)
125 if (!tableMainExists) throw new Error(`Table ${process.env.PG_DATA_TABLE} does not exist in database ${pgConfig.database}`)
126 if (!tablePricesExists) throw new Error(`Table ${process.env.PG_DATA_PRICE_TABLE} does not exist in database ${pgConfig.database}`)
127
128 // TODO: Handle pgClient closing
129 }
130}
131
132// inspired by @drobnikj
133// TODO: Similar, but less obfuscated for easier debugging
134export const createUniqueKeyFromUrl = (url) => {
135 const hash = createHash(`sha256`)
136 const cleanUrl = url.split(`://`)[1] // Remove protocol
137 hash.update(cleanUrl)
138 return hash.digest(`hex`)
139}
140
141/**
142 *
143 * @param {Date} datetime
144 * @return {Promise<void>}
145 */
146export const sleepUntil = async (datetime) => {
147 const now = new Date()
148 const difference = datetime - now
149 if (difference > 0) {
150 return new Promise((resolve) => {
151 setTimeout(resolve, difference)
152 })
153 }
154 return Promise.resolve()
155}
156
157export function parsePrice (string) {
158 let amount, currency
159 const noText = string.replace(/[^\d,.]/g, ``)
160 const decimals = noText.match(/([,.])(\d{2})$/)
161 if (decimals) {
162 const decimalSeparator = decimals[1]
163 // eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars
164 const decimalAmount = decimals[2]
165 amount = parseInt(noText.split(decimalSeparator)[0])
166 } {
167 const justNumbers = noText.replace(/[,.]/g, ``)
168 amount = parseInt(justNumbers)
169 }
170 return { amount, currency }
171}
172
173export function toNumberOrNull (str) {
174 // TODO: Handle better, but only after adding test
175 if (str === undefined) return null
176 if (str === null) return null
177 if (str === ``) return null
178 const num = Number(str)
179 if (Number.isNaN(num)) return null
180 return num
181}
182
183export async function save (objs) {
184 if (!Array.isArray(objs)) objs = [objs]
185 if (objs.length === 0) return
186
187 const objsExtended = objs.map((obj) => {
188 const objExtended = {
189 ...obj,
190 actorName,
191 ...globalLogsProps,
192 // __NODE_VERSION: global.process.versions.node,
193 // __NODE_UPTIME: global.process.uptime().toFixed(2), // seconds, 2 decimals
194 }
195 // if run on Apify
196 if (process.env.APIFY_IS_AT_HOME) {
197 objExtended.__APIFY_ACTOR_ID = process.env.APIFY_ACTOR_ID
198 objExtended.__APIFY_ACTOR_RUN_ID = process.env.APIFY_ACTOR_RUN_ID
199 objExtended.__APIFY_ACTOR_BUILD_ID = process.env.APIFY_ACTOR_BUILD_ID
200 objExtended.__APIFY_ACTOR_BUILD_NUMBER = process.env.APIFY_ACTOR_BUILD_NUMBER
201 objExtended.__APIFY_ACTOR_TASK_ID = process.env.APIFY_ACTOR_TASK_ID
202 if (!process.env.APIFY_DONT_STORE_IN_DATASET) void Dataset.pushData(obj)
203 }
204 return objExtended
205 })
206 // if runs on local machine (MacOS)
207 if (os.platform() === `darwin`) {
208 const cwd = process.cwd() // ~/Projects/apify-actors-monorepo/actors
209 const storageDir = path.join(cwd, `${actorName}.storage`) // ~/Projects/apify-actors-monorepo/actors/foo.storage
210 if (!fs.existsSync(storageDir)) fs.mkdirSync(storageDir)
211 const dataDir = path.join(storageDir, `data`) // ~/Projects/apify-actors-monorepo/actors/foo.storage/data
212 if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir)
213 for (const objExtended of objsExtended) {
214 const id = objExtended.id ?? objExtended.pid // ?? uuidv4()
215 const fileName = `${filenamify(id)}.json`
216 const dataFilePath = path.join(dataDir, fileName) // ~/Projects/apify-actors-monorepo/actors/foo.storage/data/foo.json
217 fs.writeFileSync(dataFilePath, JSON.stringify(objExtended, null, 2))
218 }
219 }
220
221 if (pgClient) {
222 const objsPg = objs.map((obj) => ({
223 ...obj,
224 // TODO: This is becoming not nice, and not clear
225 shop: actorName,
226 scrapedAt: new Date().toISOString().split(`T`)[0],
227 }))
228
229 const columns = getColumns(objsPg)
230 const values = getValues(objsPg)
231 const queryString = `
232 INSERT INTO public."${process.env.PG_DATA_TABLE}" (${columns})
233 VALUES (${values})
234 `
235 try {
236 const { rowCount } = await pgClient.query(queryString)
237 console.log(`[save] saved to database: ${JSON.stringify(rowCount)}`)
238 } catch (err) {
239 if (err.message.includes(`violates unique constraint`)) console.warn(`PostgresSQL: violates unique constraint`)
240 else throw err
241 }
242 }
243
244 // Only make sense for HlidacShopu
245 if (pgClientNormalized) {
246 const objsPgData = objs.map((obj) => ({
247 shop: actorName,
248 pid: obj.pid,
249 name: obj.name,
250 url: obj.url,
251 img: obj.img,
252 }))
253
254 const objsPgDataPrice = objs.map((obj) => ({
255 shop: actorName,
256 pid: obj.pid,
257 scrapedAt: new Date().toISOString().split(`T`)[0],
258 currentPrice: obj.currentPrice,
259 originalPrice: obj.originalPrice,
260 inStock: obj.inStock,
261 }))
262
263 const queryString = `
264 INSERT INTO public."${process.env.PG_DATA_TABLE}" (${getColumns(objsPgData)})
265 VALUES (${getValues(objsPgData)})
266 ON CONFLICT DO NOTHING
267 `
268 try {
269 const { rowCount } = await pgClientNormalized.query(queryString)
270 console.log(`[save] saved to database (data): ${JSON.stringify(rowCount)}`)
271 } catch (err) {
272 if (err.message.includes(`violates unique constraint`)) console.warn(`PostgresSQL: violates unique constraint`)
273 else throw err
274 }
275
276 const queryStringPrice = `
277 INSERT INTO public."${process.env.PG_DATA_PRICE_TABLE}" (${getColumns(objsPgDataPrice)})
278 VALUES (${getValues(objsPgDataPrice)})
279 ON CONFLICT DO NOTHING
280 `
281 try {
282 const { rowCount } = await pgClientNormalized.query(queryStringPrice)
283 console.log(`[save] saved to database (price): ${JSON.stringify(rowCount)}`)
284 } catch (err) {
285 if (err.message.includes(`violates unique constraint`)) console.warn(`PostgresSQL: violates unique constraint`)
286 else throw err
287 }
288 }
289
290 if (elasticClient) {
291 // .index creates or updates the document
292 // .create creates a new document if it doesn't exist, 409 if it does
293 // try {
294 // const res = await elasticClient.index({
295 // index: `actors-monorepo-shops`, // TODO: Consider using actorName
296 // id, // foo-bar
297 // document: objExtended, // {...}
298 // })
299 // } catch (err) {
300 // // https://discuss.elastic.co/t/elasticsearch-503-ok-false-message-the-requested-deployment-is-currently-unavailable/200583
301 // if (err.message.includes(`requested resource is currently unavailable`)) console.log(`Elasticsearch is unavailable, skipping, but not aborting`)
302 // else throw err
303 // }
304 }
305}
306
307function getColumns (objs) {
308 return Object.keys(objs[0]).map((key) => `"${key}"`).join(`, `)
309}
310
311function getValues (objs) {
312 return objs.map(objPg => Object.values(objPg).map((value) => {
313 // escape strings to prevent SQL injection
314 if (typeof value === `string`) return `'${value.replace(/'/g, `''`)}'`
315 // convert to DB specific null
316 if (typeof value === `undefined` || value === null) return `NULL`
317 return value
318 }).join(`, `)).join(`), (`)
319}
320
321export function parseEnvFromInput (input) {
322 const env = {}
323 for (const key in input) {
324 if (key === key.toUpperCase()) env[key] = input[key]
325 }
326 console.log(`[parseEnvFromInput] ${JSON.stringify(env)}`)
327 Object.assign(process.env, env)
328}
Developer
Maintained by Community
Categories