你如何刮掉AJAX页面?

xxx*_*xxx 52 ajax web-scraping

请告知如何刮掉AJAX页面.

Bri*_*ndy 54

概述:

所有屏幕抓取首先需要手动审查您要从中提取资源的页面.在处理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>
Run Code Online (Sandbox Code Playgroud)

然后,您需要做的只是对同一服务器的time.asp执行HTTP请求. 来自w3schools的例子.


使用C++进行高级抓取:

对于复杂的使用,如果您使用的是C++,您还可以考虑使用firefox javascript引擎SpiderMonkey在页面上执行javascript.

使用Java进行高级抓取:

对于复杂的使用,如果你使用的是Java,你也可以考虑使用firefox javascript引擎来实现Java Rhino

使用.NET进行高级抓取:

对于复杂的使用,如果您使用.Net,您还可以考虑使用Microsoft.vsa程序集.最近更换为ICodeCompiler/CodeDOM.


mat*_*ain 8

在我看来,最简单的解决方案是使用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();
});
Run Code Online (Sandbox Code Playgroud)


sbl*_*ndy 7

如果你能得到它,请尝试检查DOM树.Selenium将此作为测试页面的一部分.它还具有单击按钮和跟随链接的功能,这可能很有用.

  • 在selenium客户端脚本中,您可以使用`get_html_source()`函数,但它返回正常的源,而不是生成的(后AJAX)源.如果您知道如何访问生成的源,请告诉我们. (2认同)