好吧,我正在用这种方式使用Nodejs用 Selenium-webdriver / phantomjs 抓取一个网站:
app.js
var express = require('express');
var By = require('selenium-webdriver').By;
var until = require('selenium-webdriver').until;
var phantomjs = require('selenium-webdriver/phantomjs');
var app = express();
var driver = new phantomjs.Driver();
app.get('/', function(req, res) {
var user = req.query.user;
var pass = req.query.pass;
driver.get('https://www.xxxxxxxxxxxxx.com/'); // The site I'm requesting (:
// remove read-only attribute
driver.executeScript("document.getElementById('Password').removeAttribute('readonly')");
// inputs
driver.findElement(By.id('LoginName')).sendKeys(user);
driver.findElement(By.id('Password')).sendKeys(pass);
// button
driver.findElement(By.name('Login')).click();
// wait for the title
driver.wait(until.titleIs('List'), 5000);
driver.findElement(By.css('td[class*="nav"]')).getText().then(function(text) {
console.log(text);
});
driver.quit();
});
var server = app.listen(5000, function() {
var host = server.address().address
var port = server.address().port
console.log('Api listening at http://%s:%s', host, port)
});
如果我在终端上输入:
forever --pidFile /var/run/app.pid -a -l /var/log/node/app.log start /home/user/node-apps/myapp/app.js
然后在浏览器中输入:
http://127.0.0.1:5000/?user=a_user&pass=a_pass
脚本从网站正确返回答案(文本)。
但是我需要在重启服务器时可以使用这个应用程序,所以我编辑了我的crontab并添加了这个:
@reboot /usr/bin/sudo -u root -H /usr/local/bin/forever --pidFile /var/run/app.pid -a -l /var/log/node/app.log start -c /usr/local/bin/node /home/user/node-apps/myapp/app.js
但这一次,事情并没有按照他们的意愿行事。该脚本返回错误,说:
Error: Waiting for title to be "List" Wait timed out after 5006ms
但是,如果我通过输入:forever stop 1
来停止应用,然后输入fisrt命令(我的意思是:forever --pidFile /var/run/app.pid -a -l /var/log/node/app.log start /home/user/node-apps/myapp/app.js
),该应用再次有效。
当我重新启动服务器时,为什么应用程序不起作用的一些想法?
编辑:1
我尝试过这种方法从不需要身份验证的站点中获取一些数据,当我重新启动服务器时,该应用程序正常运行。而且我也尝试过其他需要身份验证的网站,我也遇到了同样的问题。
我的想法是问题出在需要身份验证的网站上。为什么?有什么想法吗?