- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Одноклассники пресекли более 9 млн подозрительных входов в учетные записи
И выявили более 7 млн подозрительных пользователей
Оксана Мамчуева
billypelegrini, Где код который ты прошел? Пока он только на твоих словах. Дай сюда код, чтобы народ увидел твоё прошел.
XPraptor, тебе ничего не собираюсь доказывать, а код выкладывал)) и даже скрин коотрый было тяжело не заметить))
На скрине нет ничего пройденного - нет текста "Блок покрашен", цвет не тот - что ты выкладывал? А код где, нет там кода нигде?
Честно бро. поднадоел ты да ты уж прости за резкость
---------- Добавлено 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)
Честно бро.
Я тебе не Бро, я учитель-учителя, Госу, етить его налево :)
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)
А зачем в примере с закраской квадрата заморачиваться с событиями мыши, если можно в хромотулзе посмотреть последовательность запросов и сделать такие же? Или я чего-то не понимаю?
покрась ботом квадрат:
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
Затем создав сценарий из вышеуказанных трех строчек и запустив его.
На мой неискушенный взгляд, в этом топике не гуру чему-то обучает, а чисто детский сад.
Twickbot, давай ты воздержишся впредь от подобных реплк в мой адрес. Также не совсем корректно постить сюда пиарлинки, но ок, ты это протащил через "3 строчки" кода, обсуждать мой уровень компетенции это также офтоп, во-первых я его здесь не демонстрирую в полной мере и не намерен, во-вторых - это примеры для начинающих, то есть не ставится задача создать нечто сложное, но и потом здесь рассмотрена работа именно с Nodejs, мне конечно интерсно что можно делать таким ботом затрачивая лишний ресурс на эмуляцю окна браузера чего нельзя обойти с использованием меньших ресурсов, не качая разный непонятный софт, который похоже основан на том же селениуме.. То есть в целом ты мог разместить здесь своё решение, и это бы не было вроде как офтопом, но отпускать подобные реплики, навешивать какие-то ярлыки, придираться к уровню мануалов... ты просто ведешь себя некорректно и вызывающе, это не добавляет плюсов ни тебе ни твоим продуктам. Я бы на твоём месте поработал над корректностью самопрезентации и так не позорился больше, хотя это уже не в первый раз с твоей стороны, и я почему-то думаю что ты над собой не работаешь в данном направлении, и в ответ я услышу какую-то бессвязную брань в свой адрес, подобную той что ты написал выше, на чем диалог с тобой прекращаю.
---------- Добавлено 12.10.2019 в 11:03 ----------
На мой неискушенный взгляд
Ну и в дополнение чтобы окончательно уже вбитьгвоздьвнеускушеннуюголову прояснть момент по 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)
#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)