你如何刮掉AJAX页面?

时间:2008-11-04 01:25:26

标签: ajax web-scraping

请告知如何刮掉AJAX页面。

10 个答案:

答案 0 :(得分:53)

<强>概述:

所有屏幕抓取首先需要手动审核您要从中提取资源的页面。在处理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>

然后,您需要做的只是对同一服务器的time.asp执行HTTP请求。 Example from w3schools


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

对于复杂的使用,如果你正在使用C ++,你也可以考虑使用firefox javascript引擎SpiderMonkey来执行页面上的javascript。

使用Java进行高级抓取:

对于复杂的用法,如果你使用的是Java,你也可以考虑使用firefox javascript引擎进行Java Rhino

使用.NET进行高级抓取:

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

答案 1 :(得分:8)

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

答案 2 :(得分:7)

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

答案 3 :(得分:4)

使用Ajax或使用Javascript在一般页面中抓取网页的最佳方法是使用浏览器本身或无头浏览器(没有GUI的浏览器)。目前phantomjs是一个使用WebKit的畅销无头浏​​览器。我成功使用的另一种选择是HtmlUnit(在Java或.NET中通过IKVM,这是一个模拟浏览器。另一个已知的替代方法是使用像Selenium这样的Web自动化工具。

我写过很多关于这个主题的文章,如web scraping Ajax and Javascript sitesautomated browserless OAuth authentication for Twitter。在第一篇文章的最后,我自2011年以来一直在编译许多额外的资源。

答案 4 :(得分:2)

取决于ajax页面。屏幕抓取的第一部分是确定页面的工作方式。是否有某种变量可以迭代来请求页面中的所有数据?就我个人而言,我已经使用Web Scraper Plus进行了大量的屏幕抓取相关任务,因为它很便宜,不易上手,非程序员可以让它相对快速地工作。

附注:使用条款可能是您在执行此操作之前可能需要检查的地方。根据站点的不断迭代,可能会引发一些标志。

答案 5 :(得分:2)

我喜欢PhearJS,但这可能部分是因为我建造了它。

也就是说,它是您在后台运行的服务,它说HTTP(S)并为您呈现JSON页面,包括您可能需要的任何元数据。

答案 6 :(得分:1)

作为低成本解决方案,您还可以尝试SWExplorerAutomation(SWEA)。该程序为使用HTML,DHTML或AJAX开发的任何Web应用程序创建自动化API。

答案 7 :(得分:1)

我认为当源代码易于阅读时,Brian R. Bondy的答案非常有用。我更喜欢使用Wireshark或HttpAnalyzer等工具轻松捕获数据包,并从“主机”字段和“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

然后网址为:

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330

答案 8 :(得分:1)

Selenium WebDriver是一个很好的解决方案:您可以对浏览器进行编程,并自动完成浏览器中需要完成的操作。浏览器(Chrome,Firefox等)提供了与Selenium一起使用的驱动程序。由于它作为自动 REAL浏览器工作,因此页面(包括javascript和Ajax)会像使用该浏览器的人一样加载。

缺点是它很慢(因为你很可能希望等到所有图像和脚本加载到你在那个单页上进行抓取之前)。

答案 9 :(得分:0)

我之前已将麻省理工学院的溶剂和EnvJS作为我刮掉Ajax页面的答案。这些项目似乎已无法访问。

出于绝对的必要性,我发明了另一种实际刮掉Ajax页面的方法,并且它已经适用于像findthecompany这样的难点网站,这些网站有找到无头javascript引擎并且没有数据的方法。

该技术是使用chrome扩展来进行刮擦。 Chrome扩展程序是刮掉Ajax页面的最佳位置,因为它们实际上允许我们访问javascript修改的DOM。技术如下,我肯定会在某个时候开源代码。创建一个chrome扩展(假设您知道如何创建它,以及它的架构和功能。这很容易学习和练习,因为有很多样本),

  1. 使用内容脚本通过xpath访问DOM。几乎可以使用xpath将整个列表或表或动态呈现的内容作为字符串HTML节点转换为变量。 (只有内容脚本可以访问DOM,但他们无法使用XMLHTTP联系URL)
  2. 从内容脚本,使用消息传递,将整个剥离的DOM作为字符串发送到后台脚本。 (后台脚本可以与URL通信但不能触及DOM)。我们使用消息传递来进行交谈。
  3. 您可以使用各种事件来遍历网页,并将每个剥离的HTML节点内容传递给后台脚本。
  4. 现在使用后台脚本与外部服务器(在localhost上)进行通信,这是一个使用Nodejs / python创建的简单服务器。只需将整个HTML节点作为字符串发送到服务器,服务器就会将发布给它的内容保存到文件中,并使用适当的变量来识别页码或URL。
  5. 现在你已经删除了AJAX内容(HTML节点作为字符串),但这些是部分html节点。现在,您可以使用自己喜欢的XPATH库将这些文件加载​​到内存中,并使用XPATH将信息写入表格或文本中。
  6. 请注意,如果你不明白,我可以写得更好。 ( 第一次尝试 )。另外,我正在尝试尽快发布示例代码。