你如何刮AJAX页面?
标题说明了一切。 请指教如何刮AJAX页面。
概述:
所有屏幕抓取首先需要手动检查您要从中提取资源的页面。 在处理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,你也可以考虑使用Java Rhino的firefox javascript引擎
用.NET进行高级刮取:
对于复杂的用法,如果您使用.Net,您也可以考虑使用Microsoft.vsa程序集。 最近取代了ICodeCompiler / CodeDOM。
如果可以的话,请尝试检查DOM树。 Selenium做这个testing页面的一部分。 它还具有点击button和跟随链接的function,这可能是有用的。
在我看来,最简单的解决scheme是使用Casperjs ,这是一个基于WebKit无头浏览器幻灯片的框架。
整个页面被加载,并且很容易刮掉任何与Ajax有关的数据。 你可以查看这个基本的教程来学习使用PhantomJS和CasperJS进行自动化和刮擦
你也可以看看这个例子的代码,关于如何刮谷歌build议的关键字:
/*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(); });
使用Ajax或一般页面使用Javascript刮取网页的最佳方法是使用浏览器本身或无头浏览器(不带GUI的浏览器)。 目前phantomjs是一个很好的推广使用WebKit的无头浏览器。 我成功的一个替代方法是HtmlUnit (在Java或.NET中,通过IKVM ,这是一个模拟的浏览器)。另一个已知的替代方法是使用像Selenium这样的Web自动化工具。
我写了很多关于这个主题的文章,例如网页抓取Ajax和Javascript网站以及Twitter的自动浏览器OAuth身份validation 。 在第一篇文章的最后,自2011年以来,我一直在编写大量额外的资源。
取决于ajax页面。 屏幕抓取的第一部分是确定页面是如何工作的。 是否有某种variables可以迭代来请求页面中的所有数据? 就个人而言,我已经使用Web Scraper Plus进行了很多与屏幕抓取相关的任务,因为它很便宜,不难入门,非程序员可以相对快速地工作。
方面注意:使用条款可能是你可能要在这之前检查的地方。 根据遍历所有网站的站点可能会引起一些标志。
作为一个低成本的解决scheme,您也可以尝试SWExplorerAutomation (SWEA)。 该程序为使用HTML,DHTML或AJAX开发的任何Web应用程序创build自动化API。
我喜欢PhearJS ,但这可能部分是因为我build立了它。
也就是说,这是一个在后台运行的服务,它表示HTTP(S)并将页面呈现为JSON,包括您可能需要的任何元数据。
我认为,当源代码易于阅读时,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
另一个最好的工具,让我们在活DOM上写剪贴画是麻省理工学院的解决scheme。 http://simile.mit.edu/wiki/Solvent 。
Envjs在http://www.envjs.com/doc/guides上也很有前途。;
如果你的意图是高规模的,你可能需要引入延迟和模仿人类的行为,以避免被服务被禁止的禁止。