gpt4 book ai didi

phantomjs - PhantomJS 的 Promise 框架?

转载 作者:行者123 更新时间:2023-12-04 02:09:53 24 4
gpt4 key购买 nike

我是 PhantomJS 的新手。我想加载一个页面,抓取它的链接,然后依次打开每个页面,一次一个,甚至每个请求之间可能会有延迟。我无法让一个接一个地触发,所以我想也许我可以使用 Promise 来解决这个问题,但我认为 Node 库不适用于 Phantom。到目前为止,我看到的每个示例都打开一个页面,然后退出。

这是我所拥有的:

var page = require('webpage').create();

page.open('http://example.com/secretpage', function(status) {
console.log(status);
if(status !== 'success') {
console.log('Unable to access network');
} else {
var links = page.evaluate(function() {
var nodes = [];
var matches = document.querySelectorAll('.profile > a');
for(var i = 0; i < matches.length; ++i) {
nodes.push(matches[i].href);
}
return nodes;
});


links.forEach(function(link) {
console.log(link);
page.open(link, function(status) { // <---- tries opening every page at once
console.log(status);

var name = page.evaluate(function() {
return document.getElementById('username').innerHTML;
});

console.log(name);
page.render('profiles/'+name + '.png');
});
});
}
// phantom.exit();
});

有没有办法按顺序打开每个链接?

最佳答案

对于这个典型场景,我使用 async.js尤其是队列 component .

这是一个非常基本的实现

phantom.injectJs('async.js');

var q = async.queue(function (task, callback) {
page.open(task.url, function(status) { // <---- tries opening every page at once
if(status !== 'success') {
console.log('Unable to open url > '+task.url);
} else {
console.log('opened '+task.url);
//do whatever you want here ...
page.render(Date.now() + '.png');
}
callback();
});

}, 1);

// assign a callback
q.drain = function() {
console.log('all urls have been processed');
phantom.exit();
}

var page = require('webpage').create();

page.open('http://phantomjs.org/', function(status) {
console.log(status);
if(status !== 'success') {
console.log('Unable to access network');
} else {
var links = page.evaluate(function() {
var nodes = [];
var matches = document.querySelectorAll('a');
for(var i = 0; i < matches.length; ++i) {
nodes.push(matches[i].href);
}
return nodes;
});

links.forEach(function(link) {
q.push({url: link}, function (err) {
console.log('finished processing '+link);
});
});
}
});

Url 被添加到队列中,并将被并行处理(达到并发限制,此处为一个)。我重用了相同的页面实例,但这不是强制性的。

由于我过去已经做过这种爬虫,让我再给你两个建议:
  • 不加载图片加速测试
  • href 有时是相对的,所以首先检查它是否是一个有效的 url
  • 关于phantomjs - PhantomJS 的 Promise 框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22004682/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com