Подтвердить что ты не робот

Использование webkit для безгласного просмотра

Я использую инструменты на основе webkit для создания браузера без браузера для обхода веб-страниц (мне нужно это, потому что я хотел бы оценить javascript, найденный на страницах, и получить окончательную отображаемую страницу). Но две разные системы, которые я реализовал до сих пор, демонстрируют очень низкую производительность. Я реализовал две разные системы, каждая из которых использует webkit в качестве бэкэнд:

  • Использование Google Chrome: я бы запустил Google Chrome и общался с каждой вкладкой с помощью веб-сайтов, открытых Chrome для удаленной отладки (отладки через провод). Таким образом, я могу управлять каждой вкладкой, загружать новую страницу и после загрузки страницы. Я извлекаю DOM загруженной веб-страницы.
  • Используя phantomjs: phantomjs использует webkit для загрузки страниц и предоставляет возможность просмотра безглавых браузеров. Как объясняется в примерах phantomjs, я использую page.open, чтобы открыть новый URL-адрес, а затем получить dom, как только страница будет загружена путем оценки javascript на странице.

Моя цель - обходить страницы так быстро, как я могу, и если страница не загружается за первые 10 секунд, объявите ее недействительной и перейдите к ней. Я понимаю, что для загрузки каждой страницы требуется некоторое время, поэтому для увеличения количества загружаемых страниц в секунду я открываю много вкладок в Chrome или запускаю несколько параллельных процессов с использованием phantomjs. Ниже приведена производительность, которую я наблюдаю:

  • Если я открою более 20 вкладок в экземплярах Chrome/20 phantomjs, загрузка процессора начнется.
  • Из-за большого использования ЦП много страниц занимает больше 10 секунд для загрузки, и, следовательно, у меня более высокий уровень отказов (80% запросов на загрузку страницы не работают)
  • Если я намерен сохранить не менее 5% от общего количества запросов, я не могу загрузить более 1 URL в секунду.

После тестирования обеих систем на основе webkit, похоже, что узким местом производительности является механизм рендеринга webkit и, следовательно, хотелось бы понять от других пользователей здесь количество URL-адресов в секунду, которое я могу ожидать для обхода. Моя конфигурация оборудования:

  • Процессор: Intel® Core ™ i7-2635QM (1 процессор, 4 ядра).
  • Видеокарта: AMD Radeon HD 6490M (256 МБ)
  • Память: 4 ГБ
  • Полоса пропускания сети достаточно хороша, чтобы загружать страницы больше, чем производительность, которую я наблюдаю.

Вопрос, который я пытаюсь задать в этом списке рассылки, заключается в том, что у кого-то есть опыт использования webkit для обхода веб-страниц для случайного набора URL-адресов (например, выбор 10k URL-адресов из потока twitter), сколько URL-адресов я могу разумно ожидать сканирование в секунду?

Спасибо

4b9b3361

Ответ 1

Этот вопрос на самом деле больше связан с аппаратным обеспечением, чем с программным обеспечением, но в любом случае позвольте мне указать вам на несколько лучших направлений.

Во-первых, поймите, что каждая страница сама порождает несколько потоков. Он загрузит страницу, а затем начнет создавать новые потоки загрузки для элементов на странице, таких как файлы javascript, css файлы и изображения. [Ссылка: http://blog.marcchung.com/2008/09/05/chromes-process-model-explained.html]

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

Поток в Оптимальное количество потоков на ядро ​​ дает дополнительную информацию о ситуации, с которой вы столкнулись. Ваша перегрузка вашего процессора.

Ваш процессор имеет 4 физических 8 логических ядра. Я бы рекомендовал создавать не более 4 подключений за один раз, оставив вторичные логические ядра обрабатывать некоторые из потоков. Вы можете обнаружить, что вам даже нужно уменьшить это число, но 4 является хорошей отправной точкой. Посредством рендеринга страниц 4 за раз, вместо перегрузки всей вашей системы, пытающейся отобразить 20, вы фактически увеличите свою общую скорость, так как в итоге вы получите гораздо меньше кэширования. Начните с синхронизации своего времени с несколькими легко синхронизированными местоположениями. Затем попробуйте все меньше и больше. Будет сладкое пятно. Обратите внимание, что версия без браузера PhantomJS, скорее всего, будет лучше для вас, так как в режиме безголовы она, вероятно, не будет загружать изображения (плюс).

Ваша лучшая общая опция здесь состоит в том, чтобы сделать частичную страницу, сделав сами, используя источник веб-кавычки в http://www.webkit.org/. Поскольку все, что вам кажется, нужно сделать, это html и javascript. Это уменьшает количество соединений и позволяет управлять потоками с гораздо большей эффективностью. В таком случае вы могли бы создать очередь событий, введя туда весь свой первичный url. Создайте 4 рабочих потока, которые все работают с рабочей очереди, когда они обрабатывают страницу и им необходимо загрузить дополнительный источник, они могут добавить эти дополнительные загрузки в очередь. Когда все файлы для страницы загружаются в память (или диск, если вы беспокоитесь о нем) для определенного URL-адреса, вы можете добавить элемент в очередь событий, чтобы отобразить страницу, а затем проанализировать ее для всего, что вам нужно.

Ответ 2

Зависит от того, какие данные вы пытаетесь проанализировать, если вы только заботитесь о том, что javascript и html, то гипертекстовый запрос langage будет предлагать огромное ускорение, http://htql.net/, или вы можете посмотреть на создание чего-то в облаке, например http://watirmelon.com/2011/08/29/running-your-watir-webdriver-tests-in-the-cloud-for-free/