我正在努力抓this site。如果您点击county
然后点击continue
(如果您愿意,请选择州和/或年份),您将获得一张桌子。但是,该网站使用的是Cookie和隐藏字段,例如as_sfid
和as_fid
,这使得这一点不太直接。我正在使用request module,据我所知,我正在为第二个请求捕获cookie和所需的formData,但我得到的html是一个错误页面,上面写着" Object Moved& #34 ;.如果您查看浏览器发出的请求,您将看到另一个获得请求但未收到任何响应的请求。我试着在两个当前的请求之间坚持这个但是它并没有改变任何东西。
var util = require('util');
var debug = require('debug')('app');
var _ = require('lodash');
var MongoClient = require('mongodb').MongoClient;
var $ = require('cheerio');
var request = require("request");
request = request.defaults({ jar: true });
var j = request.jar();
var inspect = _.partialRight(util.inspect, false, null)
var url = 'mongodb://localhost:27017/mydb';
MongoClient.connect(url, function(err, db) {
if(err) {
debug(err);
} else {
var collection = db.collection('FDIC');
var getUrl = 'https://www2.fdic.gov/sod/sodSummary.asp?barItem=3';
request.get({ url: getUrl, jar: j }, function(err, res) {
if(err) {
debug('err:', err);
} else {
$ = $.load(res.body.toString());
var sfid = $("input[name='as_sfid']")['0'].attribs.value;
var fid = $("input[name='as_fid']")['0'].attribs.value;
var formData = {
sInfoAsOf: "2014",
barItem: 3,
sSummaryList: 8,
as_sfid: sfid,
as_fid: fid
};
debug('formData:', formData)
debug('cookies:', j.getCookies(getUrl))
var postUrl = 'https://www2.fdic.gov/sod/SODSummary2.asp';
//var postUrl = 'https://www2.fdic.gov/sod/SODSumReport.asp';
request.post({ url: postUrl, formData: formData, jar: j }, function(err, res2) {
if(err) {
debug('res2:', err);
} else {
debug('--->', inspect(res2.body));
db.close()
}
});
}
});
}
});
如果您想要运行该项目,我还制作了a gist,此处为the repo
编辑:我忘了提到如果你打印cheerio发现的结果,每个输入查询都有两个结果。这很奇怪,因为当我浏览html时,我只能找到其中一个(一个as_sfid和一个as_fid)。无论如何,我决定尝试所有组合,所有这些组合都会产生相同的结果。
答案 0 :(得分:1)
您必须调用JS函数submitReport(),这是为每个锚标记定义的onclick操作,以模拟浏览器正在执行的操作而不是直接发布。另外,我建议您使用Phantom JS与使用普通请求,因为Phantom JS具有完整的Web堆栈,这将更加真实地模拟浏览器请求。