Быстрый поисковый робот в Интернете

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

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

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

РЕДАКТИРОВАТЬ: Решение состояло в том, чтобы объединить модули multiprocessing и threading. Создайте несколько процессов с несколькими потоками на процесс для достижения наилучшего эффекта. Создание нескольких потоков в одном процессе неэффективно, а несколько процессов с одним потоком потребляют слишком много памяти.


person pbp    schedule 04.10.2011    source источник
comment
Вы не получите лучших результатов, используя многопоточность Python после определенного момента, из-за глобальной блокировки интерпретатора. Кроме того, я готов поспорить, что вы не сможете заполнить 100-мегабитную линию без получения дубликатов. Короче говоря, вы преждевременно оптимизируете.   -  person Falmarri    schedule 04.10.2011
comment
Вы проверили Scrapy? Это довольно круто для такого рода вещей.. scrapy.org   -  person Mike Christensen    schedule 05.10.2011
comment
@Falmarri: пожалуйста, уточните, почему вы думаете, что я не смогу насытиться. Если на странице в среднем ~ 50 КБ, мне нужно обработать ~ 200 URL-адресов в секунду. насытить. Как вы думаете, это проблема?   -  person pbp    schedule 05.10.2011
comment
Можете ли вы запустить несколько поисковых роботов одновременно?   -  person Mike Christensen    schedule 05.10.2011
comment
@pbp: Проблема в том, что для насыщения вам нужно сканировать 100% времени. Но вам нужно выполнить некоторую обработку входящих данных, чтобы определить, являются ли ссылки, которые вы видите, дубликатами, прежде чем отправлять сканер. Я сделал этот комментарий, потому что вы, вероятно, можете получить что-то вроде 95% или даже 99% насыщенности, но не 100%. Но прежде чем мы углубимся в детали, вы, вероятно, должны сообщить нам свои реальные цифры.   -  person Falmarri    schedule 06.10.2011
comment
@Falmarri: это неверно. Ваши рассуждения могут быть использованы для доказательства того, что невозможно насытить линии сколь угодно малой пропускной способностью (замените линию 1Мбит на 100Мбит).   -  person pbp    schedule 26.10.2011
comment
Обратите внимание, что веб-сканирование — это «не» интеллектуальный анализ данных. Интеллектуальный анализ данных — это очень тяжелый метод анализа статистики, см. Википедию. Это звучит для меня так же, как обычный веб-паук.   -  person Has QUIT--Anony-Mousse    schedule 14.10.2012


Ответы (5)


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

person TorelTwiddler    schedule 04.10.2011
comment
Использование многопроцессорности помогло. При 100 процессах я получаю около 20 Мбит трафика. Проблема заключается в нагрузке на память - интерпретатор Python занимает ~ 7 МБ памяти, что очень много. - person pbp; 05.10.2011
comment
Ну, вы определенно используете слишком много процессов. Большинство параллельных алгоритмов порождают ровно столько процессов, сколько у них ядер. Если вы тратите время на ожидание веб-сайтов, создайте еще несколько. Попробуйте найти какой-то баланс, который дает большое количество страниц в секунду (возможно, также используйте Scrapy, как предлагали другие). - person TorelTwiddler; 05.10.2011

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

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

тест urllib

ОБНОВИТЬ:

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

person Attila O.    schedule 04.10.2011
comment
100 страниц для определенного (одного) домена? - person pbp; 05.10.2011
comment
Да, 100 страниц для одного домена, размещенного в той же стране, что и сам сканер (Германия). - person Attila O.; 05.10.2011
comment
Scrapy никогда не использовал модуль Requests, потому что Scrapy написан поверх Twisted. Хотя Scrapy подходит для большинства задач парсинга, он мало поддерживает распределенное сканирование, что делает его несколько бесполезным для крупномасштабных обходов. - person Blender; 02.05.2014

Около 2 лет назад я разработал краулер. И он может загружать почти 250 URL-адресов в секунду. Ты мог бы течь по моим шагам.

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

    а. загрузчик

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

    в. URLпросмотрено

    д. СодержимоеПросмотрено

person Mohiul Alam    schedule 18.07.2012

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

person sw.    schedule 25.10.2012

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

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

person knitti    schedule 04.10.2011