Действие парсера «HTML: Многопоточная загрузка»

Параметры действия:

Предназначение действия:

Загружает массив URL в несколько потоков. На выходе, - массив HTML кодов страниц.

Возвращаемое значение: массив загруженных страниц (HTML код)

 


Параметр «Количество потоков»

Тип параметра: произвольное числовое значение от 2 до 200

Значение по умолчанию: 20

Чем больше потоков — тем больше нагрузка на сайт, и не каждый сайт готов справиться с такой нагрузкой.
екоторые очень быстрые и стабильные сайты справляются отдавать данные и в 200 и даже в 500 потоков (одновременно по 200 и более запросов обрабатывать), но часто сайты начинают давать сбои уже при 40-50 потоках.
Всё зависит только от конкретного сайта: пробуйте увеличивать количество потоков, поставив второй параметр Перезагрузка страниц при ошибках = 0 - NoReload, и смотрите, будут ли ошибки (может появиться всплывающее уведомление: см. скриншот в конце статьи). Если ошибок нет, или их мало, то можно увеличить количество потоков. Когда определитесь с количеством потоков, при котором ошибок почти нет, выставьте второй параметр Перезагрузка страниц при ошибках = 3 - ReloadOnErrorAndTimeout для исправления ошибок загрузки.

Параметр «Перезагрузка страниц при ошибках»

Тип параметра: выбор из списка предопределенных значений

Допустимые значения параметра: 0 - NoReload; 1 - ReloadOnError; 2 - ReloadOnTimeout; 3 - ReloadOnErrorAndTimeout

Значение по умолчанию: 0 - NoReload

Значение этого параметра определяет, что будет делать программа, если какая-то из страниц не загрузится — если сервер выдаст ошибку, или не выдаст ответ в течение заданного времени (таймаут):

  • 0 - NoReload: оставляет всё как есть (ошибка не исправляется)
  • 1 - ReloadOnError: перезагружает страницу заново, если сервер вернул ошибку (с кодом 4xx или 5xx)
  • 2 - ReloadOnTimeout: перезагружает страницу заново, если сервер не ответил за заданное время
  • 3 - ReloadOnErrorAndTimeout: перезагружает страницу заново при любой ошибке или таймауте

Параметр «HTML фильтры»

Тип параметра: произвольное текстовое значение

Позволяет задать фильтр для результата, чтобы на выходе по каждой ссылке была не вся страница, а только часть её HTML кода.
Поскольку действие может загружать тысячи HTML страниц, а объём каждой страницы может быть велик (сотни кБ или несколько Мб), в памяти компьтера может скопиться огромный объем данных, что приведёт к торможению парсера и/или вылету Excel.
Если нам с веб-страницы нужен только небольшой кусок текста (например, DIV класса offer), а всё остальное содержимое страницы нас не интересует, то в этом параметре можно указать HTML фильтр div class=offer

 

Действие "HTML: Многопоточная загрузка" (далее Действие) предназначено для загрузки массива ссылок в несколько потоков с целью уменьшения времени загрузки.

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

Многопоточная загрузка работает не для всех сайтов. Если на сайте есть ограничение доступа при множественных запросах, то вы не получите нужный массив страниц. Скорее всего, вы получите несколько загруженных страниц, а остальные будут либо пустыми, либо с сообщениями об ограничении доступа. Более того, некоторые сайты могут заблокировать вам доступ на какое-то время. Используйте данное действие на свой страх и риск!

На входе Действие может принимать как массив ссылок, так и отдельную ссылку, но в последнем случае существенных отличий от применения действия "Загрузить страницу по ссылке" мы не получим.

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

Пример использования:

Действие Параметр Значение Результат
Загрузить ИСХОДНЫЙ КОД веб-страницы URL https://excelvba.ru/programmes/addins Исходный код веб-страницы (длиной 26792 символа)

Кодировка веб-страницы  
Загружать все страницы результатов  
Кеширование  
HTML: Поиск тегов Тип элемента div Часть HTML-кода веб-страницы (длиной 11202 символа)

Название проверяемого атрибута class
Значение проверяемого атрибута item-list
Тип результата / извлекаемый атрибут innerHTML
HTML: Поиск тегов Тип элемента a Массив из 9 значений:

https://excelvba.ru/programmes/FillDocuments
https://excelvba.ru/programmes/Parser
https://excelvba.ru/programmes/PastePictures
https://excelvba.ru/programmes/Unification
https://excelvba.ru/programmes/Labels
https://excelvba.ru/programmes/Lookup
... (ещё 3 значения)
Название проверяемого атрибута  
Значение проверяемого атрибута  
Тип результата / извлекаемый атрибут href_with_prefix
HTML: Многопоточная загрузка Количество потоков 20 Массив из 9 значений:

Кодировка веб-страниц  
HTML фильтры  

Если вместо многопоточной загрузки в данном примере подставить "Загрузить страницу по ссылке", то результат будет тот же самый - массив из 39 страниц. Но время загрузки данного примера для многопоточного варианта: 10 секунд, а время для однопоточной загрузки - 37 секунд. Скорость работы увеличивается почти в 4 раза.

Действие имеет 3 параметра:

  1. Количество потоков (по умолчанию - 20). Параметр подбирается опытным путем. Не рекомендуется ставить больше 150 потоков. Большее значение может дать как более быструю загрузку, так и большее количество ошибок. Кроме того, большое количество потоков может создать излишнюю нагрузку на ресурсы компьютера, что приведет к замедлению работы.
  2. Кодировка веб-страницы. Кодировка подбирается автоматически, но есть возможность задать её принудительно.
  3. HTML фильтры. Позволяет сразу брать нужный тег из загружаемой страницы, что приводит к уменьшению обрабатываемых и хранимых данных, как следствие, к возможному ускорению работы и снижению расходуемых ресурсов (но надо учитывать, что на поиск тега тоже уходит время, поэтому уменьшение общего времени или его увеличение будет зависеть от конкретного сайта).
    Синтаксис: с указанием тега, атрибута и его значения, например: div class=main или с указанием только атрибута и его значения, например: id=main.

Во время работы Действия появляется дополнительный прогресс бар, который отображает информацию о многопоточной загрузке - какое количество ссылок загружается, во сколько потоков, какой прогресс действия (может отображаться с задержкой или же вообще прогресс не будет отображаться из-за большой загрузки компьютера).

Индикатор загрузки может быть трех цветов: 

  • Зеленый - многопоточная загрузка идет в штатном режиме (что тем не менее не гарантирует полноты загруженных данных)

     
  • Красный - возникли ошибки при загрузке (можно попробовать уменьшить количество потоков)

     
  • Фиолетовый - часть страниц не загрузилась из-за остановки по тайм-ауту (в этом случае можно попробовать увеличить тайм-аут загрузки в настройках парсера)

     

Если необходимо получить URL загружаемой страницы, то при применении Действия специально для этого в HTML-код страницы добавляется тег <info>. Находится он или перед тегом </head>, или в случае, если применяется HTML фильтр, перед найденным тегом, т.е. в самом начале полученного кода.

<info id='parser multithreading' status='200' encoding='utf-8' href='https://www.olx.ua/obyavlenie/prodam-slavutu-IDvqoOC.html'></info>

При выводе на лист его можно найти при помощи действия HTML: Поиск тегов

Status в данном случае обозначает код состояния HTTP:

  • Код ответа 200: страница успешно загружена
  • Код ответа 404: страница не найдена (неверная ссылка)
  • Код ответа 403: нет доступа (возможно сайт заблокировал из-за частых запросов)
  • Код ответа 408: таумаут (сайт не ответил на заданное время)
  • Код ответа 400: ошибка загрузки страницы (сайт не ответил на запрос)

В случае появления ошибок при многопоточной загрузке, парсер выведет всплывающее уведомление об ошибке с информацией и советами:

Комментарии

Многопоточная загрузка в парсере не поддерживает работу с прокси.

А почему при использовании "Многопоточной загрузки" загрузка страниц происходит не через прокси?
Как можно сделать загрузку многопоточной с прокси?