如何解析DOM(REACT)



我正试图从网站上抓取数据。该网站使用Facebook的React。因此,我可以使用Jaunt解析的源代码与我使用Chrome的检查器检查元素时看到的代码完全不同。

我对这一切知之甚少,但经过一些研究,我认为这与DOM有关,而不是源代码。我需要一种方法来获得这个DOM代码,因为原始源代码中没有我想要的内容,但我不知道从哪里开始(甚至在这里读了很多答案)。

这是一个我想刮的页面的例子。例如,为了抓取描述,我想抓取标签之间的内容:

<span class="light-font extended-card-description list-group-item">Example description....</span>

但正如您所看到的,此元素仅在">检查元素"时出现,而不是在我仅查看页面的源代码时出现。

我想问你们这些天才,我该如何获取这个DOM代码并开始抓取我真正想要的元素?

如果我的术语完全偏离了,请原谅,但正如我所说,这对我来说是一个全新的领域,我已经尽我所能进行了研究。

提前非常感谢!

ReactJS与许多其他Javascript库/框架一样,使用客户端代码(Javascript)来呈现最终的HTML。这意味着,当您、Jaunt或浏览器从服务器获取HTML源代码时,它还没有包含用户将看到的最终代码。浏览器需要运行页面中包含的Javascript程序,以便生成您想要抓取的最终内容。

我最喜欢的这类工作工具是CasperJS

它(或者更确切地说是CasperJS使用的PhantomJS工具)是一个无头浏览器,这意味着它是Webkit(如Chrome或Safari)的一个版本,已经去掉了所有的GUI(窗口、按钮、菜单)。剩下的是一个可以从终端或Java程序运行的工具。它不会在屏幕上显示任何窗口,但它会获取你要求它访问的网页;运行它们包含的任何Javascript;然后响应您的命令,例如"点击此链接"、"给我文本"、"捕获屏幕截图"等等

让我们从一个简单的ReactJS示例开始:

我们想抓取"Hello John"文本,但如果您查看纯HTML源代码(Ctrl+U1lt>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,并从终端使用casperjs hello.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安装PhantomJS2.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

您可能还想从bin/bootstrap.js文件中注释掉打印Warning PhantomJS v2.0 ...的行。

最新更新