app-store-scraper
Advanced tools
Comparing version 0.8.0 to 0.9.0
@@ -8,4 +8,37 @@ 'use strict'; | ||
const parseString = require('xml2js').parseString; | ||
function cleanList (results) { | ||
const reviews = results.feed.entry || []; | ||
return reviews.slice(1).map((review) => ({ | ||
id: review.id.label, | ||
userName: review.author.name.label, | ||
userUrl: review.author.uri.label, | ||
version: review['im:version'].label, | ||
score: parseInt(review['im:rating'].label), | ||
title: review.title.label, | ||
text: review.content.label, | ||
url: review.link.attributes.href | ||
})); | ||
} | ||
const reviews = (opts) => new Promise((resolve) => { | ||
validate(opts); | ||
if (opts.id) { | ||
resolve(opts.id); | ||
} else if (opts.appId) { | ||
resolve(app(opts).then(app => app.id)); | ||
} | ||
}) | ||
.then((id) => { | ||
opts = opts || {}; | ||
opts.sort = opts.sort || c.sort.RECENT; | ||
opts.page = opts.page || 1; | ||
opts.country = opts.country || 'us'; | ||
const url = `https://itunes.apple.com/${opts.country}/rss/customerreviews/page=${opts.page}/id=${id}/sortby=${opts.sort}/json`; | ||
return common.request(url); | ||
}) | ||
.then(JSON.parse) | ||
.then(cleanList); | ||
function validate (opts) { | ||
@@ -20,62 +53,11 @@ if (!opts.id && !opts.appId) { | ||
if (opts.page && opts.page < 0) { | ||
throw new Error('Page cannot be lower than 0'); | ||
if (opts.page && opts.page < 1) { | ||
throw new Error('Page cannot be lower than 1'); | ||
} | ||
if (opts.page && opts.page > 9) { | ||
throw new Error('Page cannot be greater than 9'); | ||
if (opts.page && opts.page > 10) { | ||
throw new Error('Page cannot be greater than 10'); | ||
} | ||
} | ||
function parseXML (string) { | ||
return new Promise(function (resolve, reject) { | ||
return parseString(string, (err, res) => { | ||
if (err) { | ||
reject(err); | ||
return; | ||
} | ||
resolve(res); | ||
}); | ||
}); | ||
} | ||
function extractReviews (xml) { | ||
const toJSON = (item) => { | ||
return { | ||
id: item.id[0], | ||
date: (new Date(item.updated[0])), | ||
userName: item.author[0].name[0], | ||
userUrl: item.author[0].uri[0], | ||
version: item['im:version'][0], | ||
score: parseInt(item['im:rating'][0]), | ||
title: item.title[0], | ||
text: item.content[0]['_'], | ||
url: item.link[0].$.href | ||
}; | ||
}; | ||
const list = xml.feed.entry || []; | ||
return list.slice(1).map(toJSON); | ||
} | ||
const reviews = (opts) => new Promise((resolve) => { | ||
validate(opts); | ||
if (opts.id) { | ||
resolve(opts.id); | ||
} else if (opts.appId) { | ||
resolve(app(opts).then(app => app.id)); | ||
} | ||
}) | ||
.then((id) => { | ||
opts = opts || {}; | ||
opts.sort = opts.sort || c.sort.RECENT; | ||
opts.page = (opts.page + 1) || 1; | ||
opts.country = opts.country || 'us'; | ||
const url = `https://itunes.apple.com/${opts.country}/rss/customerreviews/id=${id}/sortby=${opts.sort}/page=${opts.page}/xml`; | ||
return common.request(url); | ||
}) | ||
.then(parseXML) | ||
.then(extractReviews); | ||
module.exports = reviews; |
{ | ||
"name": "app-store-scraper", | ||
"version": "0.8.0", | ||
"version": "0.9.0", | ||
"description": "scrape data from the itunes app store", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -258,3 +258,2 @@ # app-store-scraper [](http://travis-ci.org/facundoolano/app-store-scraper) | ||
[ { id: '1472864600', | ||
date: '2017-03-08T08:08:00.000Z', | ||
userName: 'Linda D. Lopez', | ||
@@ -268,3 +267,2 @@ userUrl: 'https://itunes.apple.com/us/reviews/id324568166', | ||
{ id: '1472864708', | ||
date: '2017-02-08T08:08:00.000Z', | ||
userName: 'Jennamaxkidd', | ||
@@ -271,0 +269,0 @@ userUrl: 'https://itunes.apple.com/us/reviews/id223990784', |
@@ -10,4 +10,2 @@ 'use strict'; | ||
assert(review.id); | ||
assert(review.date); | ||
assert.instanceOf(review.date, Date); | ||
assert.isString(review.userName); | ||
@@ -43,7 +41,7 @@ assert(review.userName); | ||
id: '553834731', | ||
page: 10 | ||
page: 11 | ||
}) | ||
.then(assert.fail) | ||
.catch((e) => assert.equal(e.message, 'Page cannot be greater than 9')); | ||
.catch((e) => assert.equal(e.message, 'Page cannot be greater than 10')); | ||
}); | ||
}); |
33141
734
295