Сегодня Web Crawling-это известная технология, но есть еще много сложностей. Простые веб -сканеры по -прежнему трудно конкурировать с современными веб -сайтами, разработанными различными сложными технологиями, такими как обучение Ajax, Xmlhttprequest, веб -билеты, флэш -розетки и т. Д.
Давайте возьмем наши основные потребности в проекте Hubdoc в качестве примера, в котором мы ползаем по сумме счета, дате истечения срока действия, номером счета и, что наиболее важно: PDF -файлы недавних счетов с веб -сайтов банков, коммунальных услуг и компаний по кредитным картам. Для этого проекта я начал с очень простого решения (не используя дорогой коммерческий продукт, который мы оцениваем на данный момент) - простой проект Crawler, который я использовал с Perl в Messagelab/Symantec. Но результаты не прошли хорошо, и спамеры сделали гораздо более простой веб -сайт, чем у банков и коммунальных услуг.
Так как решить эту проблему? В основном мы начинаем с отличной библиотеки запросов, разработанной с использованием Mikea. Сделайте запрос в браузере и проверьте, какие заголовки запросов были отправлены в окне сети, а затем скопируйте эти заголовки запросов в код. Этот процесс очень прост. Это просто для отслеживания всех запросов от входа в систему до загрузки файла PDF, а затем моделировать все запросы из этого процесса. Чтобы облегчить обработку подобных вещей и сделать веб -разработчики более рациональными в написании программ хрупки, я экспортировал результаты от HTML до jQuery (используя легкую библиотеку читов), что сделало аналогичную работу простыми и упростила использование селектора CSS для выбора элементов на странице. Весь процесс охвачен в рамках, которая также может выполнять дополнительную работу, такую как получение сертификатов из базы данных, загрузка отдельных роботов и общение с пользовательским интерфейсом через socket.io.
Это работает для некоторых веб -сайтов, но это просто сценарий JS, а не мой код node.js, который размещается на их сайте этими компаниями. Они могут сложить оставшиеся проблемы, чтобы решить сложность, что затрудняет вы выяснить, что делать, чтобы получить информацию о входе в систему. Для некоторых сайтов я пытался получить его, объединив его с библиотекой запроса () в течение нескольких дней, но это все еще было напрасно.
После почти сбоя я обнаружил Node-Phantomjs, библиотеку, которая позволяет мне управлять безголовым браузером Webkit без головы. Это похоже на простое решение, но есть некоторые проблемы, которых Phantomjs не может избежать:
1. Phantomjs может только сказать вам, была ли страница загружена, но вы не можете определить, реализуется ли перенаправление (перенаправление) через JavaScript или метатеги в этом процессе. Особенно, когда JavaScript использует SetTimeout () для задержки вызовов.
2. Phantomjs предоставляет вам крюк с PageLoadStarted, который позволяет вам решать вышеупомянутые проблемы, но эта функция может уменьшить это число только при определении количества страниц для загрузки, уменьшить это число при загрузке каждой страницы, и обеспечить обработку для возможных тайм -аутов (потому что это не всегда происходит), чтобы при уменьшении вашего числа до 0, ваша функция обратного вызовов может быть вызвана. Этот метод может работать, но он всегда заставляет людей чувствовать себя немного как хакер.
3.Fantomjs требует полного и независимого процесса для каждой страницы, чтобы ползание, потому что, если это не так, невозможно разделить файлы cookie между каждой страницей. Если вы используете тот же процесс Phantomjs, сеанс на странице, который был вошел в систему, будет отправлен на другую страницу.
4. Невозможно использовать Phantomjs для загрузки ресурсов - вы можете сохранить страницу только как PNG или PDF. Это полезно, но это означает, что нам нужно прибегнуть к запросу () для загрузки PDF.
5. Из -за вышеуказанных причин я должен найти способ распределить файлы cookie от сеанса Phantomjs в библиотеку сеанса запроса (). Просто распространите Document.cookie String, проанализируйте его и введите его в банку cookie of Questing ().
6. Введение переменных в сеанс браузера нелегко. Для этого мне нужно создать строку для создания функции JavaScript.
Кода -копия выглядит следующим образом:
Robot.prototype.add_page_data = function (page, name, data) {
page.evaluate (
"function () {var" + name + "= window." + name + "=" + json.stringify (data) + "}"
);
}
7. Некоторые веб -сайты всегда заполнены кодом, таким как Console.log (), и их необходимо переопределить и выводить в нужное место, которое мы хотим. Чтобы сделать это, я сделал это:
Кода -копия выглядит следующим образом:
if (! console.log) {
var iframe = document.createElement ("iframe");
document.body.appendchild (iframe);
Консоль = window.frames [0] .console;
}
8. Некоторые веб -сайты всегда заполнены кодом, таким как Console.log (), и их необходимо переопределить и выводить в нужное место, которое мы хотим. Чтобы сделать это, я сделал это:
Кода -копия выглядит следующим образом:
if (! console.log) {
var iframe = document.createElement ("iframe");
document.body.appendchild (iframe);
Консоль = window.frames [0] .console;
}
9. Нелегко сообщить браузеру, что я нажал на тег. Чтобы достичь этих вещей, я добавил следующий код:
Кода -копия выглядит следующим образом:
var clickElement = window.clickelement = function (id) {
var a = document.getElementbyId (id);
var e = document.createevent ("mouseevents");
E.InitMouseEvent («щелкнуть», true, true, window, 0, 0, 0, 0, false, false, false, false, 0, null);
A.DispatchEvent (E);
};
10. Мне также необходимо ограничить максимальную параллелизм сеанса браузера, чтобы убедиться, что мы не будем взорваться на сервер. Несмотря на это, это ограничение намного выше, чем могут предложить дорогие коммерческие решения. (Примечание переводчика: то есть параллелизм коммерческого решения больше, чем у этого решения)
После всей работы у меня есть относительно приличное решение для хлистого запроса Phantomjs +. Вы должны войти в систему с Phantomjs, прежде чем вы сможете вернуться к запросу запроса (). Он будет использовать файлы cookie, установленные в Phantomjs для проверки регистрации сеанса. Это огромная победа, потому что мы можем использовать поток запроса () для загрузки файла PDF.
Весь план состоит в том, чтобы сделать для веб -разработчиков относительно легко понять, как использовать селекторы JQUERY и CSS для создания сканеров для разных веб -сайтов. Я не успешно доказал, что эта идея возможна, но я считаю, что это произойдет в ближайшее время.