Я хотел бы выполнять интеллектуальный анализ данных в больших масштабах. Для этого мне нужен быстрый сканер. Все, что мне нужно, это что-то, чтобы загрузить веб-страницу, извлечь ссылки и рекурсивно переходить по ним, но без повторного посещения одного и того же URL-адреса. В принципе, я хочу избежать зацикливания.
Я уже написал краулер на питоне, но он слишком медленный. Я не могу насытить им 100-мегабитную линию. Максимальная скорость составляет ~ 40 URL/сек. и по какой-то причине трудно получить лучшие результаты. Похоже, проблема с многопоточностью/сокетами python. Я также столкнулся с проблемами со сборщиком мусора Python, но это было решаемо. Кстати, процессор не является узким местом.
Итак, что мне следует использовать, чтобы написать максимально быстрый сканер, и какое решение лучше всего избежать зацикливания при сканировании?
РЕДАКТИРОВАТЬ: Решение состояло в том, чтобы объединить модули multiprocessing и threading. Создайте несколько процессов с несколькими потоками на процесс для достижения наилучшего эффекта. Создание нескольких потоков в одном процессе неэффективно, а несколько процессов с одним потоком потребляют слишком много памяти.
Ответ 1 · рейтинг 1 · TorelTwiddler
Похоже, у вас больше проблема с дизайном, чем с языком. Попробуйте изучить модуль multiprocessing для доступа к большему количеству сайтов одновременно, а не к потокам. Кроме того, подумайте о том, чтобы получить какую-нибудь таблицу для хранения ранее посещенных вами сайтов (может быть, базу данных?).
Ответ 2 · рейтинг 8 · Attila O.
Почему бы не использовать что-то уже протестированное для сканирования, например Scrapy? Мне удалось достичь почти 100 страниц в секунду на низкоуровневом VPS с ограниченным объемом оперативной памяти (около 400 МБ), в то время как скорость сети была около 6-7 МБ/с (т.е. ниже 100 МБ/с).
Еще одно улучшение, которое вы можете сделать, - это использовать urllib3 (особенно при сканировании большого количества страниц из одного домена). Вот краткое сравнение, которое я сделал некоторое время назад:
ОБНОВИТЬ
Scrapy теперь использует библиотеку Requests, которая, в свою очередь, использует urllib3. Это делает Scrapy незаменимым инструментом, когда дело доходит до скрейпинга. Последние версии также поддерживают развертывание проектов, поэтому парсинг с VPS стал проще, чем когда-либо.
Ответ 5 · рейтинг 1 · knitti
Невозможно сказать, каковы ваши ограничения. Ваша проблема похожа на проблему C10K - сначала прочитайте, не оптимизируйте сразу. Идите к легкодоступным фруктам: скорее всего, вы получите значительное улучшение производительности, проанализировав дизайн своего приложения. Не начинайте с массивной многопоточности или массивной многопроцессорности.
Я бы использовал Twisted для написания сетевой части, это может быть очень быстро. В общем, скорость ввода-вывода на машине должна быть выше средней. Либо вам нужно записывать данные на диск, либо на другую машину, не каждый ноутбук поддерживает постоянную запись в базу данных со скоростью 10 Мбайт/с. Наконец, если у вас асинхронное подключение к Интернету, возможно, ваш восходящий канал перегружен. Здесь помогает приоритет ACK (пример OpenBSD).