我想开发一个可以做两件事的工具:
在以下网络表单中设置语言和日期:http://ibreviary.com/m2/opzioni.php,然后
下载同一网站上其他网页的文字,但保留这些设置。例如,http://ibreviary.com/m2/breviario.php?s=lodi。
该工具应模仿用户在正常浏览这些页面时所执行的操作:设置所需的语言和日期,然后查看动态创建的页面。
我认为Node.js对于这项工作来说是一个很好的工具。虽然我能够让它发布表格数据(我认为),然后下载所需的页面,但我无法让服务器“记住”设置(就像真正的网络浏览器会话一样)。下载的文本始终是默认文本(今天的日期)。
这是我到目前为止的Javascript代码:
var FormData = require('form-data');
var request = require('request');
var http = require('http');
var fs = require('fs');
var formData = {
lang: 'en',
giorno: 15,
mese: 11,
anno: 2014
};
request.post({url:'http://www.ibreviary.com/m/opzioni.php',
formData: formData},
function optionalCallback(err, httpResponse, body) {
if (err) {
return console.error('upload failed:', err);
}
console.log('Upload successful! Server responded with:', body);
download(url, destination, function(){
console.log("Done saving file '" + destination +
"' downloaded from '" + url + "'");
});
});
var url = "http://www.ibreviary.com/m/breviario.php?s=lodi";
var destination = "file.html";
var download = function(url, destination, callback) {
var file = fs.createWriteStream(destination);
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(callback); // close() is async, call callback
// after close completes.
});
}).on('error', function(err) { // Handle errors
fs.unlink(destination); // Delete the file async.
if (callback) callback(err.message);
});
};
如果您尝试一下,您会看到第一个request.post
的输出是未更改的网页:好像该表单的发布不起作用。
有什么想法吗?
答案 0 :(得分:0)
最后,我使用Python的mechanize
package来做我想做的事。
以下是适用于我的最低工作示例:
#!/usr/bin/python
import re
import mechanize
optionsURI = "http://www.ibreviary.com/m2/opzioni.php"
hourURI = "http://www.ibreviary.com/m2/breviario.php?s=lodi"
br = mechanize.Browser()
# Open the options form and submit the desired data.
br.open(optionsURI)
br.select_form(nr=0) # Select the first (and only) form on the page.
br.form["anno"] = "2014" # year
br.form["mese"] = ["11"] # month
br.form["giorno"] = "15" # day
br.form["lang"] = ["en"] # language or rite:
# it, en, es, fr, pt, ro, ar, ra, la, vt
br.submit()
# Open the desired page and print to standard output.
mypage = br.open(hourURI)
print mypage.read()