Как вы чистите 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 (при условии, что вы знаете, как его создать, его архитектуру и возможности. Это легко освоить и попрактиковаться, так как имеется множество примеров),

  1. Используйте скрипты содержимого для доступа к DOM, используя xpath. В значительной степени получить весь список или таблицу или динамически отображаемый контент, используя xpath, в переменную как строковые узлы HTML. (Только контентные скрипты могут получить доступ к DOM, но они не могут связаться с URL-адресом, используя XMLHTTP)
  2. Из скрипта содержимого, используя передачу сообщений, отправьте весь разделенный DOM в виде строки в фоновый скрипт. (Фоновые скрипты могут общаться с URL-адресами, но не могут касаться DOM). Мы используем передачу сообщений, чтобы заставить их говорить.
  3. Вы можете использовать различные события для циклического перемещения по веб-страницам и передачи каждого содержимого HTML-узла в фоновый скрипт.
  4. Теперь используйте фоновый скрипт, чтобы общаться с внешним сервером (на локальном хосте), простым, созданным с использованием Nodejs/python. Просто отправьте все HTML-узлы в виде строки на сервер, где сервер просто сохранит размещенный на нем контент в файлы с соответствующими переменными для определения номеров страниц или URL-адресов.
  5. Теперь вы удалили содержимое AJAX (узлы HTML в виде строки), но это частичные узлы HTML. Теперь вы можете использовать вашу любимую библиотеку XPATH, чтобы загрузить их в память, и использовать XPATH, чтобы скопировать информацию в таблицы или текст.

Пожалуйста, прокомментируйте, если вы не можете понять, и я могу написать это лучше. (Первая попытка). Кроме того, я пытаюсь выпустить пример кода как можно скорее.

Другие вопросы по тегам