0

我想从某个 JSON 格式的 URL 在线获取列表,然后使用该列表中每个项目的 DATA_ID 来调用新 URL。我只是 PhantomJS 的新手,我不明白为什么 page.open() 中的嵌套循环行为都很奇怪。此外,使用 phantom.exit() 的方式似乎真的很奇怪做我想要实现的目标。

这是我的代码:

console.log('Loading recipes');
console.log('===============================================================');

var page = require('webpage').create();
var url = 'http://www.hiddenurl.com/recipes/all';

page.open(url, function (status) {
    //Page is loaded!
    var js = page.evaluate(function () {
        return document.getElementsByTagName('pre')[0];
    });

    var recipes = JSON.parse(js.innerHTML).results;
    //console.log(recipes[0].name.replace('[s]', ''));

    for (i = 0; i < recipes.length; i++) {
        console.log(recipes[i].name.replace('[s]', ''));

        var craft_page = require('webpage').create();
        var craft_url = 'http://www.hiddenurl.com/recipe/' + recipes[i].data_id;

        craft_page.open(craft_url, function (craft_status) {
            //Page is loaded!
            var craft_js = craft_page.evaluate(function () {
                return document.getElementsByTagName('body')[0];
            });

            var craftp = craft_js.innerHTML;
            console.log('test');
        });

        if (i == 5) {
            console.log('===============================================================');
            phantom.exit();
            //break;
        }
    }
});

这里发生的事情是这一行:

console.log(recipes[i].name.replace('[s]', ''));

..打印以下内容:

===============================================================
Item from DATA_ID 1
Item from DATA_ID 2
Item from DATA_ID 3
Item from DATA_ID 4
Item from DATA_ID 5

..然后它只打印下一个:

===============================================================

..其次是:

'test'
'test'
'test'
'test'
'test'

为什么这没有连续发生?来自内部调用的 page() 请求的数据在最后被堆积并转储,即使在 phantom.exit() 实际上应该已经被调用之后。

此外,当我自由循环正常数据集时,我收到此错误:

QEventDispatcherUNIXPrivate(): Unable to create thread pipe: Too many open files
2013-01-31T15:35:18 [FATAL] QEventDispatcherUNIXPrivate(): Can not continue without a thread pipe
Abort trap: 6

有什么方法可以设置 GLOBAL_PARAMETERS 或以某种方式指导进程,以便我可以处理 100 个页面请求?

提前致谢!

4

1 回答 1

1

我通过 shell 分别调用 PhantomJS 来解决 Python 问题,如下所示:

import os
import json

cmd = "./phantomjs fetch.js"
fin,fout = os.popen4(cmd)
result = fout.read()

recipes = json.loads(result)

print recipes['count']

不是 PhantomJS 问题的实际解决方案,但它是一个有效的解决方案,并且在内存和代码结构方面的问题较少。

于 2013-01-31T15:46:00.877 回答