- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Тренды маркетинга в 2024 году: мобильные продажи, углубленная аналитика и ИИ
Экспертная оценка Адмитад
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
(defterm LISP ("супер паук" (писать (его (нужно (на (этом (языке (да (это (выглядит (как (неудачная (шутка))))))))))))))
"Лучше день потерять, потом за пять минут долететь." (c) Крылья, ноги и хвосты
У автора темы простая и предельно понятная задача: "обойти все домены в зоне .ru и проверить главную страницу на вхождение определённой строки". В теме вспомнили много разных языков, но не уверен, что приблизили автора к выбору чего-то конкретного. При этом нет гарантии, что после написания программы окажется, что не учли какую-нибудь особенность, из-за которой всё надо начинать сначала.
Мне стало интересно, в какие ресурсы упрётся паук на большом объёме доменов, поэтому решил набросать решение, на что ушло 20 минут. Вот скрипт:
var fs = require('fs'),
async = require('async'),
request = require('request');
var selcount = 1000; // Количество тестируемых доменов
var reg = /windows-1251/im;
var total_processed = 0;
var total_matched = 0;
var total_errors = 0;
var main_task = function(url, callback) {
total_processed++;
request(url, function (error, response, body) {
if (!error && (response.statusCode == 200)) {
if (body.match(reg)) {
total_matched++;
}
return callback();
} else {
total_errors++;
return callback();
}
});
};
var queue = async.queue(main_task, 200); // Максимальный размер параллельных задач
queue.drain = function(err) {
if (err) {
console.log('ERROR in drain: ' + err);
}
worktime = (new Date().getTime()) - worktime;
console.log('Processed ', total_processed, ' tasks');
console.log('with errors: ', total_errors);
console.log('matched: ', total_matched);
console.log('Total time: ', worktime, ' ms');
console.log('per url: ', worktime / total_processed, ' ms');
}
var all_domains = fs.readFileSync('ru_domains', {'encoding': 'utf-8'}).split('\n');
console.log('Found ', all_domains.length, ' domains');
var worktime = new Date().getTime();
while (selcount > 0) {
selcount--;
queue.push('http://' + all_domains[Math.floor(Math.random() * all_domains.length)].split('\t')[0]);
}
Для запуска надо скачать nodejs, потом поставить зависимости "npm install request async" и запустить.
Чтобы понять динамику поигрался параметрами. Вот пример нескольких запусков:
Можно заметить, что примерно половина доменов не отвечает на запросы. Частично это может быть связано с двухлетней давностью базы (когда-то была скачена), но, подозреваю, что проблема просто в массовых регистрациях доменов.
Основной причиной задержек являлись подвешенные соединения, которые отваливались лишь по таймауту. Тут самый простой путь - это кардинально уменьшить таймаут.
P.S. Считаете, что на другом языке будет быстрее? Тогда приведите ваше решение, а я попробую оптимизировать своё. Батл пауков?
У автора темы простая и предельно понятная задача: "обойти все домены в зоне .ru и проверить главную страницу на вхождение определённой строки".
Коллеги, на каком языке предпочтительнее (в плане производительности) писать многопоточный граббер контента с сайтов?
Чую через пару страниц будет разговор про парсинг картинок с котиками, но никак не про задачу ТС :D
Чую через пару страниц будет разговор про парсинг картинок с котиками, но никак не про задачу ТС :D
Nam3D, автор в теме давал вполне чёткие пояснения:
Пока хочется со своего средненького десктопа обойти зону .ru (только морды) за пару часов. Реально ли это в принципе?
Ну и полученные страницы хранить не нужно. Только проверить наличие подстроки и записать флаг в бд.
---------- Добавлено 17.09.2014 в 00:14 ----------
Кстати, если уж говорить про зависимость решения от железа, языка программирования, ОС и т.п., то ключевым является наличие неблокируемых сокетов. Сеть будет самым медленным звеном.
P.S. На всякий случай дам ссылку на статью про миллион соединений http://habrahabr.ru/post/123154/
проще на пхп, но если не принципиально, то лучеш перл и под линукс
Я бы глянул такого убогого паука написанного на PHP, который синхронно будет тыкатся в одну обработку за другой 😂
Благодарю всех участников топика.
Пока вроде добился 400 000 в час на apache+php+multicurl. Со streams/sockets еще надо будет поэкспериментировать. Если, конечно, никто не скажет, что на *** легко сграбить пару миллионов в час на моем железе и при этом прогрузить все страницы полностью (мультикурл прогружает по-разному в зависимости от числа потоков и таймаутов).
Пока вроде добился 400 000 в час на apache+php+multicurl. Со streams/sockets еще надо будет поэкспериментировать. Если, конечно, никто не скажет, что на *** легко сграбить пару миллионов в час на моем железе и при этом прогрузить все страницы полностью (мультикурл прогружает по-разному в зависимости от числа потоков и таймаутов).
Ясно теперь кто отказы на сайтах плодит 😡
Nam3D, напоминаю: я обхожу зону ru (по одному запросу на домен). И сдается мне, что много времени уходит на внутреннюю работу мультикурла с днс.
Пока вроде добился 400 000 в час на apache+php+multicurl.
Если не секрет, то какой таймаут поставили и сколько доменов по нему отваливается (процент)?
К слову только вчера запустил чекер на checkparams с домашней машины, забыв включить прокси - 600 запросов в секунду при 200 потоках (загрузка 2 ядра процессора). Через 15 минут меня начал игнорить ДНС сервер провайдера :)