2008-11-04 10 views

ответ

49

Обзор:

Весь экран выскабливание первого требует ручного обзора страницы, которую вы хотите извлечь ресурсы из. Когда вы работаете с 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 того же сервера. Example from w3schools.


Расширенный соскоб с C++:

Для комплексного использования, и если вы используете C++ вы можете также рассмотреть вопрос об использовании Firefox JavaScript двигателя SpiderMonkey для выполнения JavaScript на странице.

Расширенный соскоб с Java:

Для комплексного использования, и если вы используете Java вы могли бы также рассмотреть вопрос об использовании Firefox JavaScript двигателя для Java Rhino

Advanced соскоб с .NET:

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

+0

+100 !!!! работал как шарм. – Atul 2013-04-12 09:46:29

+0

Вау, это была удивительно полезная информация, даже с инструментами, такими как phantomjs, которые теперь доступны, зная, как настраивать страницу на странице, используя указанный метод, гораздо удобнее, когда вы изучили, что происходит за поддержкой сцены. Брайан +1 – brendosthoughts 2013-06-20 08:55:01

2

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

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

7

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

+2

В скрипте клиента selenium вы можете использовать функцию `get_html_source()`, но он возвращает обычный источник, а не сгенерированный (пост-AJAX) источник. Если вы знаете, как получить доступ к сгенерированному источнику, сообщите нам. – Jabba 2011-04-13 02:31:49

1

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

0

Я ранее связывался с растворителем MIT и EnvJS в качестве своих ответов на очистку страниц Ajax. Эти проекты кажутся недоступными.

Из-за явной необходимости я изобрел еще один способ на самом деле очистить страницы Ajax, и он работал на таких жестких сайтах, как findthecompany, которые имеют методы поиска безглавых javascript-движков и не показывают никаких данных.

Техника заключается в использовании хромовых расширений для очистки. Расширения Chrome - лучшее место для очистки страниц Ajax, потому что они фактически позволяют нам получить доступ к модифицированному Javascript DOM. Техника следующая: я обязательно открою исходный код в какой-то момент. Создать расширение хром (предполагая, что вы знаете, как создать, и его архитектура и возможности. Это легко учиться и на практике, поскольку есть много образцов),

  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 для очистки информации до таблиц или текста.

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

3

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

Я написал много статей на эту тему, как и web scraping Ajax and Javascript sitesautomated browserless OAuth authentication for Twitter. В конце первой статьи есть много дополнительных ресурсов, которые я компилирую с 2011 года.

1

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

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

Вся страница загружена, и очень легко очистить любые связанные с ajax данные. Вы можете проверить это базовый учебник, чтобы узнать Automating & Scraping with PhantomJS and 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(); 
}); 
1

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

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

1

Веб-драйвер Selenium - хорошее решение: вы программируете браузер и автоматизируете то, что нужно сделать в браузере. Браузеры (Chrome, Firefox и т. Д.) Предоставляют свои собственные драйверы, которые работают с Selenium. Поскольку он работает как автоматический REAL браузер, страницы (включая javascript и Ajax) загружаются так же, как и с человеком, использующим этот браузер.

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