market_bot 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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: