Как вы чистите страницы AJAX? - PullRequest
51 голосов
/ 04 ноября 2008

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

Ответы [ 10 ]

53 голосов
/ 04 ноября 2008

Обзор:

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

8 голосов
/ 09 февраля 2014

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

Вся страница загружена, и очень легко очистить любые данные, связанные с 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();
});
7 голосов
/ 04 ноября 2008

Если вы можете это сделать, попробуйте проверить дерево DOM. Selenium делает это как часть тестирования страницы. Он также имеет функции для нажатия кнопок и перехода по ссылкам, что может быть полезно.

4 голосов
/ 09 мая 2013

Лучший способ очистить веб-страницы с помощью Ajax или страниц общего назначения с использованием Javascript - это использовать сам браузер или браузер без монитора (браузер без графического интерфейса пользователя). В настоящее время phantomjs является хорошо продвигаемым безголовым браузером, использующим WebKit. Альтернативой, которую я использовал с успехом, является HtmlUnit (в Java или .NET через IKVM , который является смоделированным браузером. Другой известной альтернативой является использование инструмента веб-автоматизации, такого как Selenium .

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

2 голосов
/ 16 октября 2015

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

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

2 голосов
/ 04 ноября 2008

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

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

1 голос
/ 07 декабря 2017

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

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

1 голос
/ 14 июля 2013

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

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

0 голосов
/ 26 июня 2011

Ранее я связывался с растворителем 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, чтобы скопировать информацию в таблицы или текст.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...