vampireneo/Book

View on GitHub
bookParser/Books.js

Summary

Maintainability
C
1 day
Test Coverage
var Q = require('q'),
  cheerio = require('cheerio'),
  request = require('request'),
  moment = require('moment');

exports.getByISBN = function(pISBN) {
  var domain = 'http://search.books.com.tw';
  var searchUrl = '/exep/prod_search.php?cat=BKA&key=';
  var bookObj = {};
  var deferred = Q.defer();

  //console.log("get url: " + domain + searchUrl + pISBN);
  request(domain + searchUrl + pISBN, function(error, response, body) {
    if (!error) {
      var $ = cheerio.load(body);
      var link = $('.result .item h3 a').eq(0);
      var targetUrl = $(link).attr('href');

      if (link.length > 0) {
        request(targetUrl, function(error, response, body) {
          if (!error) {
            $ = cheerio.load(body);
            bookObj.source = targetUrl;
            bookObj.Title = $(".main_wrap h1[itemprop='name']")
              .text()
              .trim();
            bookObj.SubTitle = $('.main_wrap h2')
              .text()
              .trim();
            bookObj.ImageUrl = $(".main_wrap .cover_img img[itemprop='image']")
              .attr('src')
              .replace(/http:\/\/.*\.book\.com\.tw\/image\/getImage\?i=/, '')
              .replace(/&v=.*/, '');
            bookObj.Author = $(
                ".main_wrap li[itemprop='author'] a[href*='search.books.com.tw']"
              )
              .text()
              .trim()
              .replace(/‧/g, '.');

            var infos = $('.main_wrap .type02_p003 li');
            for (var i = 0; i < infos.length; i++) {
              var text = infos
                .eq(i)
                .text()
                .split(':');
              if (text.length !== 2) {
                continue;
              }
              var title = text[0].replace(/\s/g, '').trim(),
                content = text[1]
                .trim()
                .replace(/\s+/g, ' ')
                .trim()
                .replace(/‧/g, '.');

              switch (title) {
                //原文作者
                //譯者
                case '出版社':
                  bookObj.Publisher = content;
                  break;
                case '出版日期':
                  bookObj.PublishDate = moment(content, 'YYYY/MM/DD').toDate();
                  break;
                case '語言':
                  bookObj.Language = content;
                  break;
              }
            }
            infos = $('.main_wrap .bd li');
            for (var j = 0; j < infos.length; j++) {
              var text2 = infos
                .eq(j)
                .text()
                .split(':');
              if (text2.length !== 2) {
                continue;
              }
              var title2 = text2[0].replace(/\s/g, '').trim(),
                content2 = text2[1]
                .trim()
                .replace(/\s+/g, ' ')
                .trim()
                .replace(/‧/g, '.');

              switch (title2) {
                case 'ISBN':
                  bookObj.ISBN = content2;
                  break;
                case '叢書系列':
                  bookObj.Series = content2;
                  break;
                case '規格':
                  var contents = content2.split('/');
                  bookObj.Spec = contents[0].trim();
                  bookObj.Pages = contents[1].replace('頁', '').trim();
                  break;
              }
            }

            if (bookObj.ISBN && bookObj.ISBN !== pISBN) {
              bookObj = {};
            }
            deferred.resolve(bookObj);
          } else {
            deferred.resolve(bookObj);
          }
        });
      } else {
        deferred.resolve(bookObj);
      }
    } else {
      deferred.resolve(bookObj);
    }
  });
  return deferred.promise;
};