market_bot 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -82,6 +82,9 @@ namespace :spec do
82
82
 
83
83
  download('https://market.android.com/details?id=apps_topselling_paid&cat=ARCADE&start=1000&num=24',
84
84
  File.join(File.dirname(__FILE__), 'spec', 'market_bot', 'android', 'data', 'leaderboard-apps_topselling_paid-page4.txt'))
85
+
86
+ download('https://market.android.com/details?id=apps_editors_choice',
87
+ File.join(File.dirname(__FILE__), 'spec', 'market_bot', 'android', 'data', 'leaderboard-apps_editors_choice.txt'))
85
88
  end
86
89
  end
87
90
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
@@ -6,6 +6,14 @@ module MarketBot
6
6
  attr_reader :hydra
7
7
 
8
8
  def self.parse(html)
9
+ if html.include?('<title>Editors&#39; Choice - Android Market</title>')
10
+ parse_editors_choice_page(html)
11
+ else
12
+ parse_normal_page(html)
13
+ end
14
+ end
15
+
16
+ def self.parse_normal_page(html)
9
17
  results = []
10
18
  doc = Nokogiri::HTML(html)
11
19
 
@@ -35,6 +43,26 @@ module MarketBot
35
43
  results
36
44
  end
37
45
 
46
+ def self.parse_editors_choice_page(html)
47
+ results = []
48
+
49
+ doc = Nokogiri::HTML(html)
50
+
51
+ doc.css('.fsg-snippet').each do |snippet_node|
52
+ result = {}
53
+
54
+ result[:title] = snippet_node.css('.title').text
55
+ result[:price_usd] = nil
56
+ result[:developer] = snippet_node.css('.goog-inline-block').text
57
+ result[:market_id] = snippet_node.attributes['data-docid'].text
58
+ result[:market_url] = "https://market.android.com/details?id=#{result[:market_id]}"
59
+
60
+ results << result
61
+ end
62
+
63
+ results
64
+ end
65
+
38
66
  def initialize(identifier, category=nil, options={})
39
67
  @identifier = identifier
40
68
  @category = category
@@ -63,16 +91,21 @@ module MarketBot
63
91
  end
64
92
 
65
93
  def enqueue_update(options={})
66
- min_rank = options[:min_rank] || 1
67
- max_rank = options[:max_rank] || 500
94
+ if @identifier.to_s.downcase == 'apps_editors_choice' && category == nil
95
+ url = 'https://market.android.com/details?id=apps_editors_choice'
96
+ process_page(url, 1)
97
+ else
98
+ min_rank = options[:min_rank] || 1
99
+ max_rank = options[:max_rank] || 500
68
100
 
69
- min_page = rank_to_page(min_rank)
70
- max_page = rank_to_page(max_rank)
101
+ min_page = rank_to_page(min_rank)
102
+ max_page = rank_to_page(max_rank)
71
103
 
72
- @parsed_results = []
104
+ @parsed_results = []
73
105
 
74
- urls = market_urls(:min_page => min_page, :max_page => max_page)
75
- urls.each_index{ |i| process_page(urls[i], i+1) }
106
+ urls = market_urls(:min_page => min_page, :max_page => max_page)
107
+ urls.each_index{ |i| process_page(urls[i], i+1) }
108
+ end
76
109
 
77
110
  self
78
111
  end
data/market_bot.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "market_bot"
8
- s.version = "0.1.5"
8
+ s.version = "0.1.6"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Chad Remesch"]
12
- s.date = "2011-10-22"
12
+ s.date = "2011-10-26"
13
13
  s.description = "Market Bot is a high performance Ruby scraper for Google's Android Market with a simple to use API. It is built on top of Nokogiri and Typhoeus."
14
14
  s.email = "chad@remesch.com"
