Как вы чистите AJAX-страницы?
Посоветуйте, пожалуйста, как скрести страницы AJAX.
10 ответов
Обзор:
Сначала для очистки всего экрана необходимо вручную просмотреть страницу, с которой вы хотите извлечь ресурсы. При работе с AJAX вам обычно нужно анализировать немного больше, чем просто HTML.
При работе с AJAX это просто означает, что нужное значение не находится в исходном HTML-документе, который вы запросили, но будет задействован javascript, который запрашивает у сервера дополнительную информацию, которую вы хотите.
Поэтому вы можете просто проанализировать javascript и посмотреть, какой запрос делает javascript, и просто вызвать этот URL вместо самого начала.
Пример:
Возьмем это в качестве примера, предположим, что на странице, которую вы хотите очистить, есть следующий скрипт:
<script type="text/javascript">
function ajaxFunction()
{
var xmlHttp;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("Your browser does not support AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4)
{
document.myForm.time.value=xmlHttp.responseText;
}
}
xmlHttp.open("GET","time.asp",true);
xmlHttp.send(null);
}
</script>
Тогда все, что вам нужно сделать, это вместо этого сделать HTTP-запрос к time.asp того же сервера. Пример из w3schools.
Продвинутая очистка с C++:
Для комплексного использования, и если вы используете C++, вы также можете рассмотреть возможность использования движка JavaScript Firefox SpiderMonkey для выполнения JavaScript на странице.
Продвинутый соскоб с Java:
Для комплексного использования, и если вы используете Java, вы также можете рассмотреть возможность использования движка javascript firefox для Java Rhino
Продвинутая очистка с помощью.NET:
Для комплексного использования, и если вы используете.Net, вы также можете рассмотреть возможность использования сборки Microsoft.vsa. Недавно заменен на ICodeCompiler/CodeDOM.
На мой взгляд, самое простое решение - использовать Casperjs, фреймворк, основанный на фантомных браузерах WebKit без головы.
Вся страница загружена, и очень легко очистить любые данные, связанные с ajax. Вы можете проверить этот базовый учебник, чтобы изучить автоматизацию и чистку с помощью PhantomJS и CasperJS.
Вы также можете взглянуть на этот пример кода, о том, как очистить Google предлагает ключевые слова:
/*global casper:true*/
var casper = require('casper').create();
var suggestions = [];
var word = casper.cli.get(0);
if (!word) {
casper.echo('please provide a word').exit(1);
}
casper.start('http://www.google.com/', function() {
this.sendKeys('input[name=q]', word);
});
casper.waitFor(function() {
return this.fetchText('.gsq_a table span').indexOf(word) === 0
}, function() {
suggestions = this.evaluate(function() {
var nodes = document.querySelectorAll('.gsq_a table span');
return [].map.call(nodes, function(node){
return node.textContent;
});
});
});
casper.run(function() {
this.echo(suggestions.join('\n')).exit();
});
Если вы можете сделать это, попробуйте изучить дерево DOM. Selenium делает это как часть тестирования страницы. Он также имеет функции для нажатия кнопок и перехода по ссылкам, что может быть полезно.
Лучший способ очистить веб-страницы с помощью Ajax или общих страниц с использованием Javascript - это использовать сам браузер или браузер без монитора (браузер без графического интерфейса пользователя). В настоящее время http://phantomjs.org/ - это хорошо продвигаемый безголовый браузер, использующий WebKit. Альтернативой, которую я использовал с успехом, является HtmlUnit (в Java или.NET через IKVM, который представляет собой имитированный браузер. Другой известной альтернативой является использование инструмента веб-автоматизации, такого как Selenium.
Я написал много статей на эту тему, таких как очистка веб-сайтов Ajax и Javascript и автоматическая проверка подлинности OAuth без браузера для Twitter. В конце первой статьи есть много дополнительных ресурсов, которые я собираю с 2011 года.
Мне нравится PhearJS, но это может быть отчасти потому, что я его построил.
Тем не менее, это служба, которую вы запускаете в фоновом режиме, которая говорит по HTTP(S) и отображает страницы как JSON для вас, включая любые метаданные, которые вам могут понадобиться.
Зависит от страницы AJAX. Первая часть очистки экрана определяет, как работает страница. Есть ли какая-то переменная, через которую вы можете перебирать все данные со страницы? Лично я использовал Web Scraper Plus для многих задач, связанных с очисткой экрана, потому что это дешево, не сложно начать, непрограммисты могут заставить его работать относительно быстро.
Дополнительное примечание: Условия использования, вероятно, где-то, что вы могли бы проверить, прежде чем сделать это. В зависимости от того, что сайт перебирает все, могут появиться некоторые флаги.
Я думаю, что ответ Брайана Р. Бонди полезен, когда исходный код легко читается. Я предпочитаю простой способ использования таких инструментов, как Wireshark или HttpAnalyzer, для захвата пакета и получения URL-адреса из поля "Host" и поля "GET".
Например, я перехватываю пакет, подобный следующему:
GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330
HTTP/1.1
Accept: */*
Referer: http://quote.hexun.com/stock/default.aspx
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: quote.tool.hexun.com
Connection: Keep-Alive
Тогда URL-адрес:
http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330
В качестве недорогого решения вы также можете попробовать SWExplorerAutomation (SWEA). Программа создает API автоматизации для любого веб-приложения, разработанного с использованием HTML, DHTML или AJAX.
Selenium WebDriver - хорошее решение: вы программируете браузер и автоматизируете то, что необходимо сделать в браузере. Браузеры (Chrome, Firefox и т. Д.) Предоставляют свои собственные драйверы, которые работают с Selenium. Поскольку он работает как автоматический браузер REAL, страницы (включая javascript и Ajax) загружаются так же, как и люди, использующие этот браузер.
Недостатком является то, что он медленный (так как вы, скорее всего, хотели бы дождаться загрузки всех изображений и сценариев, прежде чем приступить к работе на этой отдельной странице).
Ранее я ссылался на растворитель MIT и EnvJS как на мои ответы, чтобы соскрести страницы Ajax. Эти проекты, кажется, больше не доступны.
Из-за чистой необходимости я изобрел другой способ на самом деле соскоблить страницы Ajax, и он сработал для сложных сайтов, таких как findthecompany, у которых есть методы, чтобы найти движки JavaScript без головы и не показывать данные.
Техника состоит в том, чтобы использовать хромированные расширения для скребков. Расширения Chrome - лучшее место для очистки страниц Ajax, потому что они фактически позволяют нам получить доступ к DOM, модифицированному JavaScript. Техника заключается в следующем, я, конечно, когда-нибудь открою исходный код. Создать расширение Chrome (при условии, что вы знаете, как его создать, его архитектуру и возможности. Это легко освоить и попрактиковаться, так как имеется множество примеров),
- Используйте скрипты содержимого для доступа к DOM, используя xpath. В значительной степени получить весь список или таблицу или динамически отображаемый контент, используя xpath, в переменную как строковые узлы HTML. (Только контентные скрипты могут получить доступ к DOM, но они не могут связаться с URL-адресом, используя XMLHTTP)
- Из скрипта содержимого, используя передачу сообщений, отправьте весь разделенный DOM в виде строки в фоновый скрипт. (Фоновые скрипты могут общаться с URL-адресами, но не могут касаться DOM). Мы используем передачу сообщений, чтобы заставить их говорить.
- Вы можете использовать различные события для циклического перемещения по веб-страницам и передачи каждого содержимого HTML-узла в фоновый скрипт.
- Теперь используйте фоновый скрипт, чтобы общаться с внешним сервером (на локальном хосте), простым, созданным с использованием Nodejs/python. Просто отправьте все HTML-узлы в виде строки на сервер, где сервер просто сохранит размещенный на нем контент в файлы с соответствующими переменными для определения номеров страниц или URL-адресов.
- Теперь вы удалили содержимое AJAX (узлы HTML в виде строки), но это частичные узлы HTML. Теперь вы можете использовать вашу любимую библиотеку XPATH, чтобы загрузить их в память, и использовать XPATH, чтобы скопировать информацию в таблицы или текст.
Пожалуйста, прокомментируйте, если вы не можете понять, и я могу написать это лучше. (Первая попытка). Кроме того, я пытаюсь выпустить пример кода как можно скорее.