有没有办法在Heroku上运行phantomjs,一个命令行工具?
我正在尝试使用phantomjs抓取我自己网站的快照 - 基本上,这是创建用户提交内容的"预览图像".
我在服务器上安装了phantomjs并确认从命令行运行它对适当的页面工作正常.但是,当我尝试从网站上运行它时,它似乎没有做任何事情.我已经确认正在调用代码,幻像实际上正在运行(我监视过程,并且当我调用它时可以看到它出现在进程列表中) - 但是,没有生成图像.
我不知道我应该在哪里找出它为什么不会创建图像 - 任何建议?相关代码块如下:
string arguments = "/c rasterize.js http://www.mysite.com/viewcontent.aspx?id=123";
string imagefilename = @"C:\inetpub\vhosts\mysite.com\httpdocs\Uploads\img123.png";
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.FileName = @"C:\phantomjs.exe";
p.StartInfo.Arguments = arguments + " " + imagefilename;
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
Run Code Online (Sandbox Code Playgroud) 尝试使用PhantomJS登录时,我发现了一个有趣的问题.我不知道为什么它真的发生了.
基本上你启动一个远程调试器,如下所示:
/usr/local/bin/phantomjs --web-security=no --remote-debugger-port=13379 --remote-debugger-autorun=yes /tmp/test.js
Run Code Online (Sandbox Code Playgroud)
在远程调试器中:
> location.href = "https://www.mysite.com/login"
> $('input[name="username_or_email"]').val('blah@email.com')
> $('input[name="password"]').val('wrongpassword')
> $('button[type="submit"]').submit()
Run Code Online (Sandbox Code Playgroud)
在Chrome中执行此操作会在XHR请求后给我正确的"错误密码"消息,而使用phantomjs会给我一个通用错误,因为没有使用phantomjs发送cookie(我检查了标题).
我很困惑为什么phantomjs不发送带有POST请求的cookie.有谁知道我们怎么能让phantomjs发送带有所有请求的cookie呢?设置cookie文件也没有任何区别.
Phantomjs有这两个非常方便的回调onLoadStarted,onLoadFinished它允许你在页面加载时基本上暂停执行.但我一直在搜索,如果你click()提交按钮或超链接,我找不到相应的.发生了类似的页面加载,但onLoadStarted我没有调用此事件,因为没有明确的page.open()发生.我正试图找出一种干净的方法来暂停执行此负载.
一个解决方案显然是嵌套的setTimeout,但我想避免这种情况,因为它是hacky并依赖于试验和错误而不是可靠和更强大的东西,如测试某事或等待事件.
我错过了这种页面加载的特定回调吗?或者也许有某种通用的代码模式可以处理这种事情?
编辑:
我还没弄明白如何让它暂停.这是onLoadStarted()我调用click()命令时不调用该函数的代码:
var loadInProgress = false;
page.onLoadStarted = function() {
loadInProgress = true;
console.log("load started");
};
page.onLoadFinished = function() {
loadInProgress = false;
console.log("load finished");
};
page.open(loginPage.url, function (status) {
if (status !== 'success') {
console.log('Unable to access network');
fs.write(filePath + errorState, 1, 'w');
phantom.exit();
} else {
page.evaluate(function (loginPage, credentials) {
console.log('inside loginPage evaluate function...\n')
document.querySelector('input[id=' + loginPage.userId + ']').value = credentials.username; …Run Code Online (Sandbox Code Playgroud) 当我使用普通浏览器(Chrome)浏览网站A时,当我点击网站A上的链接时,Chrome会以CSV文件的形式下载报告.
当我检查服务器响应头时,我得到以下结果:
Cache-Control:private,max-age=31536000
Connection:Keep-Alive
Content-Disposition:attachment; filename="report.csv"
Content-Encoding:gzip
Content-Language:de-DE
Content-Type:text/csv; charset=UTF-8
Date:Wed, 22 Jul 2015 12:44:30 GMT
Expires:Thu, 21 Jul 2016 12:44:30 GMT
Keep-Alive:timeout=15, max=75
Pragma:cache
Server:Apache
Transfer-Encoding:chunked
Vary:Accept-Encoding
Run Code Online (Sandbox Code Playgroud)
现在,我想使用PhantomJS下载并解析此文件.我设置了page onResourceReceived监听器,看看Phantom是否会接收/下载该文件.
clientRequests.phantomPage.onResourceReceived = function(response) {
console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response));
};
Run Code Online (Sandbox Code Playgroud)
当我发出Phantom请求下载文件时(这是page.open('文件的URL')),我可以在Phantom日志中看到该文件已下载.这是日志:
"contentType": "text/csv; charset=UTF-8",
"headers": {
"name": "Date",
"value": "Wed, 22 Jul 2015 12:57:41 GMT"
},
"name": "Content-Disposition",
"value": "attachment; filename=\"report.csv\"",
"status":200,"statusText":"OK"
Run Code Online (Sandbox Code Playgroud)
我收到了文件及其内容,但是如何访问文件数据?当我打印当前的PhantomJS page对象时,我得到了页面A的HTML而我不希望这样,我想要CSV文件,我需要使用JavaScript解析它.
我想知道是否有可能通过用户的IP刮取外部(跨域)页面?
对于购物比较网站,我需要抓一个e-com网站的页面,但是来自服务器的几个请求会让我被禁止,所以我正在寻找方法进行客户端抓取 - 也就是说,请求来自用户的页面IP并发送到服务器进行处理.
我们使用幻像JS从网页(内部网站点)打印PDF.我的问题不在于整个样式,而在于@page规则.@page规则中的所有样式均未应用.
你知道这可能是什么吗?
@page {
size: auto;
padding: 0 !important;
margin: 10mm !important;
page-break-before: avoid;
border: none !important;
page-break-after: avoid;
page-break-inside: avoid;
overflow: hidden !important;
box-sizing: border-box !important;
@top-left-corner {
content: ""; /* has to be specified! */
background-color: rgba(42, 201, 80, 0.220);
border-bottom: solid green;
}
}
Run Code Online (Sandbox Code Playgroud) 如何检查casperjs脚本中的对象?
我试过console.log(arguments)但它只打印[object Arguments]或[object Object].
我希望得到类似的结果:{'firstparam':'value'...}
就像在Javascript控制台或Node.js中一样......
也许这是一个Phantomjs的问题,我不确定......
我最近将测试从python运行phantomJS作为命令行参数,我还没有完成它但是已经看到了例子.因为PhantomJS是从命令行运行的,所以这似乎是可能的.PhantomJS吐出的结果将直接变成一个变量.
在我走这条路之前,在node.js中进行这项工作对我来说实际上会更有用,它让我思考,我可以使用节点来运行PhantomJS,因为程序从命令行运行并存储数据结果PhantomJS通常会吐出一个变量吗?
我宁愿不使用phantomjs-node,因为它似乎使用了太多的技巧.
所有这一切的原因是能够在程序采取的另一个动作的同时运行PhantomJS并使用其记录的结果数据用于其他一些东西.
简单地说,你可以在python中运行系统命令行东西,我可以在node.js中做同样的事情吗?
干杯:)
编辑:我理解节点和幻像使用不同的js环境,这很酷,因为我只想将幻像作为自己的进程运行并将所有输出数据捕获到node.js变量中(数据将是一对数组,字符串和浮点.)我不想用幻象"开车",我会制作加载的javascript文件,以达到我想要的效果.我想要的只是幻象输出.:)
所以我正在尝试创建一个使用Selenium自动化WebDriver在网站上执行任务的java程序.目前,我正在使用它进行工作,以便自动执行烦人的任务,用户必须将文件上传到我们的数据库.我已经成功地制作了一个自动执行此程序的程序,并节省了数小时的手动工作.
现在我想让程序并行运行多个浏览器.我想这样做是为了加快我上传文件的速度,因为大部分时间都在等待页面加载.
我用一个更简单的程序版本对此进行了测试,并通过使用自己的WebDrivers打开了数十到数百个线程,设法将简单任务加速了2-10倍.
问题是,每当我运行超过1个 WebDriver时,整个事情有时会开始随机发生,而在其他时候根本不起作用.我尝试使用'PhantomJSDriver'和最新的'PhantomJS.exe',但有时它会起作用,而且大多数时候它什么都不做.与一个驱动程序运行完美运行的相同程序在并行运行时会发生故障.
我一直试图找到原因,为什么会发生这种情况以及解决这个问题的方法,但我还没有找到任何可以使用的确定方法.
如果可能的话,我如何与Selenium并行进行自动化网页浏览,如果没有,为了做到这一点,我应该在哪里寻找?