我在试着抓取this site。如果单击county
,然后单击continue
(如果您喜欢,请选择一个州和/或年份),您将获得一个表。然而,该网站使用cookies和隐藏字段,如as_sfid
和as_fid
,这使得这不是直接的。我使用的是request module,据我所知,我正在为第二个请求捕获cookie和所需的formData,但我得到的html是一个错误页面,上面写着“对象已移动”。如果查看浏览器发出的请求,您将看到发出的另一个get请求没有收到响应。我试着把它放在当前的两个请求之间,以防万一,但这并没有改变任何事情。
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_fid中的一个(一个as_sfid和一个html)。无论如何,我决定尝试所有的组合,所有的组合都会产生相同的结果。
发布于 2015-03-07 03:25:09
您必须调用JS函数submitReport(),这是为每个锚标记定义的onclick操作,以模拟浏览器正在执行的操作,而不是直接执行post。此外,我建议您使用Phantom JS而不是使用普通请求,因为Phantom JS具有完整的web堆栈,这将更真实地模拟浏览器请求。
https://stackoverflow.com/questions/28662859
复制相似问题