Как увеличить скорость загрузки в scrapy?

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

К сожалению, когда я профилировал скорость скрапинга, я получаю только пару страниц в секунду. Действительно, около 2 страниц в секунду в среднем. Ранее я писал свои собственные многопоточные пауки, которые выполняли сотни страниц в секунду — я был уверен, что использование scrapy для скрученных и т. д. будет способно на подобную магию.

Как ускорить скрапинг? Мне очень нравится фреймворк, но эта проблема с производительностью может стать для меня препятствием.

Вот соответствующая часть файла settings.py. Есть ли какая-то важная настройка, которую я пропустил?

LOG_ENABLED = False
CONCURRENT_REQUESTS = 100
CONCURRENT_REQUESTS_PER_IP = 8

Несколько параметров:

  • Использование скрап версии 0.14
  • Проект развернут на большом инстансе EC2, поэтому должно быть достаточно памяти, ЦП и пропускной способности для работы.
  • Я планирую обходы с использованием протокола JSON, поддерживая поисковый робот несколькими десятками одновременных обходов в любой момент времени.
  • Как я сказал в начале, я загружаю страницы со многих сайтов, поэтому производительность удаленного сервера и CONCURRENT_REQUESTS_PER_IP не должны вызывать беспокойства.
  • На данный момент я очень мало занимаюсь постобработкой. Нет xpath; нет регулярного выражения; Я просто сохраняю URL-адрес и несколько основных статистических данных для каждой страницы. (Это изменится позже, когда я разберусь с основными проблемами производительности.)

person Abe    schedule 14.09.2012    source источник
comment
Scrapy работает намного быстрее. Это связано с процессором или кажется, что оно простаивает? это медленно с самого начала или производительность ухудшается?   -  person Shane Evans    schedule 14.09.2012
comment
Это медленно с самого начала. AWS показывает, что машина работает на 100% CPU, но я думаю, что скрученный реактор всегда так делает. Машина по-прежнему быстро реагирует на команды SSH, новые HTTP-запросы и т. д.   -  person Abe    schedule 14.09.2012
comment
Работая над этим в течение последнего часа, я подозреваю, что проблема в файлах конфигурации службы для scrapyd. Я задал отдельный вопрос о перезапуске демона scrapy: stackoverflow.com/questions/12428143/   -  person Abe    schedule 14.09.2012
comment
Хм, может быть, html слишком сложен для разбора скрап-экстрактором. Попробуйте вместо этого использовать lxml.   -  person Kien Truong    schedule 14.09.2012
comment
@Dikei Я почти уверен, что в scrapy уже используется lxml. В любом случае, как я уже сказал в последнем пункте вопроса, я на самом деле не анализирую HTML.   -  person Abe    schedule 14.09.2012
comment
scrapy использует lxml (или libxml2 в зависимости от версии), переписывание для использования lxml не поможет... но вы можете быть правы насчет сложного синтаксического анализа, xpath или чего-то еще. Профилирование действительно единственный способ сказать. Twisted не всегда потребляет 100% ресурсов процессора — если scrapy ползает медленно/вежливо, он обычно почти простаивает.   -  person Shane Evans    schedule 14.09.2012
comment
Хорошо, как вы профилируете в scrapy?   -  person Abe    schedule 14.09.2012
comment
Что ж, scrapy может использовать lxml, если он установлен, но у него есть собственный встроенный парсер только для python. Впрочем, это не имеет значения, поскольку вы им не пользуетесь. Но 100% ЦП, безусловно, очень странно, я никогда раньше не достигал 100% ЦП с помощью scrapy, обычно моя пропускная способность сначала достигает своего предела.   -  person Kien Truong    schedule 14.09.2012
comment
Хорошо, 100% процессор был отвлекающим маневром. Я вернулся и проверил с помощью mpstat. Он простаивает на 94%, даже когда я ставлю в очередь 50 пауков одновременно. Должно быть, это какая-то проблема с тем, как Amazon обрабатывает свою виртуализацию. В любом случае, главное, что проблема не в процессоре.   -  person Abe    schedule 14.09.2012
comment
У scrapyd есть ограничение на количество одновременно запускаемых пауков, поэтому, если вы хотите запускать больше, вам нужно изменить это ограничение. Если отдельные скрейпинговые обходы медленные и не привязаны к ЦП, то, скорее всего, это конфигурация. В частности, проверьте, не установлена ​​ли задержка загрузки (либо в вашем пауке, либо в настройках) и ваши настройки выше подобраны правильно.   -  person Shane Evans    schedule 14.09.2012
comment
я думаю, что сельдерей может помочь вам в этой ситуации, также посмотрите [это] [1] [1]: task" title="запуск пауков в задаче сельдерея"> stackoverflow.com/questions/11528739/   -  person akhter wahab    schedule 17.09.2012


Ответы (1)


У меня была эта проблема в прошлом ... И большую часть ее я решил с помощью «грязного» старого трюка.

Выполнить локальный кеш DNS.

В основном, когда у вас такая высокая загрузка ЦП при одновременном доступе к удаленным сайтам, это связано с тем, что scrapy пытается разрешить URL-адреса.

И, пожалуйста, не забудьте изменить настройки DNS на хосте (/etc/resolv.conf) на ЛОКАЛЬНЫЙ кеширующий DNS-сервер.

Первые будут медленными, но как только они начнут кэшироваться и разрешаться более эффективно, вы увидите ОГРОМНЫЕ улучшения.

Надеюсь, это поможет вам в вашей проблеме!

person Carlos Henrique Cano    schedule 25.10.2012
comment
Согласно документу scrapy, DNSCACHE_ENABLED по умолчанию равно True. . - person AliBZ; 09.01.2014