На чем писать паука?

N3
На сайте с 28.04.2014
Offline
98
#31

(defterm LISP ("супер паук" (писать (его (нужно (на (этом (языке (да (это (выглядит (как (неудачная (шутка))))))))))))))

Неискоренимо нежелание пользоваться поисковыми системами - даже находясь на форуме о поисковых системах © Cell Влазить напрямую в базу — это невозможно © Игорь Белов, mchost.ru Если SeoPult купил ссылку - значит она "рабочая" © Nat_SeoPult
A
На сайте с 05.02.2014
Offline
19
#32

"Лучше день потерять, потом за пять минут долететь." (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" и запустить.

Чтобы понять динамику поигрался параметрами. Вот пример нескольких запусков:

>node spider.js

Found 4143226 domains
Processed 10 tasks
with errors: 4
matched: 1
Total time: 2268 ms
per url: 226.8 ms

>node spider.js
Found 4143226 domains
Processed 100 tasks
with errors: 52
matched: 13
Total time: 42932 ms
per url: 429.32 ms

>node spider.js
Found 4143226 domains
Processed 1000 tasks
with errors: 470
matched: 147
Total time: 102080 ms
per url: 102.08 ms

>node spider.js
Found 4143226 domains
Processed 3000 tasks
with errors: 1493
matched: 349
Total time: 134085 ms
per url: 44.695 ms

Можно заметить, что примерно половина доменов не отвечает на запросы. Частично это может быть связано с двухлетней давностью базы (когда-то была скачена), но, подозреваю, что проблема просто в массовых регистрациях доменов.

Основной причиной задержек являлись подвешенные соединения, которые отваливались лишь по таймауту. Тут самый простой путь - это кардинально уменьшить таймаут.

P.S. Считаете, что на другом языке будет быстрее? Тогда приведите ваше решение, а я попробую оптимизировать своё. Батл пауков?

N3
На сайте с 28.04.2014
Offline
98
#33
Asty:
У автора темы простая и предельно понятная задача: "обойти все домены в зоне .ru и проверить главную страницу на вхождение определённой строки".
pastuhoff:
Коллеги, на каком языке предпочтительнее (в плане производительности) писать многопоточный граббер контента с сайтов?

Чую через пару страниц будет разговор про парсинг картинок с котиками, но никак не про задачу ТС :D

A
На сайте с 05.02.2014
Offline
19
#34
Nam3D:
Чую через пару страниц будет разговор про парсинг картинок с котиками, но никак не про задачу ТС :D

Nam3D, автор в теме давал вполне чёткие пояснения:

pastuhoff:
Пока хочется со своего средненького десктопа обойти зону .ru (только морды) за пару часов. Реально ли это в принципе?
pastuhoff:
Ну и полученные страницы хранить не нужно. Только проверить наличие подстроки и записать флаг в бд.



---------- Добавлено 17.09.2014 в 00:14 ----------

Кстати, если уж говорить про зависимость решения от железа, языка программирования, ОС и т.п., то ключевым является наличие неблокируемых сокетов. Сеть будет самым медленным звеном.

P.S. На всякий случай дам ссылку на статью про миллион соединений http://habrahabr.ru/post/123154/

Станислав
На сайте с 27.12.2009
Offline
259
#35
cyberianbrain:
проще на пхп, но если не принципиально, то лучеш перл и под линукс

Я бы глянул такого убогого паука написанного на PHP, который синхронно будет тыкатся в одну обработку за другой 😂

Мы там, где рады нас видеть.
pastuhoff
На сайте с 29.10.2005
Offline
229
#36

Благодарю всех участников топика.

Пока вроде добился 400 000 в час на apache+php+multicurl. Со streams/sockets еще надо будет поэкспериментировать. Если, конечно, никто не скажет, что на *** легко сграбить пару миллионов в час на моем железе и при этом прогрузить все страницы полностью (мультикурл прогружает по-разному в зависимости от числа потоков и таймаутов).

Коллекционер доменных имен.
N3
На сайте с 28.04.2014
Offline
98
#37
pastuhoff:
Пока вроде добился 400 000 в час на apache+php+multicurl. Со streams/sockets еще надо будет поэкспериментировать. Если, конечно, никто не скажет, что на *** легко сграбить пару миллионов в час на моем железе и при этом прогрузить все страницы полностью (мультикурл прогружает по-разному в зависимости от числа потоков и таймаутов).

Ясно теперь кто отказы на сайтах плодит 😡

pastuhoff
На сайте с 29.10.2005
Offline
229
#38

Nam3D, напоминаю: я обхожу зону ru (по одному запросу на домен). И сдается мне, что много времени уходит на внутреннюю работу мультикурла с днс.

A
На сайте с 05.02.2014
Offline
19
#39
pastuhoff:
Пока вроде добился 400 000 в час на apache+php+multicurl.

Если не секрет, то какой таймаут поставили и сколько доменов по нему отваливается (процент)?

AK
На сайте с 23.02.2009
Offline
117
#40

К слову только вчера запустил чекер на checkparams с домашней машины, забыв включить прокси - 600 запросов в секунду при 200 потоках (загрузка 2 ядра процессора). Через 15 минут меня начал игнорить ДНС сервер провайдера :)

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