PhantomJS页面使用嵌套循环获取以获取新页面
PhantomJS page fetching with nested loop to get new pages
我想从某个 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 个页面请求?
提前感谢!
我通过
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问题的实际解决方案,但它是一个有效的解决方案,并且在内存和代码结构方面存在较少的问题。
相关文章:
- chrome在WebSocket握手期间获取新错误
- 在检查单选按钮的值是否正确后,如何将其带到新页面
- 如何在谷歌网站中使用javascript获取当前页面的网址
- 在Phonegap中重定向到新页面后,AdMob未定义
- ASP.NET MVC 3-在ajax调用后,重定向到新页面或生成页面刷新
- javascript:发送带有音频文件的POST,然后重定向到新页面
- 获取当前页面MVC 5的pdf
- 在onclick上动态创建新页面
- 如何将缩略图链接到新页面上的视频
- Javascript:在新页面中打开链接并运行脚本
- 更改 URL 并使用 AJAX 获取响应加载新页面的最佳方法是什么
- 使用哈希来获取网址,而无需重定向到新页面
- 如何获取当前页面 URL 并将其放入 JavaScript 中的新 URL 引用中
- 获取已更改的下拉选择的值,然后加载新页面
- 如何使用 Angular 刷新页面以从服务中获取新值
- 单击<后重新加载页面;a>从PHP获取新数据
- 如何使用AJAX获取新添加的数据而不刷新页面
- html总是从链接中获取新页面
- PhantomJS页面使用嵌套循环获取以获取新页面
- 只获取新添加的子元素.页面加载后