【问题标题】:Scrape page after onload JS DOM injectiononload JS DOM注入后抓取页面
【发布时间】:2012-03-14 16:47:24
【问题描述】:

我正在构建一个从页面获取主要图像(基于Content-Length)的刮板。它遍历所有<img> 元素并发出HEAD 请求。但是某些页面,尤其是。移动,在页面加载后插入图像。关于如何解决这个问题的任何想法?

我正在使用node.js

【问题讨论】:

  • 你必须在你的服务器上运行相关的 JS 来复制那些页面正在做的事情。
  • @MarcB:如何在我的服务器上运行相关的 JS?有图书馆还是我自己写的?我现在正在使用request

标签: javascript dom node.js web-scraping


【解决方案1】:

我不能确定它是否能解决您的问题,但您可以考虑使用 jsdom,因为它可以获取并执行页面中的脚本,并在服务器端为您提供 DOM。比如:

var request = require('request'),
    jsdom = require('jsdom').jsdom;

request(url, function(err, response, body) {
  if(err) return console.error(err);

  var doc = jsdom(body, null, {
    FetchExternalResources: ['script', 'img']
  });
  var window = doc.createWindow();

  var images = doc.getElementsByTagName('img');
});

【讨论】:

  • 我能说什么,我只是想帮忙。以上对我有用,获取一个动态添加img标签的页面。
  • 我确信它确实有效,感谢分享。我之前使用过这个jsdom,它曾经在很多 HTML 不完美的网站上崩溃。所以,对我来说,jsdom 不是一个选项,对不起!
  • 模拟 DOM 通常会很古怪。这就是我推荐 PhantomJS 的原因,它是一个实际的 WebKit 浏览器实例。
【解决方案2】:

使用PhantomJS。它“是一个带有 JavaScript API 的无头 WebKit”。可以把它想象成一个可以通过 JavaScript API 控制的整个浏览器。因为它是一个浏览器,它会完全执行页面,然后你可以抓取它们。

它与 Node.js 有点相似,但它实际上是一个完整的浏览器,您的脚本可以完全访问您下拉的页面的 DOM。因此,通过使用 jQuery 之类的工具访问 DOM 来智能地“抓取”页面会更容易,而不仅仅是访问原始 HTML。

这是DOM manipulation上的一个例子

【讨论】:

  • 这听起来很有趣,但它可能太过分了。不过谢谢。 :)
猜你喜欢
  • 2018-09-20
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多