Compare commits
2 Commits
email-dens
...
saljic-cra
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f56cd5b549 | ||
|
|
addd8c1344 |
@@ -41,10 +41,6 @@ const PROSTOR_LOGIN = {
|
|||||||
PASSWORD: process.env.PROSTOR_LOGIN_PASS
|
PASSWORD: process.env.PROSTOR_LOGIN_PASS
|
||||||
};
|
};
|
||||||
|
|
||||||
const USER_AGENT =
|
|
||||||
process.env.USER_AGENT ||
|
|
||||||
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36";
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
APP_PORT,
|
APP_PORT,
|
||||||
APP_URL,
|
APP_URL,
|
||||||
@@ -58,6 +54,5 @@ module.exports = {
|
|||||||
API_MAP_KEY,
|
API_MAP_KEY,
|
||||||
STAGING,
|
STAGING,
|
||||||
CHECK_UP_DAYS,
|
CHECK_UP_DAYS,
|
||||||
PROSTOR_LOGIN,
|
PROSTOR_LOGIN
|
||||||
USER_AGENT
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const fetch = require("../../helpers/fetchWrapper");
|
const fetch = require("node-fetch");
|
||||||
const cheerio = require("cheerio");
|
const cheerio = require("cheerio");
|
||||||
const Promise = require("bluebird");
|
const Promise = require("bluebird");
|
||||||
const moment = require("moment-timezone");
|
const moment = require("moment-timezone");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const fetch = require("../../helpers/fetchWrapper");
|
const fetch = require("node-fetch");
|
||||||
const cheerio = require("cheerio");
|
const cheerio = require("cheerio");
|
||||||
const Promise = require("bluebird");
|
const Promise = require("bluebird");
|
||||||
const moment = require("moment-timezone");
|
const moment = require("moment-timezone");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const fetch = require("../../helpers/fetchWrapper");
|
const fetch = require("node-fetch");
|
||||||
const cheerio = require("cheerio");
|
const cheerio = require("cheerio");
|
||||||
const moment = require("moment-timezone");
|
const moment = require("moment-timezone");
|
||||||
const FormData = require("form-data");
|
const FormData = require("form-data");
|
||||||
@@ -191,7 +191,13 @@ class ProstorCrawler {
|
|||||||
const { lat, lng, property_name, price, size, link, status } = realEstate;
|
const { lat, lng, property_name, price, size, link, status } = realEstate;
|
||||||
|
|
||||||
//Status information is given already in realestate list
|
//Status information is given already in realestate list
|
||||||
const adStatus = ProstorCrawler.getStatusId(status);
|
//For VIP Ads status ='' canot be used, but no VIP ads are crawled
|
||||||
|
//We will make "fake" vip ad for RE that have size=55
|
||||||
|
//It is weird because yesterday it said 'VIP ponuda' ???
|
||||||
|
const adStatus =
|
||||||
|
size === "55"
|
||||||
|
? ProstorCrawler.getStatusId("VIP ponuda")
|
||||||
|
: ProstorCrawler.getStatusId(status);
|
||||||
|
|
||||||
const url = `https://prostor.ba${link}`;
|
const url = `https://prostor.ba${link}`;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const fetch = require("../../helpers/fetchWrapper");
|
const fetch = require("node-fetch");
|
||||||
const cheerio = require("cheerio");
|
const cheerio = require("cheerio");
|
||||||
const Promise = require("bluebird");
|
const Promise = require("bluebird");
|
||||||
const moment = require("moment-timezone");
|
const moment = require("moment-timezone");
|
||||||
@@ -399,9 +399,7 @@ class RentalCrawler {
|
|||||||
);
|
);
|
||||||
if (!publishedDateMoment.isValid()) {
|
if (!publishedDateMoment.isValid()) {
|
||||||
throw {
|
throw {
|
||||||
message: `Invalid published date : ${
|
message: `Invalid published date : ${extractedData["re_realEstates_inserted"]}`
|
||||||
extractedData["re_realEstates_inserted"]
|
|
||||||
}`
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -412,9 +410,7 @@ class RentalCrawler {
|
|||||||
);
|
);
|
||||||
if (!renewedDateMoment.isValid()) {
|
if (!renewedDateMoment.isValid()) {
|
||||||
throw {
|
throw {
|
||||||
message: `Invalid renewed date : ${
|
message: `Invalid renewed date : ${extractedData["re_realEstates_edited"]}`
|
||||||
extractedData["re_realEstates_edited"]
|
|
||||||
}`
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const fetch = require("../../helpers/fetchWrapper");
|
const fetch = require("node-fetch");
|
||||||
const cheerio = require("cheerio");
|
const cheerio = require("cheerio");
|
||||||
const moment = require("moment-timezone");
|
const moment = require("moment-timezone");
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ class SaljicCrawler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async scrapeAd(url, adType) {
|
async scrapeAd(url, adType) {
|
||||||
// console.log("[SALJIC] Scraping : ", url);
|
console.log("[SALJIC] Scraping : ", url);
|
||||||
try {
|
try {
|
||||||
const adPageSource = await fetch(url);
|
const adPageSource = await fetch(url);
|
||||||
const body = await adPageSource.text();
|
const body = await adPageSource.text();
|
||||||
@@ -227,7 +227,9 @@ class SaljicCrawler {
|
|||||||
// No information for status ex. PRODAN
|
// No information for status ex. PRODAN
|
||||||
const status = AD_STATUS.STATUS_NORMAL;
|
const status = AD_STATUS.STATUS_NORMAL;
|
||||||
//Extracting agency ID from url
|
//Extracting agency ID from url
|
||||||
const agencyObjectId = parseInt(url.substring(46, url.length));
|
const agencyObjectId = url
|
||||||
|
? parseInt(url.substring(46, url.length))
|
||||||
|
: null;
|
||||||
|
|
||||||
//Extracting main properties
|
//Extracting main properties
|
||||||
const propertySelectors = {
|
const propertySelectors = {
|
||||||
@@ -272,14 +274,10 @@ class SaljicCrawler {
|
|||||||
.trim();
|
.trim();
|
||||||
|
|
||||||
const latAndLongSrc = $(propertySelectors.latAndLong).attr("src");
|
const latAndLongSrc = $(propertySelectors.latAndLong).attr("src");
|
||||||
const latText = latAndLongSrc.substring(
|
const tmpLatLong = latAndLongSrc.split("marker=")[1];
|
||||||
latAndLongSrc.indexOf("marker=") + 7,
|
const latText = tmpLatLong.split("%2C")[0];
|
||||||
latAndLongSrc.indexOf("%2C", latAndLongSrc.indexOf("marker="))
|
const longText = tmpLatLong.split("%2C")[1];
|
||||||
);
|
|
||||||
const longText = latAndLongSrc.substring(
|
|
||||||
latAndLongSrc.indexOf("%2C", latAndLongSrc.indexOf("marker=")) + 3,
|
|
||||||
latAndLongSrc.length
|
|
||||||
);
|
|
||||||
const locationLat = parseFloat(latText) || null;
|
const locationLat = parseFloat(latText) || null;
|
||||||
const locationLong = parseFloat(longText) || null;
|
const locationLong = parseFloat(longText) || null;
|
||||||
|
|
||||||
@@ -328,11 +326,10 @@ class SaljicCrawler {
|
|||||||
let numberOfViewsKivi = null;
|
let numberOfViewsKivi = null;
|
||||||
let streetNumber = 0;
|
let streetNumber = 0;
|
||||||
let adStatus = status;
|
let adStatus = status;
|
||||||
let shortDescription = descriptions.substring(
|
let shortDescription = descriptions
|
||||||
0,
|
? descriptions.substring(0, descriptions.indexOf("."))
|
||||||
descriptions.indexOf(".")
|
: "";
|
||||||
);
|
let longDescription = descriptions || "";
|
||||||
let longDescription = descriptions;
|
|
||||||
//Extracting data - Glavne karakteristike
|
//Extracting data - Glavne karakteristike
|
||||||
let mainFieldIndex = 1;
|
let mainFieldIndex = 1;
|
||||||
do {
|
do {
|
||||||
@@ -343,10 +340,14 @@ class SaljicCrawler {
|
|||||||
.replace(/[\n\r\t]/gm, "")
|
.replace(/[\n\r\t]/gm, "")
|
||||||
.trim();
|
.trim();
|
||||||
|
|
||||||
const mainFieldTitle = mainField.substring(0, mainField.indexOf(" "));
|
const mainFieldTitle = mainField
|
||||||
|
? mainField.substring(0, mainField.indexOf(" "))
|
||||||
|
: "";
|
||||||
const mainFieldValue = mainField
|
const mainFieldValue = mainField
|
||||||
.substring(mainField.indexOf(" "), mainField.length)
|
? mainField
|
||||||
.trim();
|
.substring(mainField.indexOf(" "), mainField.length)
|
||||||
|
.trim()
|
||||||
|
: "";
|
||||||
|
|
||||||
switch (mainFieldTitle) {
|
switch (mainFieldTitle) {
|
||||||
case "Površina":
|
case "Površina":
|
||||||
|
|||||||
@@ -332,14 +332,10 @@ const findRealEstatesForSearchRequest = async (searchRequest, maxResults) => {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//When includeIncompleteAds are not defined - null it will consider it true
|
|
||||||
const order = [["updatedAt", "desc"]];
|
const order = [["updatedAt", "desc"]];
|
||||||
|
|
||||||
return db.RealEstate.findAll({
|
return db.RealEstate.findAll({
|
||||||
where:
|
where: includeIncompleteAds ? queryIncludeIncomplete : query,
|
||||||
includeIncompleteAds || includeIncompleteAds == null
|
|
||||||
? queryIncludeIncomplete
|
|
||||||
: query,
|
|
||||||
limit: maxResults,
|
limit: maxResults,
|
||||||
order
|
order
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -156,11 +156,30 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
// If real estate dont have defined number of rooms ex. null
|
// If real estate dont have defined number of rooms ex. null
|
||||||
//It returns all search requests except for ones that dont want incpomlete ads
|
//It returns requests that didn't choose number of rooms - also null
|
||||||
|
//Or ones that picked some values but also picked to includeIncomplete ads
|
||||||
numberOfRoomsQuery = {
|
numberOfRoomsQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
numberOfRoomsMin: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
numberOfRoomsMax: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,9 +209,27 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
numberOfFloorsQuery = {
|
numberOfFloorsQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
numberOfFloorsMin: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
numberOfFloorsMax: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -221,9 +258,27 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
floorQuery = {
|
floorQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
floorMin: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
floorMax: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -232,7 +287,7 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
//If user dont check checkbox for ex. elevator it does not mean he only wants no elevator
|
//If user dont check checkbox for ex. elevator it does not mean he only wants no elevator
|
||||||
//If real estate characteristic =true find all req, one that wants charachertistic or dont care - dont need query
|
//If real estate characteristic =true find all req, one that wants charachertistic or dont care - dont need query
|
||||||
//If real estate characteristic = false, find all req exept for ones that wants characteristic to be true
|
//If real estate characteristic = false, find all req exept for ones that wants characteristic to be true
|
||||||
//If real estate characteristic = null, dont know if true or false, find all req except ones that dont want incomplete ads
|
//If real estate characteristic = null, dont know if true or false, find req that dont care or want char and want incomplete ads
|
||||||
let balconyQuery = {};
|
let balconyQuery = {};
|
||||||
if (realEstateTypeObject.hasBalconyProp && balcony !== true) {
|
if (realEstateTypeObject.hasBalconyProp && balcony !== true) {
|
||||||
if (balcony === false) {
|
if (balcony === false) {
|
||||||
@@ -243,9 +298,27 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else if (balcony === null) {
|
} else if (balcony === null) {
|
||||||
balconyQuery = {
|
balconyQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
balcony: {
|
||||||
|
[Op.ne]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
balcony: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -259,9 +332,27 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else if (newBuilding === null) {
|
} else if (newBuilding === null) {
|
||||||
newBuildingQuery = {
|
newBuildingQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
newBuilding: {
|
||||||
|
[Op.ne]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
newBuilding: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -275,13 +366,30 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else if (elevator === null) {
|
} else if (elevator === null) {
|
||||||
elevatorQuery = {
|
elevatorQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
elevator: {
|
||||||
|
[Op.ne]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
elevator: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//General query consists of each individual query
|
//General query consists of each individual query
|
||||||
const query = {
|
const query = {
|
||||||
adType,
|
adType,
|
||||||
@@ -315,13 +423,10 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
[Op.eq]: "ANY"
|
[Op.eq]: "ANY"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
//Tag to check if incomplete ads are accepted in query which is default
|
//Tag to check if incomplete ads are accepted in query
|
||||||
if (checkForIncompleteWanted) {
|
if (checkForIncompleteWanted) {
|
||||||
query.includeIncompleteAds = {
|
query.includeIncompleteAds = {
|
||||||
[Op.or]: {
|
[Op.eq]: true
|
||||||
[Op.eq]: true,
|
|
||||||
[Op.is]: null
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
const nodeFetch = require("node-fetch");
|
|
||||||
const { USER_AGENT } = require("../config/appConfig");
|
|
||||||
|
|
||||||
const fetch = async (url, options = {}) => {
|
|
||||||
const newOptions = Object.assign({}, options);
|
|
||||||
if (!newOptions["headers"]) {
|
|
||||||
newOptions["headers"] = {};
|
|
||||||
}
|
|
||||||
newOptions["headers"]["User-Agent"] = USER_AGENT;
|
|
||||||
return nodeFetch(url, newOptions);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = fetch;
|
|
||||||
@@ -15,7 +15,15 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
allowNull: false,
|
allowNull: false,
|
||||||
defaultValue: {
|
defaultValue: {
|
||||||
type: "Polygon",
|
type: "Polygon",
|
||||||
coordinates: [[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]],
|
coordinates: [
|
||||||
|
[
|
||||||
|
[0, 0],
|
||||||
|
[0, 0],
|
||||||
|
[0, 0],
|
||||||
|
[0, 0],
|
||||||
|
[0, 0]
|
||||||
|
]
|
||||||
|
],
|
||||||
crs: { type: "name", properties: { name: "EPSG:4326" } }
|
crs: { type: "name", properties: { name: "EPSG:4326" } }
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ const notifyRequestsWithDailyOption = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const checkUpNotify = async () => {
|
const checkUpNotify = async () => {
|
||||||
/* const searchRequestsForCheckUp = await findAllRequestsForCheckUp();
|
/* const searchRequestsForCheckUp = await findAllRequestsForCheckUp();
|
||||||
|
|
||||||
const asyncSendEmailActions = [];
|
const asyncSendEmailActions = [];
|
||||||
|
|
||||||
@@ -144,7 +144,7 @@ const checkUpNotify = async () => {
|
|||||||
asyncSendEmailActions.push(sendEmailPromise);
|
asyncSendEmailActions.push(sendEmailPromise);
|
||||||
sendEmailPromise.catch(err => console.log("[Email Sending Failed]", err));
|
sendEmailPromise.catch(err => console.log("[Email Sending Failed]", err));
|
||||||
}
|
}
|
||||||
await Promise.all(asyncSendEmailActions); */
|
await Promise.all(asyncSendEmailActions); */
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|||||||
@@ -61,8 +61,9 @@
|
|||||||
<p class="distinguished">
|
<p class="distinguished">
|
||||||
<label class="checkbox-label">
|
<label class="checkbox-label">
|
||||||
<input type="checkbox" class="filled-in" name="includeIncompleteAds"
|
<input type="checkbox" class="filled-in" name="includeIncompleteAds"
|
||||||
|
<% if (includeIncompleteAds) { %>
|
||||||
checked
|
checked
|
||||||
>
|
<% } %>>
|
||||||
<span>Uključi i oglase bez potpunih informacija</span>
|
<span>Uključi i oglase bez potpunih informacija</span>
|
||||||
</label>
|
</label>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ APP_BASE_URL=base url for the app
|
|||||||
|
|
||||||
ENVIRONMENT=Variable to denote development, staging and production
|
ENVIRONMENT=Variable to denote development, staging and production
|
||||||
|
|
||||||
USER_AGENT=User agent header to send in fetch requests
|
|
||||||
|
|
||||||
MAX_REAL_ESTATES_IN_EMAIL=Max number of real estates that will be shown in email, others will be truncated and URL with full list will be shwon
|
MAX_REAL_ESTATES_IN_EMAIL=Max number of real estates that will be shown in email, others will be truncated and URL with full list will be shwon
|
||||||
MAX_REAL_ESTATES_IN_FIRST_EMAIL=Max number of real estates that will be shown in first (welcome) email
|
MAX_REAL_ESTATES_IN_FIRST_EMAIL=Max number of real estates that will be shown in first (welcome) email
|
||||||
@@ -70,4 +69,4 @@ AKTIDO_FORCE_CRAWL=Non-zero value will force crawler to crawl all pages without
|
|||||||
SALJIC_MAX_RESULTS_PER_PAGE=For Saljic crawler, this represents how many ads are crawled at once
|
SALJIC_MAX_RESULTS_PER_PAGE=For Saljic crawler, this represents how many ads are crawled at once
|
||||||
SALJIC_CRAWLER_AD_TYPE=enum name of what type of ads should be crawled, check common/enums.js file for valid values
|
SALJIC_CRAWLER_AD_TYPE=enum name of what type of ads should be crawled, check common/enums.js file for valid values
|
||||||
SALJIC_CRAWLER_AD_CATEGORIES=comma separated list of enum names of categories to be included, check common/enums.js file for valid values
|
SALJIC_CRAWLER_AD_CATEGORIES=comma separated list of enum names of categories to be included, check common/enums.js file for valid values
|
||||||
SALJIC_FORCE_CRAWL=Non-zero value will force crawler to crawl all pages without stopping when known real estate is found
|
SALJIC_FORCE_CRAWL=Non-zero value will force crawler to crawl all pages without stopping when known real estate is found
|
||||||
Reference in New Issue
Block a user