Написание более быстрого паука Python - PullRequest
6 голосов
/ 06 декабря 2009

Я пишу паука на Python, чтобы сканировать сайт. Проблема в том, что мне нужно изучить около 2,5 миллионов страниц, поэтому я действительно могу использовать некоторую помощь, чтобы оптимизировать ее для скорости.

Что мне нужно сделать, так это изучить страницы на предмет определенного числа и, если он найден, записать ссылку на страницу. Паук очень прост, ему просто нужно перебрать много страниц.

Я совершенно новичок в Python, но раньше использовал Java и C ++. Я еще не начал его кодировать, поэтому любые рекомендации по библиотекам или фреймворкам были бы полезны. Любые советы по оптимизации также приветствуются.

Ответы [ 6 ]

9 голосов
/ 06 декабря 2009

Вы можете использовать MapReduce , как это делает Google, либо через Hadoop (особенно с Python: 1 и 2 ), Дискотека или Happy .

Традиционная мысль - написать свою программу на стандартном Python, если вы обнаружите, что она слишком медленная, профилировать ее и оптимизировать конкретные медленные точки. Вы можете сделать эти медленные пятна быстрее, опустившись до C, используя C / C ++ расширения или даже ctypes .

Если вы просматриваете только один сайт, рассмотрите возможность использования wget -r ( пример ).

5 голосов
/ 06 декабря 2009

Поскольку вы новичок в Python, я думаю, что вам может пригодиться следующее:)

  • если вы пишете регулярное выражение для поиска определенного шаблона на странице, скомпилируйте свое регулярное выражение везде, где это возможно, и повторно используйте скомпилированный объект
  • BeautifulSoup - это анализатор html / xml, который может быть полезен для вашего проекта.
5 голосов
/ 06 декабря 2009

Где вы храните результаты?Вы можете использовать облачную библиотеку PiCloud , чтобы легко распараллелить очистку на кластере серверов.

3 голосов
/ 06 декабря 2009

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

3 голосов
/ 06 декабря 2009

Spidering чей-то сайт с миллионами запросов не очень вежлив. Можете ли вы спросить у веб-мастера архив сайта? Как только вы это сделаете, это будет простой поиск текста.

0 голосов
/ 06 декабря 2009

Что сказал Адам. Я сделал это один раз, чтобы наметить сеть Xanga. Я сделал это быстрее, создав потокобезопасный набор, содержащий все имена пользователей, которые мне пришлось искать. Тогда у меня было 5 или около того потоков, делающих запросы одновременно и обрабатывающих их. Вы будете тратить гораздо больше времени на ожидание страницы для DL, чем обрабатывать любой текст (скорее всего), поэтому просто найдите способы увеличить количество запросов, которые вы можете получить одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...