![build](https://img.shields.io/github/workflow/status/hiyali/apple-store-scraper/Build)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/hiyali/apple-store-scraper/pulls)
[![PyPI](https://img.shields.io/pypi/v/apple-store-scraper)](https://pypi.org/project/apple-store-scraper/)
![downloads](https://img.shields.io/pypi/dm/apple-store-scraper)
![license](https://img.shields.io/pypi/l/apple-store-scraper)
![code style](https://img.shields.io/badge/code%20style-black-black)
```
___ _____ _ _____
/ _ \ / ___| | / ___|
/ /_\ \_ __ _ __ \ `--.| |_ ___ _ __ ___ \ `--. ___ _ __ __ _ _ __ ___ _ __
| _ | '_ \| '_ \ `--. \ __/ _ \| '__/ _ \ `--. \/ __| '__/ _` | '_ \ / _ \ '__|
| | | | |_) | |_) | /\__/ / || (_) | | | __/ /\__/ / (__| | | (_| | |_) | __/ |
\_| |_/ .__/| .__/ \____/ \__\___/|_| \___| \____/ \___|_| \__,_| .__/ \___|_|
| | | | | |
|_| |_| |_|
```
# Quickstart
Install:
```console
pip3 install apple-store-scraper
```
Scrape reviews for an app:
```python
from apple_store_scraper import AppStore
from pprint import pprint
minecraft = AppStore(country="nz", app_name="minecraft")
minecraft.review(how_many=20)
pprint(minecraft.reviews)
pprint(minecraft.reviews_count)
```
Scrape reviews for a podcast:
```python
from apple_store_scraper import Podcast
from pprint import pprint
sysk = Podcast(country="nz", app_name="stuff you should know")
sysk.review(how_many=20)
pprint(sysk.reviews)
pprint(sysk.reviews_count)
```
# Extra Details
Let's continue from the code example used in [Quickstart](#quickstart).
## Instantiation
There are two required and one positional parameters:
- `country` (required)
- two-letter country code of [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) standard
- `app_name` (required)
- name of an iOS application to fetch reviews for
- also used by `search_id()` method to search for `app_id` internally
- `app_id` (positional)
- can be passed directly
- or ignored to be obtained by `search_id` method internally
Once instantiated, the object can be examined:
```pycon
>>> minecraft
AppStore(country='nz', app_name='minecraft', app_id=479516143)
```
```pycon
>>> print(app)
Country | nz
Name | minecraft
ID | 479516143
URL | https://apps.apple.com/nz/app/minecraft/id479516143
Review count | 0
```
Other optional parameters are:
- `log_format`
- passed directly to `logging.basicConfig(format=log_format)`
- default is `"%(asctime)s [%(levelname)s] %(name)s - %(message)s"`
- `log_level`
- passed directly to `logging.basicConfig(level=log_level)`
- default is `"INFO"`
- `log_interval`
- log is produced every 5 seconds (by default) as a "heartbeat" (useful for a long scraping session)
- default is `5`
## Fetching Review
The 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.
```pycon
>>> minecraft.review(how_many=33)
>>> minecraft.reviews_count
40
```
If `how_many` is not provided, `review()` will terminate after *all* reviews are fetched.
**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.
### Optional Parameters
- `after`
- a `datetime` object to filter older reviews
- `sleep`
- an `int` to specify seconds to sleep between each call
## Review Data
The fetched review data are loaded in memory and live inside `reviews` attribute as a list of dict.
```pycon
>>> minecraft.reviews
[{'userName': 'someone', 'rating': 5, 'date': datetime.datetime(...
```
Each review dictionary has the following schema:
```python
{
"date": datetime.datetime,
"isEdited": bool,
"rating": int,
"review": str,
"title": str,
"userName": str
}
```
Raw data
{
"_id": null,
"home_page": "https://github.com/hiyali/apple-store-scraper",
"name": "apple-store-scraper",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "",
"keywords": "app store,ios,ios apps,podcasts,review,scraping,scraper",
"author": "Eric Lim",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/46/99/2fbcee7b3d9731f9a611fbd27658c08117af668205667cc92f802b854663/apple-store-scraper-0.3.6.tar.gz",
"platform": null,
"description": "![build](https://img.shields.io/github/workflow/status/hiyali/apple-store-scraper/Build)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/hiyali/apple-store-scraper/pulls)\n[![PyPI](https://img.shields.io/pypi/v/apple-store-scraper)](https://pypi.org/project/apple-store-scraper/)\n![downloads](https://img.shields.io/pypi/dm/apple-store-scraper)\n![license](https://img.shields.io/pypi/l/apple-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 apple-store-scraper\n```\n\nScrape reviews for an app:\n\n```python\nfrom apple_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\n```python\nfrom apple_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>>> minecraft\nAppStore(country='nz', app_name='minecraft', app_id=479516143)\n```\n```pycon\n>>> 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>>> minecraft.review(how_many=33)\n>>> 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>>> 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",
"bugtrack_url": null,
"license": "MIT",
"summary": "Single API \u261d App Store Review Scraper \ud83e\uddf9",
"version": "0.3.6",
"split_keywords": [
"app store",
"ios",
"ios apps",
"podcasts",
"review",
"scraping",
"scraper"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "4124613d716c62bfef2fcb34180b37fd77b7046fb61abcd8836b429c6d0b46c3",
"md5": "66002da99fe93ed4dcfffcd0777b9421",
"sha256": "41f95e379ab9afdaf9961857ba7851b503ed857b06fbb8dc6aef4f275aa5a032"
},
"downloads": -1,
"filename": "apple_store_scraper-0.3.6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "66002da99fe93ed4dcfffcd0777b9421",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 8307,
"upload_time": "2023-04-24T05:24:52",
"upload_time_iso_8601": "2023-04-24T05:24:52.550648Z",
"url": "https://files.pythonhosted.org/packages/41/24/613d716c62bfef2fcb34180b37fd77b7046fb61abcd8836b429c6d0b46c3/apple_store_scraper-0.3.6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "46992fbcee7b3d9731f9a611fbd27658c08117af668205667cc92f802b854663",
"md5": "42a456c9e7bc0bf4b7bde474b1180635",
"sha256": "29cd271aadc9f69c342ea6c6d1102b71a851aafc0f3abc8cd3bb7b798f4954c1"
},
"downloads": -1,
"filename": "apple-store-scraper-0.3.6.tar.gz",
"has_sig": false,
"md5_digest": "42a456c9e7bc0bf4b7bde474b1180635",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 7075,
"upload_time": "2023-04-24T05:24:54",
"upload_time_iso_8601": "2023-04-24T05:24:54.949478Z",
"url": "https://files.pythonhosted.org/packages/46/99/2fbcee7b3d9731f9a611fbd27658c08117af668205667cc92f802b854663/apple-store-scraper-0.3.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-04-24 05:24:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "hiyali",
"github_project": "apple-store-scraper",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "apple-store-scraper"
}