像许多其他Javascript库/框架一样,ReactJS使用客户端代码(Javascript)来呈现最终的HTML。这意味着,当您,Jaunt或浏览器从服务器获取HTML源代码时,它还不包含用户将看到的最终代码。浏览器需要运行页面中包含的Javascript程序,以便生成您希望抓取的最终内容。
对于这种工作,我最喜欢的工具是 CasperJS
它(或CasperJS使用的PhantomJS工具)是一个无头的浏览器,这意味着它是Webkit的一个版本(如Chrome或Safari),已经剥离了所有GUI(窗口,按钮,菜单)。您可以从终端或Java程序运行。它不会在屏幕上显示任何窗口,但是会提取您要求的网页;运行它们包含的任何Javascript;然后响应您的命令,例如“单击此链接”,“给我该文本”,“捕获屏幕截图”,等等。
让我们从一个简单的ReactJS示例开始:
我们想抓取“ Hello John”文本,但是如果您查看纯HTML源(
Ctrl+
U或
Alt+
Ctrl+
U),则不会看到它。另一方面,如果在浏览器中打开控制台并使用以下选择器,则会显示以下文本:
> document.querySelector('#helloExample .playgroundPreview').textContent"Hello John"这是执行相同操作的简单CasperJS脚本:
var casper = require("casper").create();casper.start("http://facebook.github.io/react/index.html", function() { this.echo(this.fetchText("#helloExample .playgroundPreview"));});casper.run();您可以将其另存为
hello.js并
casperjshello.js在终端上执行,或使用等效的Java代码
Runtime.getRuntime().exec(...)
这是一个更好的脚本,它避免了加载图像和第三方资源(例如Facebook按钮,Twitter按钮,Google
Analytics等),从而将加载时间缩短了一半。它还增加了一个
waitForSelector步骤,这样我们就不必冒险在ReactJS有机会创建文本之前尝试获取文本。
var casper = require("casper").create({ pageSettings: { loadImages: false }});casper.on('resource.requested', function(requestData, request) { if (requestData.url.indexOf("http://facebook.github.io/") != 0) { request.abort(); }});casper.start("http://facebook.github.io/react/index.html", function() { this.waitForSelector("#helloExample .playgroundPreview", function() { this.echo(this.fetchText("#helloExample .playgroundPreview")); });});casper.run();如何安装CasperJS
我在使用PhantomJS和CasperJS的较早版本刮除ReactJS和其他现代Javascript页面时遇到了一些麻烦,因此我建议从GitHub安装PhantomJS
2.0和最新的CasperJS。
对于PhantomJS,您可以下载官方2.0软件包。
对于CasperJS,由于它是Python脚本,因此您应该能够从GitHub检出最新提交并链接
bin/casperjs到PATH。这是Linux或Mac
OS X的脚本:
> git clone git://github.com/n1k0/casperjs.git> cd casperjs> ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs
您可能还需要注释掉该行打印
Warning PhantomJS v2.0 ...您的
bin/bootstrap.js文件。



