2008-11-04 98 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> 

然后,所有你需要做的是,而不是做代替对同一服务器的time.asp的HTTP请求。 Example from w3schools


高级抓取与C++:

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

先进的Java刮:

对于复杂的应用,如果你使用的是Java,你也可以考虑使用Firefox的JavaScript引擎对Java Rhino

高级使用.NET刮:

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

+0

+100 !!!!像魅力一样工作。 – Atul 2013-04-12 09:46:29

+0

哇,这是非常有用的信息,即使有像phantomjs这样的工具现在可用,知道如何使用所述的方法自定义刮页面,一旦你调查了幕后的感谢,很多方便的感谢Brian +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)。该程序为任何使用HTML,DHTML或AJAX开发的Web应用程序创建自动化API。

0

我之前已经将MIT的溶剂和EnvJS作为我的答案来删除Ajax页面。这些项目似乎不再可用。

出于绝对必要性,我发明了另一种方法来实际上刮掉Ajax页面,并且它已经为像findthecompany这样的难以找到无头javascript引擎并显示无数据的方法工作。

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

  1. 使用内容脚本访问DOM,通过使用XPath的。几乎将整个列表或表格或动态呈现的内容使用xpath作为字符串HTML节点获取到变量中。 (只有内容脚本可以访问DOM,但不能使用XMLHTTP联系URL)
  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 sites很多文章automated browserless OAuth authentication for Twitter。在第一篇文章的最后有很多额外的资源,我自2011年以来一直在编译。

1

我认为Brian R. Bondy的答案在源代码易于阅读时很有用,我更喜欢简单使用Wireshark或HttpAnalyzer等工具捕获数据包,并从“主机”字段和“GET”字段获取URL。

例如,我捕捉像一个数据包中的以下内容:

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

在我看来,simpliest解决方案是使用Casperjs的基础上,框架WebKit无头浏览器幻灯片。

整个页面被加载,并且很容易刮掉任何与Ajax相关的数据。 您可以检查此基础教程学习Automating & Scraping with PhantomJS and CasperJS

您也可以给看看这个例子的代码,就如何刮谷歌建议的关键字:

/*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)会像使用该浏览器的人类一样被加载。

它的缺点是速度很慢(因为您很可能希望等到所有图像和脚本加载之后才能在您的单页上进行拼写)。