刮一个使用cookies和fids的网站

时间:2015-02-22 20:29:10

标签: node.js cookies web-scraping

我正在努力抓this site。如果您点击county然后点击continue(如果您愿意,请选择州和/或年份),您将获得一张桌子。但是,该网站使用的是Cookie和隐藏字段,例如as_sfidas_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)。无论如何,我决定尝试所有组合,所有这些组合都会产生相同的结果。

1 个答案:

答案 0 :(得分:1)

您必须调用JS函数submitReport(),这是为每个锚标记定义的onclick操作,以模拟浏览器正在执行的操作而不是直接发布。另外,我建议您使用Phantom JS与使用普通请求,因为Phantom JS具有完整的Web堆栈,这将更加真实地模拟浏览器请求。