- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
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)