2009-12-05 2 views
6

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

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

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

+3

Лучше всего сделать процесс быстрее, чтобы улучшить скорость вашего соединения. Это будет вашим узким местом, а не скоростью Python. – tzot

ответ

9

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

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

Если вы используете только один сайт, подумайте об использовании wget -r (an example).

+0

Поддерживает ли wget только выборку html? Я не хочу быть более утечкой, чем должен. – MMag

+2

Да, флаг '-A' на wget позволяет вам указать принятые расширения, а' -R' укажет отклоненные расширения. Итак, вы можете сделать что-то вроде 'wget -R.gif, .jpg, .png -r example.com' –

+0

+1 для wget, зачем изобретать колесо? – extraneon

3

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

+0

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

5

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

+0

У меня только одна рабочая станция с небольшим массивом рейдов и компьютеры нескольких добровольцев. Я только планирую хранить некоторые страницы, у которых есть соответствующий поисковый запрос, который должен быть <1% – MMag

+0

. Чем меньше данных для хранения, тем лучше. Если вам нужно больше вычислительной мощности (параллелизм значительно ускорит то, что вы делаете), обязательно попробуйте PiCloud. – BrainCore

3

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

5

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

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

Исправлено некоторое форматирование вашего сообщения, надеюсь, что вы не возражаете :) Добро пожаловать в SO! – onnodb

+0

thx для редактирования :) – satoru

0

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

Смежные вопросы