JOBSCRAPER-1 Implement a bit of AI
This commit is contained in:
parent
6a23583b5b
commit
1938bbeb5f
21
lib/base.js
21
lib/base.js
@ -8,7 +8,7 @@
|
|||||||
const filterReject = require('../lib/filter_reject');
|
const filterReject = require('../lib/filter_reject');
|
||||||
const filterAccept = require('../lib/filter_md_jobs');
|
const filterAccept = require('../lib/filter_md_jobs');
|
||||||
const dbmanager = require('../lib/dbmanager');
|
const dbmanager = require('../lib/dbmanager');
|
||||||
const Jobs = require('../lib/mongoManager');
|
const JobsModel = require('../lib/mongoManager');
|
||||||
|
|
||||||
const { Utils } = require('@rakh/utils');
|
const { Utils } = require('@rakh/utils');
|
||||||
const { Corpus } = require('./corpus');
|
const { Corpus } = require('./corpus');
|
||||||
@ -61,13 +61,16 @@ class MasterBase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
addToMongo() {
|
addToMongo() {
|
||||||
console.log('>> ADD TO MONGO!');
|
console.log('>> ADD TO MONGO!');
|
||||||
|
|
||||||
for(const item of this.items) {
|
for(const item of this.items) {
|
||||||
// console.log('add', item);
|
// console.log('add', item);
|
||||||
const newObj = this.reduceData(item);
|
const newObj = this.reduceData(item);
|
||||||
const newJob = Jobs(newObj);
|
const newJob = new JobsModel(newObj);
|
||||||
|
|
||||||
newJob.save().then((m) => {
|
newJob.save().then((m) => {
|
||||||
console.log('m', m.details.title);
|
console.log('m', m.details.title);
|
||||||
@ -77,6 +80,11 @@ class MasterBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param inval
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
analyseRate(inval) {
|
analyseRate(inval) {
|
||||||
console.log('analyseRate', inval);
|
console.log('analyseRate', inval);
|
||||||
let outVal = 0;
|
let outVal = 0;
|
||||||
@ -98,6 +106,11 @@ class MasterBase {
|
|||||||
return outVal;
|
return outVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param d
|
||||||
|
* @returns {{data: {read: number, autoclass: number, applied: number, jobtype: number, class: number}, details: {}}}
|
||||||
|
*/
|
||||||
reduceData(d) {
|
reduceData(d) {
|
||||||
const outObj = { 'details':{}, 'data':{ 'read':0, 'applied':0, 'jobtype': 0, 'class':0, 'autoclass':0 } };
|
const outObj = { 'details':{}, 'data':{ 'read':0, 'applied':0, 'jobtype': 0, 'class':0, 'autoclass':0 } };
|
||||||
|
|
||||||
@ -174,6 +187,10 @@ class MasterBase {
|
|||||||
return `https://image.silvrtree.co.uk/q${q}/${url}`;
|
return `https://image.silvrtree.co.uk/q${q}/${url}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async go() {
|
async go() {
|
||||||
this.items = [];
|
this.items = [];
|
||||||
this.rawItems = [];
|
this.rawItems = [];
|
||||||
|
@ -10,7 +10,7 @@ const mongoose = require('mongoose');
|
|||||||
const log4js = require('log4js');
|
const log4js = require('log4js');
|
||||||
const logger = log4js.getLogger();
|
const logger = log4js.getLogger();
|
||||||
|
|
||||||
const Jobs = require('../models/jobs');
|
const JobsModel = require('../models/jobs');
|
||||||
|
|
||||||
const { Utils } = require('@rakh/utils');
|
const { Utils } = require('@rakh/utils');
|
||||||
|
|
||||||
@ -25,4 +25,4 @@ mongoose.connect(`mongodb://martin:1V3D4m526i@127.0.0.1/jobs`);
|
|||||||
const mDB = mongoose.connection;
|
const mDB = mongoose.connection;
|
||||||
mDB.on('error', console.error.bind(console, 'connection error:'));
|
mDB.on('error', console.error.bind(console, 'connection error:'));
|
||||||
|
|
||||||
module.exports = Jobs;
|
module.exports = JobsModel;
|
||||||
|
@ -21,9 +21,14 @@ class MasterScraper extends MasterBase {
|
|||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* @param useStone
|
||||||
|
* @returns {Promise<unknown>}
|
||||||
|
*/
|
||||||
getContent(url, useStone = false) {
|
getContent(url, useStone = false) {
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
let headers = new Headers({
|
let headers = new Headers({
|
||||||
"Accept" : "application/json",
|
"Accept" : "application/json",
|
||||||
@ -59,6 +64,10 @@ fetch(url, {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async getPage() {
|
async getPage() {
|
||||||
console.log('>> getPage: fetching', this.url);
|
console.log('>> getPage: fetching', this.url);
|
||||||
const now = fecha.format(new Date(), 'YYYY-MM-DD--hhmmss');
|
const now = fecha.format(new Date(), 'YYYY-MM-DD--hhmmss');
|
||||||
@ -75,30 +84,59 @@ fetch(url, {
|
|||||||
|
|
||||||
// Site specific parts below here
|
// Site specific parts below here
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Break each page into items
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async breakPage() {
|
async breakPage() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param part
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async extractDetails(part) {
|
async extractDetails(part) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async checkNext() {
|
async checkNext() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async processSite() {
|
async processSite() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async getIndividualPage() {
|
async getIndividualPage() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async getJobPages() {
|
async getJobPages() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async go() {
|
async go() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,10 @@ class TotaljobsScraper extends MasterScraper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Site specific parts below here
|
// Site specific parts below here
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async breakPage() {
|
async breakPage() {
|
||||||
const $ = this.currentPage;
|
const $ = this.currentPage;
|
||||||
const ads = [];
|
const ads = [];
|
||||||
@ -39,6 +42,11 @@ class TotaljobsScraper extends MasterScraper {
|
|||||||
this.items = [...this.items, ...ads];
|
this.items = [...this.items, ...ads];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param part
|
||||||
|
* @returns {Promise<{}>}
|
||||||
|
*/
|
||||||
async extractDetails(part) {
|
async extractDetails(part) {
|
||||||
const newObj = {};
|
const newObj = {};
|
||||||
const $part = cheerio.load(part);
|
const $part = cheerio.load(part);
|
||||||
@ -61,6 +69,11 @@ class TotaljobsScraper extends MasterScraper {
|
|||||||
return newObj;
|
return newObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param item
|
||||||
|
* @returns {Promise<*>}
|
||||||
|
*/
|
||||||
async getIndividualPage(item) {
|
async getIndividualPage(item) {
|
||||||
const newItem = {...item};
|
const newItem = {...item};
|
||||||
console.log('Getting', item.url);
|
console.log('Getting', item.url);
|
||||||
@ -75,6 +88,10 @@ class TotaljobsScraper extends MasterScraper {
|
|||||||
return newItem;
|
return newItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async getJobPages() {
|
async getJobPages() {
|
||||||
const newItems = [];
|
const newItems = [];
|
||||||
for (let item of this.items) {
|
for (let item of this.items) {
|
||||||
@ -86,6 +103,10 @@ class TotaljobsScraper extends MasterScraper {
|
|||||||
this.items = [...newItems];
|
this.items = [...newItems];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async checkNext() {
|
async checkNext() {
|
||||||
const $ = this.currentPage;
|
const $ = this.currentPage;
|
||||||
const next = $('.pagination > *:last-child').attr('href') || '';
|
const next = $('.pagination > *:last-child').attr('href') || '';
|
||||||
@ -96,6 +117,10 @@ class TotaljobsScraper extends MasterScraper {
|
|||||||
console.log(next);
|
console.log(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async processSite() {
|
async processSite() {
|
||||||
console.log('Processing...');
|
console.log('Processing...');
|
||||||
|
|
||||||
@ -124,6 +149,11 @@ class TotaljobsScraper extends MasterScraper {
|
|||||||
await this.addToMongo();
|
await this.addToMongo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param location
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
async go(location = 'london') {
|
async go(location = 'london') {
|
||||||
this.setStartUrl(`https://www.totaljobs.com/jobs/contract/html-or-vue-or-vuejs-or-web-or-sql-or-delphi-or-vb-or-vbscript-or-php-or-ajax-or-mysql-or-sqlserver-or-javascript-or-node-or-nodejs-or-svelte-or-sveltejs-not-react/in-${encodeURIComponent(location)}?q=Html+Or+Vue+Or+Vuejs+Or+Web+Or+Sql+Or+Delphi+Or+Vb+Or+Vbscript+Or+Php+Or+Ajax+Or+Mysql+Or+Sqlserver+Or+Javascript+Or+Node+Or+Nodejs+Or+Svelte+Or+Sveltejs+NOT+React&postedwithin=3&radius=20`);
|
this.setStartUrl(`https://www.totaljobs.com/jobs/contract/html-or-vue-or-vuejs-or-web-or-sql-or-delphi-or-vb-or-vbscript-or-php-or-ajax-or-mysql-or-sqlserver-or-javascript-or-node-or-nodejs-or-svelte-or-sveltejs-not-react/in-${encodeURIComponent(location)}?q=Html+Or+Vue+Or+Vuejs+Or+Web+Or+Sql+Or+Delphi+Or+Vb+Or+Vbscript+Or+Php+Or+Ajax+Or+Mysql+Or+Sqlserver+Or+Javascript+Or+Node+Or+Nodejs+Or+Svelte+Or+Sveltejs+NOT+React&postedwithin=3&radius=20`);
|
||||||
// this.setStartUrl('https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=javascript+nodejs&as_not=&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=25&l=london&fromage=7&limit=10&sort=date&psf=advsrch&from=advancedsearch');
|
// this.setStartUrl('https://www.indeed.co.uk/jobs?as_and=&as_phr=&as_any=javascript+nodejs&as_not=&as_ttl=&as_cmp=&jt=contract&st=&as_src=&salary=&radius=25&l=london&fromage=7&limit=10&sort=date&psf=advsrch&from=advancedsearch');
|
||||||
|
Loading…
Reference in New Issue
Block a user