0

现在,我正在做一些简单的网络抓取,例如获取一个火车站的当前火车到达/离开信息。这是示例链接http://www.thetrainline.com/Live/arrivals/chester,您可以通过此链接访问切斯特站当前到达的列车。

我正在使用 node.js 请求模块来做一些简单的网络抓取,

app.get('/railway/arrival', function (req, res, next) {
    console.log("/railway/arrival/  "+req.query["city"]);
    var city = req.query["city"];
    if(typeof city == undefined || city == undefined) { console.log("if it undefined"); city ="liverpool-james-street";}
    getRailwayArrival(city,
       function(err,data){
           res.send(data);
        }
       );
});

function getRailwayArrival(station,callback){
   request({
    uri: "http://www.thetrainline.com/Live/arrivals/"+station,
   }, function(error, response, body) {
      var $ = cheerio.load(body);

      var a = new Array();
      $(".results-contents li a").each(function() {
        var link = $(this);
        //var href = link.attr("href");
        var due = $(this).find('.due').text().replace(/(\r\n|\n|\r|\t)/gm,"");    
        var destination = $(this).find('.destination').text().replace(/(\r\n|\n|\r|\t)/gm,"");
        var on_time = $(this).find('.on-time-yes .on-time').text().replace(/(\r\n|\n|\r|\t)/gm,"");
        if(on_time == undefined)  var on_time_no = $(this).find('.on-time-no').text().replace(/(\r\n|\n|\r|\t)/gm,"");
        var platform = $(this).find('.platform').text().replace(/(\r\n|\n|\r|\t)/gm,"");

        var obj = new Object();
        obj.due = due;obj.destination = destination; obj.on_time = on_time; obj.platform = platform;
        a.push(obj);
console.log("arrival  ".green+due+"  "+destination+"  "+on_time+"  "+platform+"  "+on_time_no);       
    });
    console.log("get station data  "+a.length +"   "+ $(".updated-time").text());
    callback(null,a);

  });
}

代码通过给我一个数据列表来工作,但是这些数据与浏览器中看到的数据不同,尽管数据来自同一个 url。我不知道为什么会这样。是不是因为他们的服务器可以区分服务器和浏览器发送的请求,如果请求来自服务器,所以他们给我发送了错误的数据。我怎样才能克服这个问题?

提前致谢。

4

2 回答 2

0

他们必须存储每个点击事件的会话。意味着如果您第一次访问该页面,它将存储会话并验证该会话以供您执行下一个操作。说,你从下拉列表中选择一些值。对于再次单击,将生成会话的新值,该值将为您选择的组合框值加载数据。然后您单击显示列表,然后验证先前的会话值并获得准确的数据。

现在看,如果您没有以编程方式捕获该会话值并且没有将该请求作为参数传递,您将获得默认加载的数据或没有得到任何东西。因此,聊天数据对您来说具有挑战性。使用萤火虫寻求帮助。

于 2013-04-03T10:58:48.313 回答
0

这里的另一个问题可能是生成的内容是通过在您的机器上运行的 JavaScript 发生的。jsdom 是一个提供此类内容但不是轻量级的模块。

Cheerio 不执行这些脚本,因此内容可能不可见(正如您所遇到的那样)。这是我前段时间读到的一篇文章,也让我有同样的发现,直接打开文章搜索“jsdom 更强大”即可快速获得答案:

http://encosia.com/cheerio-faster-windows-friendly-alternative-jsdom/

于 2013-04-03T14:43:59.670 回答