Бототворения псто

XPraptor
На сайте с 15.10.2004
Offline
333
#101

billypelegrini, Где код который ты прошел? Пока он только на твоих словах. Дай сюда код, чтобы народ увидел твоё прошел.

billypelegrini
На сайте с 20.02.2019
Offline
47
#102

XPraptor, тебе ничего не собираюсь доказывать, а код выкладывал)) и даже скрин коотрый было тяжело не заметить))

XPraptor
На сайте с 15.10.2004
Offline
333
#103

На скрине нет ничего пройденного - нет текста "Блок покрашен", цвет не тот - что ты выкладывал? А код где, нет там кода нигде?

billypelegrini
На сайте с 20.02.2019
Offline
47
#104

Честно бро. поднадоел ты да ты уж прости за резкость

---------- Добавлено 11.10.2019 в 20:21 ----------

#Step 3

Забираем ссылки со страницы. Учитывая что у гугла разная верстка при запросах с разнгых юзерагентов это также необходимо учесть, нармер задампив возвращаемую страницу выдачи в файл и оттуда получив необходимые селекторы.

const axios = require('axios')
const Nightmare = require('nightmare')
const cheerio = require('cheerio')
const fs = require('fs')


const nightmare = Nightmare({
show: true,
gotoTimeout: 30 * 1000, // in ms
waitTimeout: 30 * 1000 // in ms
});

/**
* Google serp
*/
let gsepUrl = 'https://google.com';

let search = 'node books'

let opt = {
url: gsepUrl,
src: search
}

console.log(opt.url)

function getPageGoogleSerp(opt) {

r = opt.url + '/search?q=' + opt.src

axios.get(r)
.then(responce => {
console.log(gserpParseCheerio(responce.data));
})
.catch(e => {
console.log(e);
})
}

let gserpParseCheerio = html => {

data = [];
const $ = cheerio.load(html);

$(html).find('div.ZINbbc.xpd.O9g5cc.uUPGi div.kCrYT').each((row, raw_element) => {

let link = $(raw_element).find('a').attr('href');
let title = $(raw_element).find('a').text();

if (link) {
//console.log(link)
//console.log(title)

data.push({
title : title,
link : link
});
}
});
return data;
}

getPageGoogleSerp(opt)


npm install fs
npm start


...
{
title: 'Practical Node.js by Azat ...Node.js Design Pattern ...Mastering Node.js',
link: '/url?q=https://codeforgeek.com/top-5-node-js-books-read/%23practical-node.js-by-azat-mardan&sa=U&ved=2ahUKEwjbgqi925TlAhWIecAKHSe_C9cQ0gIwBHoECAcQAg&usg=AOvVaw15Cc5hG2Q_TYm6r4YKqkNi'
},
{
title: '11 Best New Node.js Books To Read In 2019 - BookAuthorityhttps://bookauthority.org › ... › Software Development › Node.js Books',
link: '/url?q=https://bookauthority.org/books/new-nodejs-books&sa=U&ved=2ahUKEwjbgqi925TlAhWIecAKHSe_C9cQFjAFegQICBAB&usg=AOvVaw1RitRjpDMtqO4k_0rgZ4zj'
},
{
title: 'The best books to learn node? : node - Reddithttps://www.reddit.com › node › comments › the_best_books_to_learn_node',
link: '/url?q=https://www.reddit.com/r/node/comments/97cazs/the_best_books_to_learn_node/&sa=U&ved=2ahUKEwjbgqi925TlAhWIecAKHSe_C9cQFjAGegQIARAB&usg=AOvVaw3wLU9ahOm9TfViBPDraccU'
},
{
title: 'Learn Nodejs: Best Nodejs courses, tutorials & books 2019 ...https://reactdom.com › node',
link: '/url?q=https://reactdom.com/node&sa=U&ved=2ahUKEwjbgqi925TlAhWIecAKHSe_C9cQFjAHegQIAhAB&usg=AOvVaw3I62V62JdZ9pHhqHQOVYzr'
},
{
title: 'Node.js Books to Read and Master the Technology | Railsware Bloghttps://railsware.com › blog › best-node-js-books-to-master-the-technology',
link: '/url?q=https://railsware.com/blog/best-node-js-books-to-master-the-technology/&sa=U&ved=2ahUKEwjbgqi925TlAhWIecAKHSe_C9cQFjAIegQIBRAB&usg=AOvVaw24XmDphoNgYtYeRwKAG1yx'
},
{
title: 'Express books and blogs - Express.jshttps://expressjs.com › resources › books-blogs',
link: '/url?q=https://expressjs.com/es/resources/books-blogs.html&sa=U&ved=2ahUKEwjbgqi925TlAhWIecAKHSe_C9cQFjAJegQIAxAB&usg=AOvVaw0E-yWYgDsWwWa6jqwfGzzQ'
}

XPraptor
На сайте с 15.10.2004
Offline
333
#105
billypelegrini:
Честно бро.

Я тебе не Бро, я учитель-учителя, Госу, етить его налево :)

billypelegrini
На сайте с 20.02.2019
Offline
47
#106

XPraptor, ещё и буквоед)) мне хоть новое пришествие, молодец вобщем... ты понял))

---------- Добавлено 11.10.2019 в 22:19 ----------

#Step 4

Теперь научим бота гулять по полученному списку линков и сохранять результат в файл:

const axios = require('axios')

const Nightmare = require('nightmare')
const cheerio = require('cheerio')
const fs = require('fs')


const nightmare = Nightmare({
show: true,
gotoTimeout: 30 * 1000, // in ms
waitTimeout: 30 * 1000 // in ms
});

/**
* Google serp
*/
let gsepUrl = 'https://google.com';

let search = 'node books'

let opt = {
url: gsepUrl,
src: search
}

console.log(opt.url)

function getPageGoogleSerp(opt) {

r = opt.url + '/search?q=' + opt.src

axios.get(r)
.then(responce => {

d = gserpParseCheerio(responce.data)

walkSites(d)

d.map((row, elem) => {

fs.appendFile('links.txt', JSON.stringify(row) + "\r\n", (err) => {
if (err) throw err;
//console.log('Saved!');
});

//console.log(JSON.stringify(row));
//console.log(elem);
})


})
.catch(err => {
console.log(err);
})
}

let gserpParseCheerio = html => {

data = [];
const $ = cheerio.load(html);

$(html).find('div.ZINbbc.xpd.O9g5cc.uUPGi div.kCrYT').each((row, raw_element) => {

let link = $(raw_element).find('a').attr('href');
let title = $(raw_element).find('a').text();

if (link) {

let a = link.split("?q=")[1].split("&sa=")[0];

console.log(JSON.stringify({
title : title,
link : a
}));

data.push({
title : title,
link : a
});
}
});
return data;
}

let fwriteLink = links => {

}

let walkSites = links => {

links.map((row, elem) => {
console.log(row.link)

axios.get(row.link)
.then(responce => {
console.log(responce)
})
.catch(err => {
console.log(err);
})
})
}

getPageGoogleSerp(opt)
G
На сайте с 13.08.2017
Offline
23
#107

А зачем в примере с закраской квадрата заморачиваться с событиями мыши, если можно в хромотулзе посмотреть последовательность запросов и сделать такие же? Или я чего-то не понимаю?

Twickbot
На сайте с 13.03.2017
Offline
56
#108
XPraptor:
покрась ботом квадрат:
https://aa2a.ru/events.php

Задачка архипримитивная.

Элементарно решается с помощью написанной мной программы и трех строчек кода:

open_browser('Firefox_RU', [])
open_url('https://aa2a.ru/events.php')
move_cursor_on_element_with_xpath('//*[@id="i_1_"]')

В чем может каждый убедиться, скачав программу и установив ее по этому мануалу:

https://www.twickbot.com/ru/manuals/107-ust-ru

Затем создав сценарий из вышеуказанных трех строчек и запустив его.

На мой неискушенный взгляд, в этом топике не гуру чему-то обучает, а чисто детский сад.

Автоматизация работы в браузере. Пишу парсеры, постеры, кликеры, лайкеры, и т.п.
billypelegrini
На сайте с 20.02.2019
Offline
47
#109

Twickbot, давай ты воздержишся впредь от подобных реплк в мой адрес. Также не совсем корректно постить сюда пиарлинки, но ок, ты это протащил через "3 строчки" кода, обсуждать мой уровень компетенции это также офтоп, во-первых я его здесь не демонстрирую в полной мере и не намерен, во-вторых - это примеры для начинающих, то есть не ставится задача создать нечто сложное, но и потом здесь рассмотрена работа именно с Nodejs, мне конечно интерсно что можно делать таким ботом затрачивая лишний ресурс на эмуляцю окна браузера чего нельзя обойти с использованием меньших ресурсов, не качая разный непонятный софт, который похоже основан на том же селениуме.. То есть в целом ты мог разместить здесь своё решение, и это бы не было вроде как офтопом, но отпускать подобные реплики, навешивать какие-то ярлыки, придираться к уровню мануалов... ты просто ведешь себя некорректно и вызывающе, это не добавляет плюсов ни тебе ни твоим продуктам. Я бы на твоём месте поработал над корректностью самопрезентации и так не позорился больше, хотя это уже не в первый раз с твоей стороны, и я почему-то думаю что ты над собой не работаешь в данном направлении, и в ответ я услышу какую-то бессвязную брань в свой адрес, подобную той что ты написал выше, на чем диалог с тобой прекращаю.

---------- Добавлено 12.10.2019 в 11:03 ----------

Twickbot:
На мой неискушенный взгляд

Ну и в дополнение чтобы окончательно уже вбитьгвоздьвнеускушеннуюголову прояснть момент по SeleniumServer и оконной эмуляуции браузер в "натуральном виде", то.. приводил пример и объяснял что для обхода защит сервисов, снимающих события мыши для использовани в сценариях на странице не обязательно эти события отправлять, достаточно их обойти и это не сложнее чем выполнить в эмуляции браузера (технически по объёму действий при разработке), записывать шаги как в других софтах или набирать сценарии на внутреннем языке сценариев софта.. и это производительнее (!!!) эффективнее NodeJs сейчас ничего нет для этих задач ни в отношении скорости написания, не по числу поддерживаемых платформ ни по производительности. Этот вопос изучался достаточно долго. Всё, вопрос закрыт, несогласные могу дальше писать под Selenium - ваше право.

---------- Добавлено 12.10.2019 в 11:28 ----------

#Step 5

Теперь несколько увеличим скорость работы бота добавив асинхронность. Асинхронность в JavaScript нескольrо похожа на одношаговую многопоточность без управления ресурсами потоков и с использованием разделяемой памяти, но для пакетного получения ответа по списку ссылок этого вполне достатчно, что собственно и происходит в браузере при подгрузке все скриптов - они прогружаются асинхронно, что позволяет ускорить получение собранного кода сраницы.

const axios = require('axios')
const Nightmare = require('nightmare')
const cheerio = require('cheerio')
const fs = require('fs')


const nightmare = Nightmare({
show: true,
gotoTimeout: 30 * 1000, // in ms
waitTimeout: 30 * 1000 // in ms
});

/**
* Google serp
*/
let gsepUrl = 'https://google.com';

let search = 'node books'

let opt = {
url: gsepUrl,
src: search
}

console.log(opt.url)

function getPageGoogleSerp(opt) {

r = opt.url + '/search?q=' + opt.src

axios.get(r)
.then(responce => {

d = gserpParseCheerio(responce.data)

//walkSites()
goAsync(d)

d.map((row, elem) => {

fs.appendFile('links.txt', JSON.stringify(row) + "\r\n", (err) => {
if (err) throw err;
//console.log('Saved!');
});

//console.log(JSON.stringify(row));
//console.log(elem);
})


})
.catch(err => {
console.log(err);
})
}

let gserpParseCheerio = html => {

data = [];
const $ = cheerio.load(html);

$(html).find('div.ZINbbc.xpd.O9g5cc.uUPGi div.kCrYT').each((row, raw_element) => {

let link = $(raw_element).find('a').attr('href');
let title = $(raw_element).find('a').text();

if (link) {

let a = link.split("?q=")[1].split("&sa=")[0];

console.log(JSON.stringify({
title : title,
link : a
}));

data.push({
title : title,
link : a
});
}
});
return data;
}

let fwriteLink = links => {

}

let walkSites = links => {

links.map((row, elem) => {
console.log(row.link)

axios.get(row.link)
.then(responce => {
console.log(responce)
})
.catch(err => {
console.log(err);
})
})
}

//add async
async function goAsync(urls) {

let netPromises = urls.map(walkSitesAsyncAxios);

return await Promise.all(netPromises);
}

let walkSitesAsyncAxios = links => {
axios.get(links.link)
.then(responce => {
console.log(responce)
})
.catch(err => {
console.log(err);
})
}

getPageGoogleSerp(opt)

npm start
billypelegrini
На сайте с 20.02.2019
Offline
47
#110

#Step 6

Получаем данные с полученных страниц. Думаю в примере не лучшая архитектура и на этапе асинхронных запросов лучше отгужать данные в Redis а оттуда получать очередь асинхронно и уже раскидывать по дальнейшим действиям. Собственно на этом момнте можно добавить сэйв в текст или вставку в базу данных.

const axios = require('axios')

const Nightmare = require('nightmare')
const cheerio = require('cheerio')
const fs = require('fs')


const nightmare = Nightmare({
show: true,
gotoTimeout: 30 * 1000, // in ms
waitTimeout: 30 * 1000 // in ms
});

/**
* Google serp
*/
let gsepUrl = 'https://google.com';

let search = 'node books'

let opt = {
url: gsepUrl,
src: search
}

console.log(opt.url)

function getPageGoogleSerp(opt) {

r = opt.url + '/search?q=' + opt.src

axios.get(r)
.then(responce => {

d = gserpParseCheerio(responce.data)

//walkSites()
goAsync(d)

d.map((row, elem) => {

fs.appendFile('links.txt', JSON.stringify(row) + "\r\n", (err) => {
if (err) throw err;
//console.log('Saved!');
});

//console.log(JSON.stringify(row));
//console.log(elem);
})


})
.catch(err => {
console.log(err);
})
}

let gserpParseCheerio = html => {

data = [];
const $ = cheerio.load(html);

$(html).find('div.ZINbbc.xpd.O9g5cc.uUPGi div.kCrYT').each((row, raw_element) => {

let link = $(raw_element).find('a').attr('href');
let title = $(raw_element).find('a').text();

if (link) {

let a = link.split("?q=")[1].split("&sa=")[0];

console.log(JSON.stringify({
title : title,
link : a
}));

data.push({
title : title,
link : a
});
}
});
return data;
}

let fwriteLink = links => {

}

let walkSites = links => {

links.map((row, elem) => {
console.log(row.link)

axios.get(row.link)
.then(responce => {
console.log(responce)
})
.catch(err => {
console.log(err);
})
})
}

//add async
async function goAsync(urls) {

let netPromises = urls.map(walkSitesAsyncAxios);

d = await Promise.all(netPromises);

console.log(d)

return d;
}

let walkSitesAsyncAxios = links => {
return axios.get(links.link)
.then(responce => {
//if (responce.status) {
if (responce.status && responce.status == 200 && responce.statusText == 'OK' && responce.request.res.responseUrl == links.link) {

pageData = [];

const $ = cheerio.load(responce.data);

let title = $('title').text();
let description = $('meta[name=description]').attr('content');
let p = $(responce.data).find('p').text();

p = '<p>' + p.replace(/\n{2,}/g, "</p><p>").replace(/\n/g, "<br>") + '</p>';

//console.log('Title: ' + title)
//console.log('Description: ' + description)
//console.log('P: ' + p)

pageData.push({
link : links.link,
title : title,
description : description,
text : p
});

//console.log(JSON.stringify(pageData))
//console.log(pageData)


return {
link : links.link,
title : title,
description : description,
text : p,
success: true
};


//console.log(responce.data)
//console.log(responce.request.path)
//console.log(responce.request.res.responseUrl)
//console.log(responce.request.res.isAxiosError)


} else return { success: false };
//} else return { success: false };
})
.catch(err => {
// Error
if (err.response) {
// The request was made and the server responded with a status code
// that falls out of the range of 2xx
// console.log(error.response.data);
// console.log(error.response.status);
// console.log(error.response.headers);
} else if (err.request) {
// The request was made but no response was received
// 'error.request' is an instance of XMLHttpRequest in the
// browser and an instance of
// http.ClientRequest in node.js
//console.log(err.request);
} else {
// Something happened in setting up the request that triggered an Error
//console.log(err.config);
//console.log('Error', err.message);
}
//console.log(err);

return { success: false };
})
}

getPageGoogleSerp(opt)

npm start

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий