Ответы пользователя по тегу Парсинг
  • Как ускорить Curl парсер?

    alekciy
    @alekciy
    Вёбных дел мастер
    Сам по себе curl работает очень быстро. Но есть время ответа сервера. И если он отвечает 8 секунд, то значит это минимальное время выполнения вашего кода. На уровне PHP кода вы ни как это не ускорите.

    Но нужно разбираться, действительно ли сервис отвечает 8 секунд и если да, то почему. На задачах парсинга часто сервис который приходится парсить отслеживает IP адреса и при большом количестве запросов начинает увеличиваться время отклика персонально для вас (благо в конфиге nginx это 1 строка). И в таких случае необходимо начать использовать анонимные прокси.
    Ответ написан
    Комментировать
  • Как получить/распарсить элемент для .click()?

    alekciy
    @alekciy
    Вёбных дел мастер
    Меню приведенное на скрине появилось и у меня. Открыл с FireFox. Вероятно завязано на какие-то куки.
    Для решения поставленной задачи нужно использовать wait.until из WebDriver на результат XPath выражения:
    //button[@alt="Найти"]
    Возможно перед этим потребуется закрыть попап со скрина.
    На C# не пишу, но подход для работы с WebDrive во всех языках примерно одинаков. Код будет примерно таким как тут описано: https://www.lambdatest.com/blog/explicit-fluent-wa...
    Ответ написан
  • PHP: Как с XPath получить родителя, нескольких детей из html и сохранить их порядок в DOM дереве?

    alekciy
    @alekciy
    Вёбных дел мастер
    Одним XPath запросом ни как. Придется написать пару запросов: 1) получаем //div[contains(@class,"versions")] коллекцию узлов div которые делаем узлом контекста для 2) запроса //a[contains(@class,"versions-item")].

    Код примерно такой будет:
    $elements = $xpath->query('//div[contains(@class,"versions")]');
    foreach ($elements as $contextNode) {
        $versionsItemNode = $xpath->query('//a[contains(@class,"versions-item")]', $contextNode);
    }
    Ответ написан
    Комментировать
  • Как организовать парсер страницы и внутри содержимого?

    alekciy
    @alekciy
    Вёбных дел мастер
    А что мешает сразу вытащить нужное содержимое? Например, с использованием XPath. Я для парсеров только его и использую: https://youtu.be/id_MNxmdRvk
    Ответ написан
  • Как настроить парсинг через ssh php?

    alekciy
    @alekciy
    Вёбных дел мастер
    В сторону покупки нормального прокси. Или использовать публичные свободные.

    P.S. 2ip.ru очень не любит, когда их парсят. Хотите что-то оттуда получить - используйте webdriver + proxy.
    Ответ написан
  • Как сайты понимают, что их посетил бот на Selenium, а не реальный юзер?

    alekciy
    @alekciy
    Вёбных дел мастер
    Вариантов много. Из простого:
    • по User-Agent
    • по IP адресу через отслеживание количества запросов с одного адреса
    • по используемым публичным прокси (многие такие сервисы явно сообщают, о себе кто они)
    • и т.д.

    Из сложного:
    • отслеживают перемещение мыши
    • ведут аналитику на о типичных поведениях пользователя и ищуют анамалии


    Если начинают банить прямо с самого первого запроса, значит спались на чем то элементарном и примитивном. Потому что при сложных вариантах защиты для сбора аналитики боту дают по сайту походить.
    Ответ написан
    Комментировать
  • Python. Как выводить данные, которые постоянно обновляются/дополняются?

    alekciy
    @alekciy
    Вёбных дел мастер
    Если конечный ресурс не предоставляет какого либо API реализующего нотификацию при обновлениях, то ни как. Только постоянное обновление.
    Вообще есть там данные подгружаются постоянно через AJAX, то можно открыть страницу и не закрывать. И просто к ней постоянно обращаться используя ID сессии.
    Есть еще вариант, когда можно в страницу внедрить свой JS код который будет отслеживать изменение DOM страницы и слать на заданный URL нотификацию. Но это достаточно сложный вариант.
    Ответ написан
  • Почему происходит потеря пакетов при парсинге по ссылкам?

    alekciy
    @alekciy
    Вёбных дел мастер
    Попробуйте через XPath.
    Материал по теме: https://youtu.be/id_MNxmdRvk
    Ответ написан
    Комментировать
  • Как настроить парсинг сайта с JavaScript на C#?

    alekciy
    @alekciy
    Вёбных дел мастер
    Потребуется Selenium. Из C# общается к head-less бразуеру (это может быть PhantomJS, запускать с опцией webdriver) следует по Webdrive протоколу. На вскидку: Автоматизированное тестирование веб-приложения (MS....
    Ответ написан
    Комментировать
  • Парсинг карточки товара и его итог в реальном времени?

    alekciy
    @alekciy
    Вёбных дел мастер
    выполнятся до получения результатов как 5 секунд, так и до 5 минут

    Я так понимаю, headless браузер запускается в одном экземпляре и все запросы идут в него? Тогда у вас просто внутри него возникают взаимные блокировки. Я когда сталкивался с подобной проблемой с ходу не смог это решить в рамках одного запущенного процесса поэтому поступил проще. В своем парсере делайте менеджер коннектов в задачи которого входит:
    1) запуск дополнительных копий браузера в случае надобности;
    2) гарантия, что в одну копию уходит только один запрос и пока ответ не получен, новое задание (в рамках одного домена) не может быть отправлено.

    Так же замечу, что PhantomJS ветки 2 работает медленее, чем 1.9. Там, где старая версия отрабатывала за полсекунды новая думает секунду-полторы.
    Ответ написан
    Комментировать
  • Как на Phantom.JS получить список открытых окон?

    alekciy
    @alekciy
    Вёбных дел мастер
    На сколько я помню ни как. Переключаться не трубуется, нужно просто помнить ID нужной сессии и не закрывать её. По webdriver можно получить список имеющихся сессий.
    Ответ написан
  • Как ускорить парсинг данных с Python/Selenium?

    alekciy
    @alekciy
    Вёбных дел мастер
    На 100к ссылок, особенно если требуется их обходить достаточно часто (или на сервере ресурсов мало), есть уже смысл задумать о более кастомных (читай, напилить руками низкоуровневый механизм), но более быстрых механизмах. Как-то запросы на получение AJAX данных через curl. Или если данные получаться в рамтайме на клиенте через замудренный JS, то применить SpiderMonkey, V8 либо другие серверных движки.

    В общем чтобы пропарсить наверное миллион таких строк у меня уйдет месяц непрерывной работы селениума

    Делал на кластере из PhantomJS парсер который должен был за 15 минут обходит чуть больше 1к страниц и парсить из них разные хитрые таблички. Требовалось что-то около десяти инстансов PhantomJS, 20 Гб ОЗУ и 16 ядер ЦПУ. На таком кластере 100к за сутки переварит реально.
    Когда требование по времени ужесточилось до 5 минут, напилил на SpiderMonkey.

    element is not found

    Нужно использовать wait(). Тогда дальше код будет выполняться когда на странице появиться нужный элемент.

    где нет кучи попапов, которые все надо прокликать

    Наличие/отсутствие попапов не играет роли. Все, что появляется в DOM, все можно отработать. Регулярно тягаю данные с яндекс ворстата. Много там разных хитрых обработчиков. Но все силами PhantomJS-а через webdriver решается рано или поздно.

    Это действительно так?

    Возможно. Но так ли это в вашем контексте ни кто кроме эксперимента не скажет. Т.е. берем данное утверждение и проверяем в своей задаче парсинга.
    Ответ написан
    3 комментария
  • Как парсить многоуровневые формы?

    alekciy
    @alekciy
    Вёбных дел мастер
    Значения для Select2 зависят от выбранного option в Select1? Значения Select3 зависят от выбранного option в Select2? Можно тупо методом банального перебора.
    Ответ написан
    Комментировать
  • Многопроцессорный парсер теряет ссылки при паринге (selenium+PhantomJS+ProcessPoolExecutor)?

    alekciy
    @alekciy
    Вёбных дел мастер
    Наверное уже не очень актуально, но оставлю ремарку для истории. Потеря страниц на парсенге - ситуация штатная. Обилие JS, падения кода при работе с DOM, сетевые проблемы, все может привести к генерации исключения и фейлу получения данных. Так что при разработке стоит сразу заклываться на штатность такой ситуации и просто отлавливать неразобранные страницы и отправлять на повторный парсинг.

    1000 страниц за 1 час более чем реальная задача. Сам получал скорость в 1000 за 15 минут. Достигается просто поднятием кластера. Требует много ресурсов (у меня выходило что-то около 10 узлов на каждый до 5Гб ОЗУ).
    Ответ написан
    Комментировать
  • Аналоги selenium для python?

    alekciy
    @alekciy
    Вёбных дел мастер
    Внесу небольшую ремарку все же. Нужно различать 1) скорость отработки одной страницы 2) скорость отработки Х страниц в секунду. Обычно под "более быстрый" понимают второе, т.к. на практике у нас много страниц и мы хотим от как можно быстрее пропарсить. Так, вот, если задача поднять именно п. 2, то делать это можно и на selenium, просто придется запустить целый кластер из нод. Что обычно выливается в большие требования по ресурсам. И если selenium все устраивает и есть такие ресурсы, то есть смысл оставаться в его рамках.
    Ответ написан
  • Кто-то парсил русский текст PhantomJS?

    alekciy
    @alekciy
    Вёбных дел мастер
    Использую PhantomJS как 1.8 версии так и 2 на машинах с debian7, ubuntu 12/14. Попадаются сайты как в utf-8 кодировке, так и в 1251. Ясное дело все текста - кириллица. Работаю через webdriver из php. Проблем нет.
    Ответ написан
    Комментировать
  • Имеет ли смысл делать многопоточный парсер?

    alekciy
    @alekciy
    Вёбных дел мастер
    1. Конечно может привести. Перед граббингом всегда можно прочесть robot.txt на предмет наличия директив Crawl-delay/Request-rate. Однако реальные цифры можно получить только в ходе работы (по возникновению HTTP статусов отличных от 200). По хорошему в ходе работы нужно копить статистику и динамически подстраивать скорость обхода.
    2. Нет, как и в обычной технике не пропорционально. Степень падения КПД зависит от конечно архитектуры приложения.
    3. Различного рода блокировки (I/O диска/сети, записи в базу, прочее), ограничения ОСи (количество открытых портов, лимиты на I/O диска), низкая скорость отдачи со сграбливаемого ресурса.
    Ответ написан
    Комментировать
  • Как сделать «фоновый» парсинг?

    alekciy
    @alekciy
    Вёбных дел мастер
    Что бы парсер сам запускался подходит cron. Но как я понимаю суть вопроса в другом: "как быстро парсить ХХ сайтов". Мультипоточно. mCurl в помощь.

    Для ориентирования по скорости приведу используемую мной схему. У меня почти 42 000 URL на проверке. Перед началом работ они складываются в Redis в виде стека (что бы потом параллельные потоки не скачали одну и туже страницу несколько раз). После чего по cron через bash запускается 10 php скриптов, каждый за раз качает 100 адресов, парсит данные со страницы через DOM, полученные данные пишет в базу. Т.е. кроме скачки страниц тут еще и медленные операции как то построение DOM и запись в РСУБД. На все уходит менее 20 минут, т.е. минимальная скорость около 30 страниц/сек.
    Ответ написан
    3 комментария
  • PHP Simple HTML DOM Parser. Почему не могу получить элемент?

    alekciy
    @alekciy
    Вёбных дел мастер
    Use XPath, Luke.
    <?php
    
    // [1- Скачиваем файл
    // Создаем поток
    $opts = array(
    	'http' => array(
    		'method'  => 'GET',
    		'timeout' => 10,
    	),
    );
    
    $context = stream_context_create($opts);
    
    // Открываем файл с помощью установленных выше HTTP-заголовков
    $page_content = file_get_contents('http://lubematch.shell.com/ru/ru/equipment/100_2_8i_avant_001755', false, $context);
    // -1]
    
    // [2- Парсим данные
    // [3- Строим DOM
    // по сути - отключаем вывод ошибок валидации
    libxml_use_internal_errors(true);
    $page_dom = new \DOMDocument();
    
    $page_dom->strictErrorChecking = false;
    $page_dom->preserveWhiteSpace  = false;
    $page_dom->validateOnParse     = true;
    
    $page_dom = new \DOMDocument();
    
    // [4- loadHTML не дает использовать utf-8, делаем хаком http://php.net/manual/en/domdocument.loadhtml.php#95251
    $page_dom->loadHTML('<?xml encoding="UTF-8">' . $page_content);
    
    foreach ($page_dom->childNodes as $node) {
    	if ($node->nodeType == XML_PI_NODE) {
    		$page_dom->removeChild($node);
    	}
    }
    $page_dom->encoding = 'UTF-8';
    // -4]
    
    $page_xpath = new \DOMXPath($page_dom);
    // -3]
    
    // Вытаскиваем Standard
    $param_1 = $page_xpath->query('//table[@id="recommendation"]//tr[2]/th')->item(0)->nodeValue;
    // Вытаскиваем Spirax S4 ATF HDX
    $param_2 = $page_xpath->query('//table[@id="recommendation"]//tr[5]/td[1]')->item(0)->nodeValue;
    // -2]
    
    var_dump($param_1, $param_2);
    Ответ написан