Быстрый интернет гусеничный - PullRequest
8 голосов
/ 04 октября 2011

Я бы хотел провести интеллектуальный анализ данных в больших масштабах. Для этого мне нужен быстрый сканер. Все, что мне нужно, это что-то загрузить веб-страницу, извлечь ссылки и рекурсивно следовать за ними, но не посещая один и тот же URL дважды. По сути, я хочу избежать зацикливания.

Я уже написал сканер на python, но он слишком медленный. Я не могу насытить 100-мегабитную линию этим. Максимальная скорость ~ 40 URL / сек. и по некоторым причинам трудно получить лучшие результаты. Это похоже на проблему с многопоточностью / сокетами Python. Я также столкнулся с проблемами с сборщиком python gargabe, но это было решаемо. Процессор не является узким местом между прочим.

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

EDIT: Решением было объединить модули multiprocessing и threading. Создайте несколько процессов с несколькими потоками на процесс для лучшего эффекта. Создание нескольких потоков в одном процессе неэффективно, а несколько процессов с одним потоком потребляют слишком много памяти.

Ответы [ 5 ]

7 голосов
/ 05 октября 2011

Почему бы не использовать что-то, уже проверенное для сканирования, например Scrapy ? Мне удалось достичь почти 100 страниц в секунду на низкоуровневом VPS, который имеет ограниченную оперативную память (около 400 МБ), в то время как скорость сети составляла около 6-7 Мбит / с (т.е. ниже 100 Мбит / с).

Еще одно улучшение, которое вы можете сделать, это использовать urllib3 (особенно при сканировании множества страниц с одного домена). Вот краткое сравнение, которое я сделал некоторое время назад:

urllib benchmark

UPDATE:

Scrapy теперь использует библиотеку запросов , которая в свою очередь использует urllib3 . Это делает Scrapy абсолютным инструментом, когда дело доходит до очистки. Последние версии также поддерживают развертывание проектов, поэтому удаление данных с VPS стало проще, чем когда-либо.

3 голосов
/ 18 июля 2012

Около 2 лет назад я разработал гусеничный ход. И это может загрузить почти 250urls в секунду. Вы могли бы течь мои шаги.

  1. Оптимизируйте использование файлового указателя. Попробуйте использовать минимальный указатель файла.
  2. Не пишите свои данные каждый раз. Попробуйте сбросить ваши данные после хранение около 5000 или 10000 URL.
  3. Для вашей надежности вам не нужно использовать другую конфигурацию. Попробуйте использовать файл журнала, и когда вы хотите продолжить, просто попробуйте прочитайте файл журнала и возобновите поиск.
  4. Распределил все ваши задачи веб-сканера. И обработать это в промежутке мудрый.

    а. Загрузчик

    б. экстрактор ссылок

    с. URLSeen

    д. ContentSeen

2 голосов
/ 25 октября 2012

Я написал простой многопоточный сканер.Он доступен на GitHub как Поиск веб-ресурсов , и я написал соответствующую статью: Автоматическое обнаружение каналов блогов и Twitter, Facebook, учетных записей LinkedIn, подключенных к бизнес-сайту .Вы можете изменить количество потоков, используемых в переменной класса NWORKERS.Не стесняйтесь задавать любые дополнительные вопросы, если вам нужна дополнительная помощь.

1 голос
/ 04 октября 2011

Невозможно сказать, каковы ваши ограничения. Ваша проблема похожа на проблему C10K - прочитайте сначала, не оптимизируйте сразу. Идите к низко висящим фруктам: Скорее всего, вы получите значительное улучшение производительности, проанализировав дизайн своего приложения. Не начинайте массово-многопоточную или массово-многопроцессорную обработку.

Я бы использовал Twisted , чтобы написать сетевую часть, это может быть очень быстро. В общем, ввод / вывод на машине должен быть лучше среднего. Либо вы должны написать свои данные на диск или на другую машину, не каждый ноутбук поддерживает постоянную запись в базу данных 10 МБ / с. Наконец, если у вас есть асинхронное подключение к Интернету, возможно, ваш апстрим насыщен. Приоритет ACK помогает здесь (пример OpenBSD).

1 голос
/ 04 октября 2011

Похоже, у вас проблема с дизайном больше, чем с языком.Попробуйте заглянуть в модуль multiprocessing для одновременного доступа к большему количеству сайтов, а не к потокам.Кроме того, рассмотрите возможность получения таблицы для хранения ранее посещенных вами сайтов (возможно, базы данных?).

...