{"id":13613266,"url":"https://github.com/cowboy-bebug/app-store-scraper","last_synced_at":"2025-04-13T15:32:56.475Z","repository":{"id":39567950,"uuid":"272158737","full_name":"cowboy-bebug/app-store-scraper","owner":"cowboy-bebug","description":"Single API ☝ App Store Review Scraper 🧹","archived":true,"fork":false,"pushed_at":"2021-02-16T08:28:27.000Z","size":37,"stargazers_count":83,"open_issues_count":7,"forks_count":48,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-04-24T18:09:16.483Z","etag":null,"topics":["app-store","appstore","review-data","scraper"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cowboy-bebug.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-14T08:04:24.000Z","updated_at":"2024-04-24T06:17:36.000Z","dependencies_parsed_at":"2022-09-09T22:23:16.304Z","dependency_job_id":null,"html_url":"https://github.com/cowboy-bebug/app-store-scraper","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cowboy-bebug%2Fapp-store-scraper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cowboy-bebug%2Fapp-store-scraper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cowboy-bebug%2Fapp-store-scraper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cowboy-bebug%2Fapp-store-scraper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cowboy-bebug","download_url":"https://codeload.github.com/cowboy-bebug/app-store-scraper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248736072,"owners_count":21153530,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["app-store","appstore","review-data","scraper"],"created_at":"2024-08-01T20:00:42.951Z","updated_at":"2025-04-13T15:32:56.223Z","avatar_url":"https://github.com/cowboy-bebug.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"![build](https://img.shields.io/github/workflow/status/cowboy-bebug/app-store-scraper/Build)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/cowboy-bebug/app-store-scraper/pulls)\n[![PyPI](https://img.shields.io/pypi/v/app-store-scraper)](https://pypi.org/project/app-store-scraper/)\n![downloads](https://img.shields.io/pypi/dm/app-store-scraper)\n![license](https://img.shields.io/pypi/l/app-store-scraper)\n![code style](https://img.shields.io/badge/code%20style-black-black)\n\n```\n   ___                _____ _                   _____\n  / _ \\              /  ___| |                 /  ___|\n / /_\\ \\_ __  _ __   \\ `--.| |_ ___  _ __ ___  \\ `--.  ___ _ __ __ _ _ __   ___ _ __\n |  _  | '_ \\| '_ \\   `--. \\ __/ _ \\| '__/ _ \\  `--. \\/ __| '__/ _` | '_ \\ / _ \\ '__|\n | | | | |_) | |_) | /\\__/ / || (_) | | |  __/ /\\__/ / (__| | | (_| | |_) |  __/ |\n \\_| |_/ .__/| .__/  \\____/ \\__\\___/|_|  \\___| \\____/ \\___|_|  \\__,_| .__/ \\___|_|\n       | |   | |                                                    | |\n       |_|   |_|                                                    |_|\n```\n\n# Quickstart\n\nInstall:\n```console\npip3 install app-store-scraper\n```\n\nScrape reviews for an app:\n```python\nfrom app_store_scraper import AppStore\nfrom pprint import pprint\n\nminecraft = AppStore(country=\"nz\", app_name=\"minecraft\")\nminecraft.review(how_many=20)\n\npprint(minecraft.reviews)\npprint(minecraft.reviews_count)\n```\n\nScrape reviews for a podcast:\n```python\nfrom app_store_scraper import Podcast\nfrom pprint import pprint\n\nsysk = Podcast(country=\"nz\", app_name=\"stuff you should know\")\nsysk.review(how_many=20)\n\npprint(sysk.reviews)\npprint(sysk.reviews_count)\n```\n\n# Extra Details\n\nLet's continue from the code example used in [Quickstart](#quickstart).\n\n\n## Instantiation\n\nThere are two required and one positional parameters:\n\n- `country` (required)\n  - two-letter country code of [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) standard\n- `app_name` (required)\n  - name of an iOS application to fetch reviews for\n  - also used by `search_id()` method to search for `app_id` internally\n- `app_id` (positional)\n  - can be passed directly\n  - or ignored to be obtained by `search_id` method internally\n\nOnce instantiated, the object can be examined:\n```pycon\n\u003e\u003e\u003e minecraft\nAppStore(country='nz', app_name='minecraft', app_id=479516143)\n```\n```pycon\n\u003e\u003e\u003e print(app)\n     Country | nz\n        Name | minecraft\n          ID | 479516143\n         URL | https://apps.apple.com/nz/app/minecraft/id479516143\nReview count | 0\n```\n\nOther optional parameters are:\n\n- `log_format`\n  - passed directly to `logging.basicConfig(format=log_format)`\n  - default is `\"%(asctime)s [%(levelname)s] %(name)s - %(message)s\"`\n- `log_level`\n  - passed directly to `logging.basicConfig(level=log_level)`\n  - default is `\"INFO\"`\n- `log_interval`\n  - log is produced every 5 seconds (by default) as a \"heartbeat\" (useful for a long scraping session)\n  - default is `5`\n\n\n## Fetching Review\n\nThe maximum number of reviews fetched per request is 20. To minimise the number of calls, the limit of 20 is hardcoded. This means the `review()` method will always grab more than the `how_many` argument supplied with an increment of 20.\n\n```pycon\n\u003e\u003e\u003e minecraft.review(how_many=33)\n\u003e\u003e\u003e minecraft.reviews_count\n40\n```\n\nIf `how_many` is not provided, `review()` will terminate after *all* reviews are fetched.\n\n**NOTE** the review count seen on the landing page differs from the actual number of reviews fetched. This is simply because only *some* users who rated the app also leave reviews.\n\n### Optional Parameters\n\n- `after`\n  - a `datetime` object to filter older reviews\n- `sleep`\n  - an `int` to specify seconds to sleep between each call\n\n## Review Data\n\nThe fetched review data are loaded in memory and live inside `reviews` attribute as a list of dict.\n```pycon\n\u003e\u003e\u003e minecraft.reviews\n[{'userName': 'someone', 'rating': 5, 'date': datetime.datetime(...\n```\n\nEach review dictionary has the following schema:\n```python\n{\n    \"date\": datetime.datetime,\n    \"isEdited\": bool,\n    \"rating\": int,\n    \"review\": str,\n    \"title\": str,\n    \"userName\": str\n }\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcowboy-bebug%2Fapp-store-scraper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcowboy-bebug%2Fapp-store-scraper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcowboy-bebug%2Fapp-store-scraper/lists"}