我有一个URL(例如http://www.example.com/OtterBox-77-24444-Commuter-Series-Optimus/dp/B00A21KPEI/ref=pd_sim_cps_4),想要截取它并在我的网页上预览它.意思是,用户点击预览按钮,PhantomJS需要以PNG/JPEG格式预览网页
我也可以使用任何其他开源.
我想使用Phantom.JS将各个HTML元素渲染到PNG中.有谁知道这是否可能?另外,我如何使用Phantom.js呈现用户已经在查看的页面?
是否可以在页面中传递变量.在我的情况下,我的情况如下?
function myFunction(webpage, arg1, arg2){
var page = require('webpage').create();
page.viewportSize = { width: 1920, height: 1080 };
page.open(webpage, function (status){
if (status == 'success') {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js", function(){
page.evaluate(function(){
arg = arg1 + arg2;
console.log(arg);
});
});
}
else { phantom.exit(); }
});
}
Run Code Online (Sandbox Code Playgroud)
我尝试了在互联网上找到的几种方法,但实际上没有什么可以得到它的变量.
预先感谢您的帮助 :)
我试图刮一个网站,但我没有得到一些元素,因为这些元素是动态创建的.
我在node.js中使用cheerio,我的代码在下面.
var request = require('request');
var cheerio = require('cheerio');
var url = "http://www.bdtong.co.kr/index.php?c_category=C02";
request(url, function (err, res, html) {
var $ = cheerio.load(html);
$('.listMain > li').each(function () {
console.log($(this).find('a').attr('href'));
});
});
Run Code Online (Sandbox Code Playgroud)
此代码返回空响应,因为页面加载时<ul id="store_list" class="listMain">为空.
内容尚未附加.
如何使用node.js获取这些元素?如何使用动态内容抓取页面?
我正在努力将PhantomJS无头浏览器集成到我的项目中(目前使用的是1.6版本).在大多数情况下,它在完成我需要完成的工作方面做得很好.但是,WebPage.open()调用的方式的异步性质,以及在某些时候调用phantom.exit()的需要,使得当您无法预测它们的去向时,处理客户端重定向变得棘手去.
我所追求的只是在任何元刷新(导致不同的页面)之后调用phantom.exit()的方法,并且JavaScript重定向与诸如onload事件之类的事情相关联.我明白为什么这是一个问题,因为在理论上一个客户端重定向可以在页面加载后发生的任何秒数,我不能简单地要求的能力退出,只有当没有更多的重定向会发生.现在,我能想到的最好的解决方案是:a)手动检测页面上元刷新元素的存在并自己处理,b)使用setInterval()来节省一些时间(例如,1-在调用phantom.exit()之前经过1.5秒).基本上看起来像这样:
var page = require('webpage').create();
var visitComplete = false;
var url = "http://some.url";
var pageOpenedTime;
setInterval(function() {
if (visitcomplete && typeof pageOpenedTime != 'undefined' &&
new Date() - pageOpenedTime >= 1500)
{
phantom.exit();
}
), 1000);
page.open(url, function() {
pageOpenedTime = new Date();
if (!hasMetaRefresh(page)) {
visitComplete = true;
}
});
function hasMetaRefresh(page) {
// Query the DOM here to detect meta refresh elements
}
Run Code Online (Sandbox Code Playgroud)
有更好的想法吗?
编辑:我应该提一下,我的第一个想法是,当执行与初始页面加载相关联的JavaScript时,可能会有一个PhantomJS事件被触发,但onLoadFinished回调似乎先于任何页内JavaScript的执行,包括onload事件.我还做了一些关于我可能需要等待多少时间间隔的测试,虽然1000 ms足够长时间以便在一个小的测试页面中执行JavaScript重定向(通过body onload事件),但100 ms还不够长.
PhantomJS's当PhantomJS与Selenium和Python结合使用时,是否可以使用渲染到PDF功能?(即page.render('file.pdf')通过Selenium 模仿Python内部的行为).
我意识到这种用途GhostDriver,并GhostDriver没有真正支持打印的方式.
如果另一种替代品可能不是Selenium,我全都耳朵.
当我运行它时,我有一个单元测试正在通过python manage.py test,但是当我从PyCharm中运行它时失败了.
def test_alpha(self):
from selenium.webdriver.common.utils import free_port
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path=PHANTOMJS_PATH, port=free_port())
driver.quit()
Run Code Online (Sandbox Code Playgroud)
从PyCharm运行时遇到的异常是
WebDriverException: Message: 'Can not connect to GhostDriver'
Run Code Online (Sandbox Code Playgroud)
我花了相当多的时间来研究这个问题,我注意到当我手动指定一个端口时,测试在PyCharm中传递.
# suppose 50000 happens to be a free port on your computer
driver = webdriver.PhantomJS(executable_path=PHANTOMJS_PATH, port=50000)
Run Code Online (Sandbox Code Playgroud)
快速回顾一下:
python manage.py testport=free_port()PyCharm做的是让测试无法连接到Ghostdriver?
# For convenience, the `free_port()` code snippet is here
# selenium.webdriver.common.utils.freeport
def free_port():
free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
free_socket.bind(('127.0.0.1', 0))
free_socket.listen(5)
port = free_socket.getsockname()[1]
free_socket.close()
return port
Run Code Online (Sandbox Code Playgroud) phantomjs无法安装.错误是否表明bitbucket有问题?
$ sudo npm install -g phantomjs
...
> phantomjs@1.9.7-6 install /usr/lib/node_modules/phantomjs
> node install.js
Looks like an `npm install -g`; unable to check for already installed version.
Downloading http://cdn.bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2
Saving to /usr/lib/node_modules/phantomjs/phantomjs/phantomjs-1.9.7-linux-x86_64.tar.bz2
Receiving...
Error requesting archive.
Status: 403
Request options: {
"protocol": "http:",
"slashes": true,
"auth": null,
"host": "cdn.bitbucket.org",
"port": null,
"hostname": "cdn.bitbucket.org",
"hash": null,
"search": null,
"query": null,
"pathname": "/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2",
"path": "/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2",
"href": "http://cdn.bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2"
}
Response headers: {
"content-type": "application/xml",
"transfer-encoding": "chunked",
"connection": "keep-alive",
"date": "Fri, 23 May …Run Code Online (Sandbox Code Playgroud) 我看到CasperJS有一个"下载"功能和一个"on resource received"回调,但我没有在回调中看到资源的内容,我不想将资源下载到文件系统.
我想获取资源的内容,以便我可以在我的脚本中使用它.这可能与CasperJS或PhantomJS有关吗?
我正在进行同步ajax调用(ajax设置async:false).这很好用.
现在我正试图在phantomJS中为此编写一个自动测试,我收到了这个错误
NETWORK_ERR: XMLHttpRequest Exception 101
Run Code Online (Sandbox Code Playgroud)
我检查了我的服务日志,似乎服务没有得到任何请求.
phantomjs ×10
javascript ×4
node.js ×2
python ×2
ajax ×1
casperjs ×1
frontend ×1
jquery ×1
npm ×1
pycharm ×1
selenium ×1
unit-testing ×1
web-crawler ×1