close

目標

在node.js下使用cheerio以及request來讀取蘋果日報的RSS資訊

在http://www.appledaily.com.tw/rss這裡可以看到有提供的的即時新聞群組列表

而這次實作的目的就在於取得群組列表以及將指定列表中的資訊抓下來


appleRSS

實作

先使用Firebug確認要取得的條件後

經由以下的cheerio程式碼,就可以取得新聞總覽的所有列表以及其href連結資訊

apple.getRssList = function(req, res) {
    var rssList = [];
    request({
            uri: appleURL + '/rss',
            headers: {
                'User-Agent': 'Mozilla/5.0'
            }
        },
        function(error, response, html) {
            if (!error && response.statusCode == 200) {
                var $ = cheerio.load(html);
                $('.each_level .inst_all li a').each(function(i, element) {
                    rssList.push({
                        category: $(this).text(),
                        link: $(this).attr("href")
                    }); 
                }); 
                res.json(rssList);
            } else {
                res.statusCode = 404;
                res.json({
                    status: 'error',
                    message: 'fail to request'
                }); 
            }   
        }); 
};

然後,這裡的程式碼則可以根據所給訂的href連結取得RSS內的資訊

本來是想用cheerio來取得RSS中xml的資料,但試不出來,找了些資料發現可能跟CDATA這tag有關

嚐試了一陣子後,最後發現htmlparser2可以正確的讀取xml的資料,就改成使用htmlparser2來存取

apple.getTitleList = function(req, res) {
    request({
        uri: appleURL + rssLink,
        headers: {
            'User-Agent': 'Mozilla/5.0'
        }   
    }, function(error, response, html) {
        if (!error && response.statusCode == 200) {
            var titleList = []; 
            var title;
            var handler = new htmlparser.FeedHandler(function(error, feed) {
                if (error)
                    console.log(err)
                else {
                    console.log(feed.title);
                    console.log("There are " + feed.items.length + " items");
                    for (var i = 0; i < feed.items.length; i++) {
                        console.log(i + " " + feed.items[i].title);
                        titleList.push({
                            title: feed.items[i].title
                        }); 
                    }   
                    title = feed.title;
                }   
                res.json({
                    rssTitle: title,
                    titleList: titleList
                }); 
            }); 

            var parser = new htmlparser.Parser(handler, {
                decodeEntities: true,
                xmlMode: true
            }); 

            parser.write(html);
            parser.end();
        } else {
            res.json({
                status: 'error',
                message: 'fail to request'
            }); 
        }   
    }); 
}
arrow
arrow
    文章標籤
    cheerio node.js request
    全站熱搜

    Perry Wu 發表在 痞客邦 留言(0) 人氣()