15
15
  s.extra_rdoc_files = [
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  "spec/market_bot/android/data/app_1.txt",
36
36
  "spec/market_bot/android/data/app_2.txt",
37
37
  "spec/market_bot/android/data/app_3.txt",
38
+ "spec/market_bot/android/data/leaderboard-apps_editors_choice.txt",
38
39
  "spec/market_bot/android/data/leaderboard-apps_topselling_paid-page1.txt",
39
40
  "spec/market_bot/android/data/leaderboard-apps_topselling_paid-page2.txt",
40
41
  "spec/market_bot/android/data/leaderboard-apps_topselling_paid-page3.txt",
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html><!--
2
+ Content-type: Preventing MHTML XSS in IE.
3
+
4
+ --><html><head><script type="text/javascript">function a(c){this.t={};this.tick=function(c,e,b){b=b!=void 0?b:(new Date).getTime();this.t[c]=[b,e]};this.tick("start",null,c)}var d=new a;window.jstiming={Timer:a,load:d};try{var f=null;window.chrome&&window.chrome.csi&&(f=Math.floor(window.chrome.csi().pageT));f==null&&window.gtbExternal&&(f=window.gtbExternal.pageT());f==null&&window.external&&(f=window.external.pageT);f&&(window.jstiming.pt=f)}catch(g){};
5
+ </script>
6
+ <title>Editors&#39; Choice - Android Market</title><link rel="stylesheet" href="/static/client/css/1199136287-site_css_ltr.css">
7
+ <meta name="Description" content="Discover the latest apps and games. Purchase and enjoy instantly on your Android phone or tablet."><link rel="shortcut icon" href="/static/client/images/favicon.ico"><style type="text/css">body, .stripes, .app-icon {background-image: url(/static/client/images/background-stripes.gif);}.star-on-img {background-image: url(/static/client/images/star-on.png);}.star-off-img {background-image: url(/static/client/images/star-off.png);}.star-on-dark-img {background-image: url(/static/client/images/star-on-dark.png);}.star-off-dark-img {background-image: url(/static/client/images/star-off-dark.png);}.star-half-dark-img {background-image: url(/static/client/images/star-half-dark.png);}.toggle-button {background-image: url(/static/client/images/toggle-button.png);}#super-tooltip-arrow {background-image: url(/static/client/images/tooltip-arrows.png);}.big-number {background-image: url(/static/client/images/ordered-list-circle.gif);}.search-summary {background-image:url(/static/client/images/search-header.gif);}.search-filters-toggle {background-image:url(/static/client/images/search-filters-notch.gif);}.doc-header-content, .page-banner-heading {background-image:url(/static/client/images/app-header-stripes.gif);}.mylibrary-page .page-banner-heading, .purchases-page .page-banner-heading, .doc-banner-container, .doc-banner-container-header {background-image:url(/static/client/images/dark-background-stripes.gif);}.books .doc-header-content, .books .page-banner-heading, .books .promo-page-banner-spacer {background-image:url(/static/client/images/book-header-stripes.gif);}.movies .doc-header-content, .movies .page-banner-heading {background-image:url(/static/client/images/movie-header-stripes.gif);}.page-banner-icon {background-image:url(/static/client/images/little_droid.png);}.books .page-banner-icon {background-image:url(/static/client/images/little-book.png);}.movies .page-banner-icon {background-image:url(/static/client/images/little-film.png);}.book-icon {background-image:url(/static/client/images/book-icon-background.png);}.apps .carousel-heading-wrapper {background-image:url(/static/client/images/app-carousel-icon.png);}.corpus-selector .apps .corpus-item {background-image:url(/static/client/images/app-carousel-icon-r.png);}.books .carousel-heading-wrapper {background-image:url(/static/client/images/book-carousel-icon.png);}.corpus-selector .books .corpus-item {background-image:url(/static/client/images/book-carousel-icon-r.png);}.movies .carousel-heading-wrapper {background-image:url(/static/client/images/movie-carousel-icon.png);}.corpus-selector .movies .corpus-item {background-image:url(/static/client/images/movie-carousel-icon-r.png);}.promo-thumbnail-splash {background-image:url(/static/client/images/promo-image-texture.gif);}.fsg-page-banner-wrapper {background-image:url(/static/client/images/dots-6x6.png);}.co-dialog-loading, .frag-loading-icon, .my-library-filter-loading-icon, .num-pagination-loading-icon, .sort-order-loading-icon, .co-dialog-img-waiting {background-image: url(/static/client/images/spinner.gif);}.goog-flat-menu-button-dropdown {background-image:url(/static/client/images/dropdown-triangle.png);}.co-dialog-header-logo, .rap-dialog-header-logo {background-image:url(/static/client/images/android-market-logo-checkout.png);}.modal-dialog-title-close {background-image: url(/static/client/images/green_close_x.png);}.odd-track {background-image:url(/static/client/images/dots.png);}.co-dialog-img-error {background-image: url(/static/client/images/warning-yield.png);}.co-dialog-selected, .co-dialog-img-ok {background-image: url(/static/client/images/checkmark.png);}.super-promo {background-image: url(/static/client/images/promo-background.png);}.tweet-button {background-image: url(/static/client/images/tweet.png);}</style><script src="https://checkout.google.com/customer/gadget/embeddedbuy.js?divId=checkout-root&copyrightFooterDivId=checkout-footer&hl=en_US&gl=US"></script><link rel="canonical" href="https://market.android.com/details?id=apps_editors_choice" /><link rel="alternate" hreflang="cs" href="https://market.android.com/details?id=apps_editors_choice&hl=cs" /><link rel="alternate" hreflang="da" href="https://market.android.com/details?id=apps_editors_choice&hl=da" /><link rel="alternate" hreflang="de" href="https://market.android.com/details?id=apps_editors_choice&hl=de" /><link rel="alternate" hreflang="en" href="https://market.android.com/details?id=apps_editors_choice&hl=en" /><link rel="alternate" hreflang="es" href="https://market.android.com/details?id=apps_editors_choice&hl=es" /><link rel="alternate" hreflang="es_419" href="https://market.android.com/details?id=apps_editors_choice&hl=es_419" /><link rel="alternate" hreflang="fr" href="https://market.android.com/details?id=apps_editors_choice&hl=fr" /><link rel="alternate" hreflang="it" href="https://market.android.com/details?id=apps_editors_choice&hl=it" /><link rel="alternate" hreflang="nl" href="https://market.android.com/details?id=apps_editors_choice&hl=nl" /><link rel="alternate" hreflang="no" href="https://market.android.com/details?id=apps_editors_choice&hl=no" /><link rel="alternate" hreflang="pl" href="https://market.android.com/details?id=apps_editors_choice&hl=pl" /><link rel="alternate" hreflang="pt_BR" href="https://market.android.com/details?id=apps_editors_choice&hl=pt_BR" /><link rel="alternate" hreflang="pt_PT" href="https://market.android.com/details?id=apps_editors_choice&hl=pt_PT" /><link rel="alternate" hreflang="fi" href="https://market.android.com/details?id=apps_editors_choice&hl=fi" /><link rel="alternate" hreflang="sv" href="https://market.android.com/details?id=apps_editors_choice&hl=sv" /><link rel="alternate" hreflang="tr" href="https://market.android.com/details?id=apps_editors_choice&hl=tr" /><link rel="alternate" hreflang="el" href="https://market.android.com/details?id=apps_editors_choice&hl=el" /><link rel="alternate" hreflang="ru" href="https://market.android.com/details?id=apps_editors_choice&hl=ru" /><link rel="alternate" hreflang="ko" href="https://market.android.com/details?id=apps_editors_choice&hl=ko" /><link rel="alternate" hreflang="zh_CN" href="https://market.android.com/details?id=apps_editors_choice&hl=zh_CN" /><link rel="alternate" hreflang="zh_TW" href="https://market.android.com/details?id=apps_editors_choice&hl=zh_TW" /><link rel="alternate" hreflang="ja" href="https://market.android.com/details?id=apps_editors_choice&hl=ja" /></head><body dir="ltr"><style type="text/css">#gbar,#guser{font-size:13px;padding-top:0 !important}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}</style><script>var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-19995902-1']); _gaq.push(['_trackPageLoadTime']); _gaq.push(['_trackPageview']); (function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();</script><script src="https://apis.google.com/js/plusone.js">{"lang": "en_US"}</script><div id="gbar-header"><div id=gbar><nobr><a class=gb1 href="http://www.google.com/webhp?hl=en">Web</a> <a class=gb1 href="http://www.google.com/imghp?hl=en">Images</a> <a class=gb1 href="http://video.google.com/?hl=en">Videos</a> <a class=gb1 href="http://maps.google.com/maps?hl=en">Maps</a> <a class=gb1 href="http://news.google.com/nwshp?hl=en">News</a> <a class=gb1 href="http://www.google.com/prdhp?hl=en">Shopping</a> <a class=gb1 href="https://mail.google.com/mail/">Gmail</a> <a class=gb1 style="text-decoration:none" href="http://www.google.com/intl/en/options/"><u>More</u> &raquo;</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe><a href="/account" class=gb4>My Market Account</a> | </span><a id=gb_70 href="https://www.google.com/accounts/ServiceLogin?service=androidmarket&passive=86400&continue=https://market.android.com/details?id%3Dapps_editors_choice&followup=https://market.android.com/details?id%3Dapps_editors_choice" class=gb4>Sign in</a></nobr></div></div><div class="g-doc-1026 doc-content editorial-container-page-fsg editors-choice apps"><div id="header"><div id="main-header" class="g-section g-tpl-33-67 g-split"><div class="g-unit g-first"><a href="/" id="logo">Android Market</a></div><div class="g-unit"><div class="g-section g-tpl-67-33 g-split"><div class="g-unit g-first" style="text-align:right"><ul id="top-nav" class="top-nav"><li class="goog-inline-block top-nav-tab top-nav-tab-selected"><a href="/apps" class="top-nav-tab-apps">Apps</a><div class="top-nav-arrow"><div class="down-arrow"></div></div><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/apps/GAME">Games</a><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/apps/ARCADE">Arcade &amp; Action</a></li><li class="top-nav-sub-item "><a href="/apps/BRAIN">Brain &amp; Puzzle</a></li><li class="top-nav-sub-item "><a href="/apps/CARDS">Cards &amp; Casino</a></li><li class="top-nav-sub-item "><a href="/apps/CASUAL">Casual</a></li><li class="top-nav-sub-item "><a href="/apps/GAME_WALLPAPER">Live Wallpaper</a></li><li class="top-nav-sub-item "><a href="/apps/RACING">Racing</a></li><li class="top-nav-sub-item "><a href="/apps/SPORTS_GAMES">Sports Games</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/apps/GAME_WIDGETS">Widgets</a></li></ul></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/apps/APPLICATION">Applications</a><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/apps/BOOKS_AND_REFERENCE">Books &amp; Reference</a></li><li class="top-nav-sub-item "><a href="/apps/BUSINESS">Business</a></li><li class="top-nav-sub-item "><a href="/apps/COMICS">Comics</a></li><li class="top-nav-sub-item "><a href="/apps/COMMUNICATION">Communication</a></li><li class="top-nav-sub-item "><a href="/apps/EDUCATION">Education</a></li><li class="top-nav-sub-item "><a href="/apps/ENTERTAINMENT">Entertainment</a></li><li class="top-nav-sub-item "><a href="/apps/FINANCE">Finance</a></li><li class="top-nav-sub-item "><a href="/apps/HEALTH_AND_FITNESS">Health &amp; Fitness</a></li><li class="top-nav-sub-item "><a href="/apps/LIBRARIES_AND_DEMO">Libraries &amp; Demo</a></li><li class="top-nav-sub-item "><a href="/apps/LIFESTYLE">Lifestyle</a></li><li class="top-nav-sub-item "><a href="/apps/APP_WALLPAPER">Live Wallpaper</a></li><li class="top-nav-sub-item "><a href="/apps/MEDIA_AND_VIDEO">Media &amp; Video</a></li><li class="top-nav-sub-item "><a href="/apps/MEDICAL">Medical</a></li><li class="top-nav-sub-item "><a href="/apps/MUSIC_AND_AUDIO">Music &amp; Audio</a></li><li class="top-nav-sub-item "><a href="/apps/NEWS_AND_MAGAZINES">News &amp; Magazines</a></li><li class="top-nav-sub-item "><a href="/apps/PERSONALIZATION">Personalization</a></li><li class="top-nav-sub-item "><a href="/apps/PHOTOGRAPHY">Photography</a></li><li class="top-nav-sub-item "><a href="/apps/PRODUCTIVITY">Productivity</a></li><li class="top-nav-sub-item "><a href="/apps/SHOPPING">Shopping</a></li><li class="top-nav-sub-item "><a href="/apps/SOCIAL">Social</a></li><li class="top-nav-sub-item "><a href="/apps/SPORTS">Sports</a></li><li class="top-nav-sub-item "><a href="/apps/TOOLS">Tools</a></li><li class="top-nav-sub-item "><a href="/apps/TRANSPORTATION">Transportation</a></li><li class="top-nav-sub-item "><a href="/apps/TRAVEL_AND_LOCAL">Travel &amp; Local</a></li><li class="top-nav-sub-item "><a href="/apps/WEATHER">Weather</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/apps/APP_WIDGETS">Widgets</a></li></ul></li></ul></li><li class="goog-inline-block top-nav-tab "><a href="/movies" class="top-nav-tab-movies">Movies</a><div class="top-nav-arrow"><div class="down-arrow"></div></div><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/movies/1">Action &amp; Adventure</a></li><li class="top-nav-sub-item "><a href="/movies/2">Animation &amp; Cartoons</a></li><li class="top-nav-sub-item "><a href="/movies/4">Comedy</a></li><li class="top-nav-sub-item "><a href="/movies/6">Drama</a></li><li class="top-nav-sub-item "><a href="/movies/7">Documentary</a></li><li class="top-nav-sub-item "><a href="/movies/8">Family</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/movies/10">Horror</a></li></ul></li><li class="goog-inline-block top-nav-tab "><a href="/books" class="top-nav-tab-books">Books</a><div class="top-nav-arrow"><div class="down-arrow"></div></div><ul class="top-nav-sub"><li class="top-nav-sub-item "><a href="/books/coll_1204">Biographies &amp; Memoirs</a></li><li class="top-nav-sub-item "><a href="/books/coll_1205">Business &amp; Investing</a></li><li class="top-nav-sub-item "><a href="/books/coll_1206">Children&#39;s Books</a></li><li class="top-nav-sub-item "><a href="/books/coll_1207">Computers &amp; Internet</a></li><li class="top-nav-sub-item "><a href="/books/coll_1208">Cooking, Food &amp; Wine</a></li><li class="top-nav-sub-item "><a href="/books/coll_1221">Fantasy</a></li><li class="top-nav-sub-item "><a href="/books/coll_1200">Fiction</a></li><li class="top-nav-sub-item "><a href="/books/coll_1209">History</a></li><li class="top-nav-sub-item "><a href="/books/coll_1210">Humor</a></li><li class="top-nav-sub-item "><a href="/books/coll_1211">Lifestyle &amp; Home</a></li><li class="top-nav-sub-item "><a href="/books/coll_1213">Mystery &amp; Thrillers</a></li><li class="top-nav-sub-item "><a href="/books/coll_1214">Parenting &amp; Families</a></li><li class="top-nav-sub-item "><a href="/books/coll_1215">Politics &amp; Current Events</a></li><li class="top-nav-sub-item "><a href="/books/coll_1216">Reference</a></li><li class="top-nav-sub-item "><a href="/books/coll_1217">Religion &amp; Spirituality</a></li><li class="top-nav-sub-item "><a href="/books/coll_1218">Romance</a></li><li class="top-nav-sub-item "><a href="/books/coll_1219">Science</a></li><li class="top-nav-sub-item "><a href="/books/coll_1220">Science Fiction</a></li><li class="top-nav-sub-item "><a href="/books/coll_1222">Sports</a></li><li class="top-nav-sub-item top-nav-sub-item-last"><a href="/books/coll_1224">Travel</a></li></ul></li><li class="goog-inline-block top-nav-tab top-nav-tab-last"><a href="/mylibrary" class="top-nav-tab-myLibrary">My Library</a></li></ul></div><div class="g-unit"><form action="/search" method="get" id="search-box" class="goog-inline-block"><input id="search-text" type="text" autocomplete="off" class="form-text-box no-focus" data-suggestServerUrl="https://market.android.com/suggest/SuggRequest?json=1" data-suggestServerType="apps" placeholder="Search" name="q" value=""><input id="search-button" type="submit" class="form-primary-button no-focus" tabindex="-1" value=""><input type=hidden name="so" value="1"/><input type=hidden name="c" value="apps"/></form></div></div></div></div><div id="alerts-bar" class="butter-bar" style="display:none"><span id="alerts-bar-contents"></span></div></div><div class="page-content"><div class="fsg-page-banner-wrapper"><div class="fsg-page-banner"style="background-image: url('https://g0.gstatic.com/android/market_images/editorial/editors-choice-header.jpg')"><div class="fsg-page-banner-heading"><div class="promo-page-banner-spacer"></div><h1 class="page-banner-text">Editors&#39; Choice</h1></div></div></div><div class="fsg-description">Here are some of the best apps on Android Market, as chosen by our staff. From games to everyday tools and entertainment apps, we highly recommend you try these out!</div><div class="fsg-container"><table><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.ArtInGames.AirAttackHDLite"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.ArtInGames.AirAttackHDLite&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/airattack.jpg" alt="Air Attack HD"/></a></div><a data-a="1" data-c="1" href="/details?id=com.ArtInGames.AirAttackHDLite&feature=editorial-apps_editors_choice"><span class="title">Air Attack HD</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Art+In+Games">Art In Games</a></div></span><div class="description">A white-knuckled air attack into enemy territory... while on your coffee break.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.rovio.angrybirdsrio"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.rovio.angrybirdsrio&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_angrybirds.png" alt="Angry Birds Rio"/></a></div><a data-a="1" data-c="1" href="/details?id=com.rovio.angrybirdsrio&feature=editorial-apps_editors_choice"><span class="title">Angry Birds Rio</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Rovio+Mobile+Ltd.">Rovio Mobile Ltd.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Warning: This sequel to the infamous original may cause you to spend hours &amp; hours of your life slinging birds. Again.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.bithack.apparatus"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.bithack.apparatus&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_apparatus.png" alt="Apparatus"/></a></div><a data-a="1" data-c="1" href="/details?id=com.bithack.apparatus&feature=editorial-apps_editors_choice"><span class="title">Apparatus</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Bithack">Bithack</a></div></span><div class="description">Recipe for fun: Start with a strangely addictive puzzle game. Add realistic physics. Top with stunning graphics.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.levelup.beautifulwidgets"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.levelup.beautifulwidgets&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_beautifulwidgets.png" alt="Beautiful Widgets"/></a></div><a data-a="1" data-c="1" href="/details?id=com.levelup.beautifulwidgets&feature=editorial-apps_editors_choice"><span class="title">Beautiful Widgets</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=LevelUp+Studio">LevelUp Studio</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Checking the weather never looked so good! Hundreds of customizable options for your Android phone!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.glu.android.bugvillage"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.glu.android.bugvillage&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_bugvillage.png" alt="Bug Village"/></a></div><a data-a="1" data-c="1" href="/details?id=com.glu.android.bugvillage&feature=editorial-apps_editors_choice"><span class="title">Bug Village</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Glu+Mobile">Glu Mobile</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Keep your bugs happy and they&#39;ll help you build a beautiful, 3-D colony.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.silvertree.cordy"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.silvertree.cordy&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_cordy.png" alt="Cordy"/></a></div><a data-a="1" data-c="1" href="/details?id=com.silvertree.cordy&feature=editorial-apps_editors_choice"><span class="title">Cordy</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=SilverTree+Media">SilverTree Media</a></div></span><div class="description">A little robot that you&#39;ve gotta love. Features true 3-D gameplay and incredible graphics.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.doubleTwist.androidPlayerProKey"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.doubleTwist.androidPlayerProKey&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_doubletwist.png" alt="doubleTwist AirSync"/></a></div><a data-a="1" data-c="1" href="/details?id=com.doubleTwist.androidPlayerProKey&feature=editorial-apps_editors_choice"><span class="title">doubleTwist AirSync</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=doubleTwist+%E2%84%A2">doubleTwist ™</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Get the digital music from your computer onto your Android...with no wires!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.endomondo.android.pro"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.endomondo.android.pro&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/endomondo.jpg" alt="Endomondo Pro"/></a></div><a data-a="1" data-c="1" href="/details?id=com.endomondo.android.pro&feature=editorial-apps_editors_choice"><span class="title">Endomondo Pro</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Endomondo">Endomondo</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Get your own personal trainer without personal trainer prices.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.espn.score_center"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.espn.score_center&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_espn.png" alt="ESPN ScoreCenter"/></a></div><a data-a="1" data-c="1" href="/details?id=com.espn.score_center&feature=editorial-apps_editors_choice"><span class="title">ESPN ScoreCenter</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=ESPN+Inc">ESPN Inc</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Its like having the whole SportsCenter crew in your pocket.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.evernote"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.evernote&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/evernote.jpg" alt="Evernote"/></a></div><a data-a="1" data-c="1" href="/details?id=com.evernote&feature=editorial-apps_editors_choice"><span class="title">Evernote</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Evernote+Corp.">Evernote Corp.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Elephants never forget, neither does Evernote. Take notes, capture photos and record memos with this memory enhancer.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.facebook.katana"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.facebook.katana&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/facebook.jpg" alt="Facebook"/></a></div><a data-a="1" data-c="1" href="/details?id=com.facebook.katana&feature=editorial-apps_editors_choice"><span class="title">Facebook</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Facebook">Facebook</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Because your Facebook news feed is more important than the &quot;real&quot; news.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.subatomicstudios"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.subatomicstudios&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_fieldrunners.png" alt="Field Runners HD"/></a></div><a data-a="1" data-c="1" href="/details?id=com.subatomicstudios&feature=editorial-apps_editors_choice"><span class="title">Field Runners HD</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Subatomic+Studios,+LLC">Subatomic Studios, LLC</a></div></span><div class="description">The next generation tower defense game...classic gameplay with HD graphics and incredible animation.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="net.flixster.android"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=net.flixster.android&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/flixster.jpg" alt="Flixster"/></a></div><a data-a="1" data-c="1" href="/details?id=net.flixster.android&feature=editorial-apps_editors_choice"><span class="title">Flixster</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Flixster+Inc.">Flixster Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Having trouble figuring out what movie to see? Flixster has you covered with the latest movie reviews, trailers, and showtimes - all for free!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.joelapenna.foursquared"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.joelapenna.foursquared&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/foursquare.jpg" alt="Foursquare"/></a></div><a data-a="1" data-c="1" href="/details?id=com.joelapenna.foursquared&feature=editorial-apps_editors_choice"><span class="title">Foursquare</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=foursquare">foursquare</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Makes checking in on Android a snap. Discover what is going on in the world around you!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.glympse.android.glympse"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.glympse.android.glympse&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_glympse.png" alt="Glympse"/></a></div><a data-a="1" data-c="1" href="/details?id=com.glympse.android.glympse&feature=editorial-apps_editors_choice"><span class="title">Glympse</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Share+your+where">Share your where</a></div></span><div class="description">Location based sharing...where you control exactly who can see where you are and when they can see you.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.google.android.apps.maps"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.google.android.apps.maps&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/googlemaps.jpg" alt="Google Maps"/></a></div><a data-a="1" data-c="1" href="/details?id=com.google.android.apps.maps&feature=editorial-apps_editors_choice"><span class="title">Google Maps</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Google+Inc.">Google Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Doesn&#39;t matter if you type it or say it, Google Maps will find it and get you there.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.glu.android.gunbros_free"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.glu.android.gunbros_free&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_gunbros.png" alt="Gun bros"/></a></div><a data-a="1" data-c="1" href="/details?id=com.glu.android.gunbros_free&feature=editorial-apps_editors_choice"><span class="title">Gun bros</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Glu+Mobile">Glu Mobile</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Help Percy and Francis save the planet without getting off the couch.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.com2us.HB3D"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.com2us.HB3D&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/homerunbattle3d.jpg" alt="HomeRun Battle 3D"/></a></div><a data-a="1" data-c="1" href="/details?id=com.com2us.HB3D&feature=editorial-apps_editors_choice"><span class="title">HomeRun Battle 3D</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Com2uS">Com2uS</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Never made it to the big leagues? Who cares? It&#39;s your turn to hit it out of the park!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.imdb.mobile"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.imdb.mobile&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_imdb.png" alt="IMdb"/></a></div><a data-a="1" data-c="1" href="/details?id=com.imdb.mobile&feature=editorial-apps_editors_choice"><span class="title">IMdb</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=IMDb">IMDb</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">End the &quot;who starred in that movie&quot; arguments for good. With IMdb you can become a film and TV know-it-all.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.amazon.kindle"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.amazon.kindle&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/kindle.jpg" alt="Kindle for Android"/></a></div><a data-a="1" data-c="1" href="/details?id=com.amazon.kindle&feature=editorial-apps_editors_choice"><span class="title">Kindle for Android</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Amazon+Mobile">Amazon Mobile</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Whether Twain or Twilight, the world&#39;s library is at your fingertips.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.mint"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.mint&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/mint.jpg" alt="Mint.com Personal Finance"/></a></div><a data-a="1" data-c="1" href="/details?id=com.mint&feature=editorial-apps_editors_choice"><span class="title">Mint.com Personal Finance</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Intuit+Inc">Intuit Inc</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Manage your personal finances from a slick app that&#39;s always with you. Staying on budget has never been easier!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.bamnetworks.mobile.android.gameday.atbat2011.full"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.bamnetworks.mobile.android.gameday.atbat2011.full&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/mlbatbat.jpg" alt="MLB at Bat 11"/></a></div><a data-a="1" data-c="1" href="/details?id=com.bamnetworks.mobile.android.gameday.atbat2011.full&feature=editorial-apps_editors_choice"><span class="title">MLB at Bat 11</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=MLB+Advanced+Media,+L.P.">MLB Advanced Media, L.P.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Eat, breathe and sleep baseball. Baseball! Baseball! Baseball!</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.dualboot.apps.beach"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.dualboot.apps.beach&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_mybeach.png" alt="My Beach HD"/></a></div><a data-a="1" data-c="1" href="/details?id=com.dualboot.apps.beach&feature=editorial-apps_editors_choice"><span class="title">My Beach HD</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=DualBoot+Games">DualBoot Games</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Breathe the sea air, get sand in your toes...every time you use your phone</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.netgate"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.netgate&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_pageonce.png" alt="PageOnce - Money &amp; Bills"/></a></div><a data-a="1" data-c="1" href="/details?id=com.netgate&feature=editorial-apps_editors_choice"><span class="title">PageOnce - Money &amp; Bills</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Pageonce">Pageonce</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Keep on budget when you are on the go! Like a financial assistant on your phone.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.larvalabs.photowall"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.larvalabs.photowall&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/photowall.jpg" alt="PhotoWall"/></a></div><a data-a="1" data-c="1" href="/details?id=com.larvalabs.photowall&feature=editorial-apps_editors_choice"><span class="title">PhotoWall</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Larva+Labs+Ltd.">Larva Labs Ltd.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Remake your phone in your own image with this personalized wallpaper app.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.alphonso.pulse"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.alphonso.pulse&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/pulse.jpg" alt="Pulse"/></a></div><a data-a="1" data-c="1" href="/details?id=com.alphonso.pulse&feature=editorial-apps_editors_choice"><span class="title">Pulse</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Alphonso+Labs">Alphonso Labs</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Cherry pick your favorite online news sources to create your own, highly personalized newspaper.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.rdio.android.ui"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.rdio.android.ui&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_rdio.png" alt="Rdio"/></a></div><a data-a="1" data-c="1" href="/details?id=com.rdio.android.ui&feature=editorial-apps_editors_choice"><span class="title">Rdio</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Rdio">Rdio</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">After you subscribe to rdio, all the music you need is with you wherever you go!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.polarbit.RecklessRacing"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.polarbit.RecklessRacing&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/recklessracing.jpg" alt="Reckless racing"/></a></div><a data-a="1" data-c="1" href="/details?id=com.polarbit.RecklessRacing&feature=editorial-apps_editors_choice"><span class="title">Reckless racing</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=polarbit">polarbit</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Drive your Android in ways you&#39;d never dare to in the real world.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.fivemobile.thescore"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.fivemobile.thescore&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_scoremobile.png" alt="ScoreMobile for Android"/></a></div><a data-a="1" data-c="1" href="/details?id=com.fivemobile.thescore&feature=editorial-apps_editors_choice"><span class="title">ScoreMobile for Android</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Score+Media+Ventures+Inc.">Score Media Ventures Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Keep up with every kick, dunk or swing of your favorite team with this real-time sports app.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.shopkick.app"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.shopkick.app&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_shopkick.png" alt="shopkick"/></a></div><a data-a="1" data-c="1" href="/details?id=com.shopkick.app&feature=editorial-apps_editors_choice"><span class="title">shopkick</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=The+Hottest+App+In+Shopping">The Hottest App In Shopping</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">With those deals and rewards, is there a better excuse for hitting the mall?</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.sketchbook"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.sketchbook&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_sketchbook.png" alt="Sketchbook Mobile"/></a></div><a data-a="1" data-c="1" href="/details?id=com.sketchbook&feature=editorial-apps_editors_choice"><span class="title">Sketchbook Mobile</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Autodesk+Inc.">Autodesk Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Get creative! Paint and draw like a pro with this high-quality app.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.com2us.sliceit"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.com2us.sliceit&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/sliceit.jpg" alt="Slice it"/></a></div><a data-a="1" data-c="1" href="/details?id=com.com2us.sliceit&feature=editorial-apps_editors_choice"><span class="title">Slice it</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=Com2uS">Com2uS</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">No matter how you slice it, this fun and challenging game lets you sharpen your geometry chops.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.dasur.slideit"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.dasur.slideit&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g1.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_slideit.png" alt="Slide It"/></a></div><a data-a="1" data-c="1" href="/details?id=com.dasur.slideit&feature=editorial-apps_editors_choice"><span class="title">Slide It</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Dasur+Ltd.">Dasur Ltd.</a></div></span><div class="description">Hate pecking words on a touch screen? Stop typing and start sliding!</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.melodis.midomiMusicIdentifier"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.melodis.midomiMusicIdentifier&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/soundhound.jpg" alt="SoundHound"/></a></div><a data-a="1" data-c="1" href="/details?id=com.melodis.midomiMusicIdentifier&feature=editorial-apps_editors_choice"><span class="title">SoundHound</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=SoundHound+Inc.">SoundHound Inc.</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Stumped recognizing a tune? Having SoundHound is like carrying around a master music nerd in your pocket.</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.touchtype.swiftkey"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.touchtype.swiftkey&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://www.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_swiftkey.png" alt="SwiftKey"/></a></div><a data-a="1" data-c="1" href="/details?id=com.touchtype.swiftkey&feature=editorial-apps_editors_choice"><span class="title">SwiftKey</span></a><span class="attribution"><div class="goog-inline-block dev-has-badge-attribution"><a href="/developer?pub=TouchType+Ltd">TouchType Ltd</a></div><div class="badges-badge-icon-annotation-developer goog-inline-block"><img src="https://ssl.gstatic.com/android/market_images/badges/topdev_ann.png" title="Top Developer" /></div></span><div class="description">Tired of typing long words on the phone keyboard? Let Swiftkey predict what you are about to type</div></div></td><td><div class="fsg-snippet" data-f="211" data-docid="com.gianormousgames.towerraiders2"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.gianormousgames.towerraiders2&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://ssl.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/towerraiders.jpg" alt="Tower Raiders Gold 2"/></a></div><a data-a="1" data-c="1" href="/details?id=com.gianormousgames.towerraiders2&feature=editorial-apps_editors_choice"><span class="title">Tower Raiders Gold 2</span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=Gianormous+Games,+LLC">Gianormous Games, LLC</a></div></span><div class="description">Test your battle strategy skill with this addictive defense game.</div></div></td></tr><tr><td><div class="fsg-snippet" data-f="211" data-docid="com.worldmate"><div class="fsg-banner-thumbnail-wrapper"><a data-a="2" data-c="1" href="/details?id=com.worldmate&feature=editorial-apps_editors_choice" class="fsg-banner-thumbnail"><img src="https://g0.gstatic.com/android/market_images/editorial/editors_choice_thumbnails/091511_worldmate.png" alt="WorldMate "/></a></div><a data-a="1" data-c="1" href="/details?id=com.worldmate&feature=editorial-apps_editors_choice"><span class="title">WorldMate </span></a><span class="attribution"><div class="goog-inline-block"><a href="/developer?pub=WorldMate">WorldMate</a></div></span><div class="description">Never loose your flight info or details of your next appointment again! WorldMate tracks all of the logistics of your trip so you don&#39;t have to.</div></div></td></tr></table></div></div><div id="footer"><a class="footer-link" href="/account">My Market Account</a>|<a class="footer-link"><select id="user-locale"><option value="">Choose a language</option><option value="cs">‪Čeština‬</option><option value="da">‪Dansk‬</option><option value="de">‪Deutsch‬</option><option value="en">‪English‬</option><option value="es">‪Español (España)‬</option><option value="es_419">‪Español (Latinoamérica)‬</option><option value="fr">‪Français‬</option><option value="it">‪Italiano‬</option><option value="nl">‪Nederlands‬</option><option value="no">‪Norsk‬</option><option value="pl">‪Polski‬</option><option value="pt_BR">‪Português (Brasil)‬</option><option value="pt_PT">‪Português (Portugal)‬</option><option value="fi">‪Suomi‬</option><option value="sv">‪Svenska‬</option><option value="tr">‪Türkçe‬</option><option value="el">‪Ελληνικά‬</option><option value="ru">‪Русский‬</option><option value="ko">‪한국어‬</option><option value="zh_CN">‪中文(简体中文)‬</option><option value="zh_TW">‪中文(繁體中文)‬</option><option value="ja">‪日本語‬</option></select></a>|<a class="footer-link" href="http://www.google.com/support/androidmarket?hl=en_US">Help</a></div><div id="footer-tab-edge"></div><div id="sub-footer">&copy;2011 Google<a class="sub-footer-link" href="https://market.android.com/support/bin/answer.py?answer=1196026">Site Terms of Service</a> <a class="sub-footer-link" href="https://market.android.com/support/bin/answer.py?answer=1196018">Privacy Policy</a> <a class="sub-footer-link" href="http://developer.android.com/index.html">Developers</a></div><div id="checkout-footer" style="display:none;"></div></div><div id="super-tooltip" style="display:none"><div id="super-tooltip-contents" class="drop-shadow"></div><div id="super-tooltip-arrow"></div></div><div id="checkout-root"></div><script type="text/javascript" src="/static/client/js/3155463159-site_js_compiled_site_js.js"></script>
8
+ <script>var initProps = {signedIn: false, userEmail: '', userGivenName: '', userFamilyName: '', devices: {}, selectedDeviceId: '', absoluteBaseUrl: 'https:\/\/market.android.com', basePathPrefix: '\/', currentPageRelativeUrl: '\/details?id\x3dapps_editors_choice', checkoutBuyUrl: 'https:\/\/checkout.google.com\/customer\/gadget\/buy.html', gaiaForcedLoginBaseUrl: 'https:\/\/www.google.com\/accounts\/ServiceLogin?service\x3dandroidmarket\x26passive\x3d0', gaiaLoginBaseUrl: 'https:\/\/www.google.com\/accounts\/ServiceLogin?service\x3dandroidmarket\x26passive\x3d86400', gaiaLoginContinueUrl: 'https:\/\/market.android.com\/details?id\x3dapps_editors_choice', accountUrl: '\/account', imagePath: '\/static\/client\/images\/', enableDangerMouse: true, extraInitCallbacks: [], histogram: true, token: '', locale: 'en_US', country: 'US', ipCountry: 'US', analyticsQueue: window._gaq || [], dc: [,24,24,24,,,,1,,1,,100,,["CA","GB"]
9
+ ,,1,,1,1,1,,,,,,1,1]
10
+ , csiAction: 'editorial_container', shareboxBaseUrl: 'https:\/\/plus.sandbox.google.com\/'}; window.checkout_xpc_localxpcbase = 'https:\/\/market.android.com\/static\/client\/images\/'; window.xpcRsrcUri = 'https:\/\/market.android.com\/static\/client\/images\/';initProps.extraInitCallbacks.push( googdotpartialforcompilation(restoreGetDocument, '', ''));initProps.extraInitCallbacks.push( googdotpartialforcompilation(checkoutBuyFlowCompleted, '', '', '', '', '', ''));initProps.extraInitCallbacks.push(enableWatchPopup); letsGo();</script></body></html>
@@ -5,18 +5,25 @@ include MarketBot::Android
5
5
  test_id = :apps_topselling_paid
6
6
  test_category = :arcade
7
7
 
8
- $test_src_pages = []
9
- (1..4).each do |page|
10
- $test_src_pages[page] = read_file(File.dirname(__FILE__), 'data', "leaderboard-apps_topselling_paid-page#{page}.txt")
11
- end
12
8
 
13
9
  def stub_hydra(hydra)
10
+ test_src_pages = []
11
+ (1..4).each do |page|
12
+ test_src_pages[page] = read_file(File.dirname(__FILE__), 'data', "leaderboard-apps_topselling_paid-page#{page}.txt")
13
+ end
14
+
14
15
  (0...4).each do |i|
15
16
  start = i * 24
16
- response = Typhoeus::Response.new(:code => 200, :headers => '', :body => $test_src_pages[i + 1])
17
+ response = Typhoeus::Response.new(:code => 200, :headers => '', :body => test_src_pages[i + 1])
17
18
  url = "https://market.android.com/details?id=apps_topselling_paid&cat=ARCADE&start=#{start}&num=24"
18
19
  hydra.stub(:get, url).and_return(response)
19
20
  end
21
+
22
+ test_src_editors_choice = read_file(File.dirname(__FILE__), 'data', "leaderboard-apps_editors_choice.txt")
23
+
24
+ response = Typhoeus::Response.new(:code => 200, :headers => '', :body => test_src_editors_choice)
25
+ url = "https://market.android.com/details?id=apps_editors_choice"
26
+ hydra.stub(:get, url).and_return(response)
20
27
  end
21
28
 
22
29
  def check_results(results)
@@ -99,5 +106,24 @@ describe 'Leaderboard' do
99
106
 
100
107
  check_results(lb.results)
101
108
  end
109
+
110
+ context 'special case (editors choice page)' do
111
+ it 'should properly parse the page and turn them into results' do
112
+ hydra = Typhoeus::Hydra.new
113
+ stub_hydra(hydra)
114
+ lb = Leaderboard.new('apps_editors_choice', nil, :hydra => hydra)
115
+ lb.update
116
+
117
+ lb.results.count.should == 37
118
+
119
+ app = lb.results.last
120
+
121
+ app[:title].should == 'WorldMate '
122
+ app[:price_usd].should == nil
123
+ app[:developer].should == 'WorldMate'
124
+ app[:market_id].should == 'com.worldmate'
125
+ app[:market_url].should == 'https://market.android.com/details?id=com.worldmate'
126
+ end
127
+ end
102
128
  end
103
129
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: market_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-22 00:00:00.000000000Z
12
+ date: 2011-10-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: typhoeus
16
- requirement: &70290331191380 !ruby/object:Gem::Requirement
16
+ requirement: &70241800417620 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.2.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70290331191380
24
+ version_requirements: *70241800417620
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: nokogiri
27
- requirement: &70290331190900 !ruby/object:Gem::Requirement
27
+ requirement: &70241800417140 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.5.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70290331190900
35
+ version_requirements: *70241800417140
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70290331190420 !ruby/object:Gem::Requirement
38
+ requirement: &70241800416660 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.3.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70290331190420
46
+ version_requirements: *70241800416660
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &70290331189940 !ruby/object:Gem::Requirement
49
+ requirement: &70241800416180 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70290331189940
57
+ version_requirements: *70241800416180
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &70290331189460 !ruby/object:Gem::Requirement
60
+ requirement: &70241800432840 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.4
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70290331189460
68
+ version_requirements: *70241800432840
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rcov
71
- requirement: &70290331188980 !ruby/object:Gem::Requirement
71
+ requirement: &70241800432360 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70290331188980
79
+ version_requirements: *70241800432360
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: ZenTest
82
- requirement: &70290331188500 !ruby/object:Gem::Requirement
82
+ requirement: &70241800431880 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 4.6.2
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70290331188500
90
+ version_requirements: *70241800431880
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: ruby-debug19
93
- requirement: &70290331188020 !ruby/object:Gem::Requirement
93
+ requirement: &70241800431400 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 0.11.6
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70290331188020
101
+ version_requirements: *70241800431400
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rdoc
104
- requirement: &70290331187540 !ruby/object:Gem::Requirement
104
+ requirement: &70241800430920 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 3.9.4
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70290331187540
112
+ version_requirements: *70241800430920
113
113
  description: Market Bot is a high performance Ruby scraper for Google's Android Market
114
114
  with a simple to use API. It is built on top of Nokogiri and Typhoeus.
115
115
  email: chad@remesch.com
@@ -137,6 +137,7 @@ files:
137
137
  - spec/market_bot/android/data/app_1.txt
138
138
  - spec/market_bot/android/data/app_2.txt
139
139
  - spec/market_bot/android/data/app_3.txt
140
+ - spec/market_bot/android/data/leaderboard-apps_editors_choice.txt
140
141
  - spec/market_bot/android/data/leaderboard-apps_topselling_paid-page1.txt
141
142
  - spec/market_bot/android/data/leaderboard-apps_topselling_paid-page2.txt
142
143
  - spec/market_bot/android/data/leaderboard-apps_topselling_paid-page3.txt
@@ -159,7 +160,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
160
  version: '0'
160
161
  segments:
161
162
  - 0
162
- hash: 4351093170214784851
163
+ hash: 2946849998697334279
163
164
  required_rubygems_version: !ruby/object:Gem::Requirement
164
165
  none: false
165
166
  requirements: