Вопрос

Подскажите, пожалуйста, как парсить страницы AJAX.

Это было полезно?

Решение

Обзор:

Любая очистка экрана сначала требует ручной проверки страницы, из которой вы хотите извлечь ресурсы.При работе с 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. ПаукОбезьяна для выполнения javascript на странице.

Расширенный парсинг с помощью Java:

Для сложного использования, а также если вы используете Java, вы также можете рассмотреть возможность использования механизма javascript Firefox для Java. Носорог

Расширенный парсинг с помощью .NET:

Для сложного использования, а также если вы используете .Net, вы также можете рассмотреть возможность использования сборки Microsoft.vsa.Недавно заменен на ICodeCompiler/CodeDOM.

Другие советы

На мой взгляд, самое простое решение - это использовать Casperjs , основу, основанную на браузерном браузере phantomjs без ключа WebKit.

Вся страница загружена, и очень легко очистить любые данные, связанные с ajax. Вы можете проверить этот базовый учебник, чтобы узнать, Автоматизация & amp; Соскоб с 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 - это использовать сам браузер или безголовый браузер (браузер без графического интерфейса). В настоящее время phantomjs - это хорошо продвигаемый безголовый браузер, использующий WebKit. Альтернативой, которую я использовал с успехом, является HtmlUnit (в Java или .NET через IKVM , который является имитированным браузером. Другой известной альтернативой является использование инструмента веб-автоматизации, такого как Селен .

Я написал много статей на эту тему, таких как веб-очистка Ajax и Javascript сайты и автоматическая проверка подлинности OAuth без браузера для Twitter , В конце первой статьи есть много дополнительных ресурсов, которые я собираю с 2011 года.

Зависит от страницы AJAX. Первая часть очистки экрана определяет, как работает страница. Есть ли какая-то переменная, через которую вы можете перебирать все данные со страницы? Лично я использовал Web Scraper Plus для множества задач, связанных с очисткой экрана, потому что это дешево, не сложно Для начала, непрограммисты могут заставить его работать относительно быстро.

Примечание: Условия использования, вероятно, есть где-то, что вы можете проверить, прежде чем делать это. В зависимости от сайта, перебирая все, могут появиться некоторые флаги.

Мне нравится PhearJS , но это может быть частично, потому что я его построил.

Тем не менее, это служба, которую вы запускаете в фоновом режиме, которая говорит по HTTP (S) и отображает страницы как JSON для вас, включая любые метаданные, которые вам могут понадобиться.

В качестве недорогого решения вы также можете попробовать SWExplorerAutomation (SWEA). Программа создает API автоматизации для любого веб-приложения, разработанного с использованием HTML, DHTML или AJAX.

Я думаю, что ответ Брайана Р. Бонди полезен, когда исходный код легко читается. Я предпочитаю простой способ использования таких инструментов, как Wireshark или HttpAnalyzer, для захвата пакета и получения URL-адреса от " Хоста " поле и "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

Selenium WebDriver - хорошее решение: вы программируете браузер и автоматизируете то, что необходимо сделать в браузере. Браузеры (Chrome, Firefox и т. Д.) Предоставляют свои собственные драйверы, которые работают с Selenium. Поскольку он работает как автоматический РЕАЛЬНЫЙ браузер , страницы (включая 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, чтобы скопировать информацию в таблицы или текст.
  • Пожалуйста, прокомментируйте, если вы не можете понять, и я могу написать это лучше. ( Первая попытка ). Кроме того, я пытаюсь выпустить пример кода как можно скорее.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top