请提供如何刮阿贾克斯页。

有帮助吗?

解决方案

<强>概述:

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


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

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

使用Java进行高级抓取:

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

使用.NET进行高级抓取:

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

其他提示

在我看来,最简单的解决方案是使用 Casperjs ,这是一个基于WebKit无头浏览器phantomjs的框架。

整个页面都已加载,并且很容易抓取任何与ajax相关的数据。 您可以查看此基础教程以了解 Automating&amp;使用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是用浏览器本身或一个无头的浏览器(一浏览器,而不GUI)。目前 phantomjs 是一个促进无头浏览器。.一个替代的,我成功使用是 HtmlUnit (Java或.净过 IKVM, ,这是一个模拟的浏览器。另一种已知的替代方法是使用网络工具,如自动化 .

我写了许多文章有关这一主题的喜欢 网刮阿贾克斯和Javascript网站自动化browserless保护身份验证的认证叽叽喳喳.在结束第一篇文章有很多额外的资源,我已经编制,因为2011年。

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

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

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

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

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

我认为当源代码易于阅读时,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

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

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

我以前与麻省理工学院的溶剂和EnvJS作为我的回答来刮去阿贾克斯页。这些项目似乎没有再访问。

纯粹出于需要,我们发明了另一种方法实际上刮掉阿贾克斯页,以及它曾为艰难的网站,如findthecompany有方法找到无头javascript发动机和显示没有数据。

该技术是用铬扩展到做刮。铬的扩展是最好的地方刮掉阿贾克斯页,因为他们实际上允许我们进入javascript修改DOM。该技术是如下,我将肯定开放源代码在某个时候。创建一个铬扩展(假设你知道如何创建一个,其结构和能力。这是易于学习和实践,因为有大量的样品),

  1. 使用内容的脚本访问DOM,通过使用xpath。几乎得到整个清单或表格或动态地呈现的内容使用xpath进入一个变量,如串HTML节点。(只有内容的脚本可以访问DOM但他们不能联系URL使用XMLHTTP)
  2. 从脚本内容,使用信息传递消息的整个剥DOM如串,一背景脚本。(背景脚本可以帮你的网址,但不能碰的DOM)。我们使用的消息传递,获得这些谈话。
  3. 你可以使用的各种事件的循环,通过网页并通过每个被剥HTML节点内容的背景脚本。
  4. 现在使用的背景脚本,交一个外部服务器上("localhost"),一个简单的创建使用node.js/蟒蛇。只要发送整个HTML节点作为string,向服务器、服务器只会持续存在的内容张贴到它,成文件,与适当的变量来确定的页码或网址。
  5. 现在你有刮AJAX内容(HTML节点作为string),但是这些部分html节点。现在你可以使用你最喜欢的XPATH图书馆加载到这些存和使用XPATH刮信息纳入表格或文本。

请评论,如果你不能理解我可以写得更好。(第一次尝试).此外,我试图以释放的代码样本,尽快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top