apple-appstore-metadata-extractor


Nameapple-appstore-metadata-extractor JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
SummaryExtract and monitor metadata from Apple App Store applications
upload_time2025-07-29 16:43:32
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseMIT
keywords app store metadata ios apple scraping monitoring
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Apple App Store Metadata Extractor

[![PyPI version](https://badge.fury.io/py/apple-appstore-metadata-extractor.svg)](https://badge.fury.io/py/apple-appstore-metadata-extractor)
[![Python Support](https://img.shields.io/pypi/pyversions/apple-appstore-metadata-extractor.svg)](https://pypi.org/project/apple-appstore-metadata-extractor/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

Extract and monitor metadata from Apple App Store applications with ease.

## Features

- 📱 **Extract comprehensive app metadata** - title, description, version, ratings, and more
- 🔄 **Track version changes** - monitor app updates and metadata changes over time
- 🚀 **Async support** - fast concurrent extraction for multiple apps
- 💪 **Robust error handling** - automatic retries and graceful error recovery
- 🛡️ **Rate limiting** - respect API limits and prevent blocking
- 🎨 **Rich CLI** - beautiful command-line interface with progress tracking
- 📊 **Multiple output formats** - JSON, pretty-printed, or custom formatting

## Installation

```bash
pip install apple-appstore-metadata-extractor
```

## Quick Start

### Command Line

Extract metadata for a single app:

```bash
appstore-extractor extract https://apps.apple.com/us/app/example/id123456789
```

Extract from multiple apps:

```bash
appstore-extractor extract-batch apps.json
```

Monitor apps for changes:

```bash
appstore-extractor watch apps.json --interval 3600
```

### Python Library

```python
from appstore_metadata_extractor import AppStoreScraper

# Initialize scraper
scraper = AppStoreScraper()

# Extract single app metadata
metadata = scraper.extract("https://apps.apple.com/us/app/example/id123456789")
print(f"App: {metadata.title}")
print(f"Version: {metadata.version}")
print(f"Rating: {metadata.rating}")

# Extract multiple apps
urls = [
    "https://apps.apple.com/us/app/app1/id111111111",
    "https://apps.apple.com/us/app/app2/id222222222"
]
results = scraper.extract_batch(urls)
```

### Async Usage

```python
import asyncio
from appstore_metadata_extractor import CombinedExtractor

async def main():
    extractor = CombinedExtractor()

    # Extract single app
    result = await extractor.extract("https://apps.apple.com/us/app/example/id123456789")

    # Extract multiple apps concurrently
    urls = ["url1", "url2", "url3"]
    results = await extractor.extract_batch(urls)

asyncio.run(main())
```

## CLI Commands

### `extract` - Extract single app metadata

```bash
appstore-extractor extract [OPTIONS] URL

Options:
  -o, --output PATH         Output file path
  -f, --format [json|pretty]  Output format (default: pretty)
  --no-cache               Disable caching
  --country TEXT           Country code (default: us)
```

### `extract-batch` - Extract multiple apps

```bash
appstore-extractor extract-batch [OPTIONS] INPUT_FILE

Options:
  -o, --output PATH         Output file path
  -f, --format [json|pretty]  Output format
  --concurrent INTEGER     Max concurrent requests (default: 5)
  --delay FLOAT           Delay between requests in seconds
```

### `watch` - Monitor apps for changes

```bash
appstore-extractor watch [OPTIONS] INPUT_FILE

Options:
  --interval INTEGER       Check interval in seconds (default: 3600)
  --output-dir PATH       Directory for history files
  --notify               Enable notifications for changes
```

## Input File Format

For batch operations, use a JSON file:

```json
{
  "apps": [
    {
      "name": "Example App 1",
      "url": "https://apps.apple.com/us/app/example-1/id123456789"
    },
    {
      "name": "Example App 2",
      "url": "https://apps.apple.com/us/app/example-2/id987654321"
    }
  ]
}
```

## Advanced Usage

### Custom Extraction Modes

```python
from appstore_metadata_extractor import CombinedExtractor, ExtractionMode

extractor = CombinedExtractor()

# API-only mode (faster, less data)
result = await extractor.extract(url, mode=ExtractionMode.API_ONLY)

# Web scraping mode (slower, more complete)
result = await extractor.extract(url, mode=ExtractionMode.WEB_SCRAPE)

# Combined mode (default - best of both)
result = await extractor.extract(url, mode=ExtractionMode.COMBINED)
```

### Rate Limiting Configuration

```python
from appstore_metadata_extractor import RateLimiter

# Configure custom rate limits
rate_limiter = RateLimiter(
    calls_per_minute=20,  # iTunes API limit
    min_delay=1.0        # Minimum delay between calls
)

scraper = AppStoreScraper(rate_limiter=rate_limiter)
```

### Caching

```python
from appstore_metadata_extractor import CacheManager

# Configure cache
cache = CacheManager(
    ttl=300,  # Cache TTL in seconds
    max_size=1000  # Maximum cache entries
)

scraper = AppStoreScraper(cache_manager=cache)
```

## Error Handling

The library provides robust error handling with automatic retries:

```python
from appstore_metadata_extractor import AppNotFoundError, RateLimitError

try:
    metadata = scraper.extract(url)
except AppNotFoundError:
    print("App not found")
except RateLimitError:
    print("Rate limit exceeded, please wait")
except Exception as e:
    print(f"Extraction failed: {e}")
```

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## Development

```bash
# Clone the repository
git clone https://github.com/yourusername/appstore-metadata-extractor-python.git
cd appstore-metadata-extractor-python

# Install in development mode
pip install -e ".[dev]"

# Run tests
pytest

# Run linting
black src tests
isort src tests
flake8 src tests
mypy src
```

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Disclaimer

This tool is for educational and research purposes only. Make sure to comply with Apple's Terms of Service and robots.txt when using this tool. Be respectful of rate limits and implement appropriate delays between requests.

## Acknowledgments

- Built with [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/) for web scraping
- Uses [Rich](https://github.com/Textualize/rich) for beautiful CLI output
- Powered by [Pydantic](https://pydantic-docs.helpmanual.io/) for data validation

## Related Projects

For a full-featured solution with web API, authentication, and UI, check out the [parent project](https://github.com/Bickster-LLC/appstore-metadata-extractor).

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "apple-appstore-metadata-extractor",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "app store, metadata, ios, apple, scraping, monitoring",
    "author": null,
    "author_email": "Bickster LLC <support@bickster.com>",
    "download_url": "https://files.pythonhosted.org/packages/f4/fa/a577a1fecbf0c48b76f7cae947d6556466e305881d1d0c1a4bb06f953800/apple_appstore_metadata_extractor-0.1.2.tar.gz",
    "platform": null,
    "description": "# Apple App Store Metadata Extractor\n\n[![PyPI version](https://badge.fury.io/py/apple-appstore-metadata-extractor.svg)](https://badge.fury.io/py/apple-appstore-metadata-extractor)\n[![Python Support](https://img.shields.io/pypi/pyversions/apple-appstore-metadata-extractor.svg)](https://pypi.org/project/apple-appstore-metadata-extractor/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nExtract and monitor metadata from Apple App Store applications with ease.\n\n## Features\n\n- \ud83d\udcf1 **Extract comprehensive app metadata** - title, description, version, ratings, and more\n- \ud83d\udd04 **Track version changes** - monitor app updates and metadata changes over time\n- \ud83d\ude80 **Async support** - fast concurrent extraction for multiple apps\n- \ud83d\udcaa **Robust error handling** - automatic retries and graceful error recovery\n- \ud83d\udee1\ufe0f **Rate limiting** - respect API limits and prevent blocking\n- \ud83c\udfa8 **Rich CLI** - beautiful command-line interface with progress tracking\n- \ud83d\udcca **Multiple output formats** - JSON, pretty-printed, or custom formatting\n\n## Installation\n\n```bash\npip install apple-appstore-metadata-extractor\n```\n\n## Quick Start\n\n### Command Line\n\nExtract metadata for a single app:\n\n```bash\nappstore-extractor extract https://apps.apple.com/us/app/example/id123456789\n```\n\nExtract from multiple apps:\n\n```bash\nappstore-extractor extract-batch apps.json\n```\n\nMonitor apps for changes:\n\n```bash\nappstore-extractor watch apps.json --interval 3600\n```\n\n### Python Library\n\n```python\nfrom appstore_metadata_extractor import AppStoreScraper\n\n# Initialize scraper\nscraper = AppStoreScraper()\n\n# Extract single app metadata\nmetadata = scraper.extract(\"https://apps.apple.com/us/app/example/id123456789\")\nprint(f\"App: {metadata.title}\")\nprint(f\"Version: {metadata.version}\")\nprint(f\"Rating: {metadata.rating}\")\n\n# Extract multiple apps\nurls = [\n    \"https://apps.apple.com/us/app/app1/id111111111\",\n    \"https://apps.apple.com/us/app/app2/id222222222\"\n]\nresults = scraper.extract_batch(urls)\n```\n\n### Async Usage\n\n```python\nimport asyncio\nfrom appstore_metadata_extractor import CombinedExtractor\n\nasync def main():\n    extractor = CombinedExtractor()\n\n    # Extract single app\n    result = await extractor.extract(\"https://apps.apple.com/us/app/example/id123456789\")\n\n    # Extract multiple apps concurrently\n    urls = [\"url1\", \"url2\", \"url3\"]\n    results = await extractor.extract_batch(urls)\n\nasyncio.run(main())\n```\n\n## CLI Commands\n\n### `extract` - Extract single app metadata\n\n```bash\nappstore-extractor extract [OPTIONS] URL\n\nOptions:\n  -o, --output PATH         Output file path\n  -f, --format [json|pretty]  Output format (default: pretty)\n  --no-cache               Disable caching\n  --country TEXT           Country code (default: us)\n```\n\n### `extract-batch` - Extract multiple apps\n\n```bash\nappstore-extractor extract-batch [OPTIONS] INPUT_FILE\n\nOptions:\n  -o, --output PATH         Output file path\n  -f, --format [json|pretty]  Output format\n  --concurrent INTEGER     Max concurrent requests (default: 5)\n  --delay FLOAT           Delay between requests in seconds\n```\n\n### `watch` - Monitor apps for changes\n\n```bash\nappstore-extractor watch [OPTIONS] INPUT_FILE\n\nOptions:\n  --interval INTEGER       Check interval in seconds (default: 3600)\n  --output-dir PATH       Directory for history files\n  --notify               Enable notifications for changes\n```\n\n## Input File Format\n\nFor batch operations, use a JSON file:\n\n```json\n{\n  \"apps\": [\n    {\n      \"name\": \"Example App 1\",\n      \"url\": \"https://apps.apple.com/us/app/example-1/id123456789\"\n    },\n    {\n      \"name\": \"Example App 2\",\n      \"url\": \"https://apps.apple.com/us/app/example-2/id987654321\"\n    }\n  ]\n}\n```\n\n## Advanced Usage\n\n### Custom Extraction Modes\n\n```python\nfrom appstore_metadata_extractor import CombinedExtractor, ExtractionMode\n\nextractor = CombinedExtractor()\n\n# API-only mode (faster, less data)\nresult = await extractor.extract(url, mode=ExtractionMode.API_ONLY)\n\n# Web scraping mode (slower, more complete)\nresult = await extractor.extract(url, mode=ExtractionMode.WEB_SCRAPE)\n\n# Combined mode (default - best of both)\nresult = await extractor.extract(url, mode=ExtractionMode.COMBINED)\n```\n\n### Rate Limiting Configuration\n\n```python\nfrom appstore_metadata_extractor import RateLimiter\n\n# Configure custom rate limits\nrate_limiter = RateLimiter(\n    calls_per_minute=20,  # iTunes API limit\n    min_delay=1.0        # Minimum delay between calls\n)\n\nscraper = AppStoreScraper(rate_limiter=rate_limiter)\n```\n\n### Caching\n\n```python\nfrom appstore_metadata_extractor import CacheManager\n\n# Configure cache\ncache = CacheManager(\n    ttl=300,  # Cache TTL in seconds\n    max_size=1000  # Maximum cache entries\n)\n\nscraper = AppStoreScraper(cache_manager=cache)\n```\n\n## Error Handling\n\nThe library provides robust error handling with automatic retries:\n\n```python\nfrom appstore_metadata_extractor import AppNotFoundError, RateLimitError\n\ntry:\n    metadata = scraper.extract(url)\nexcept AppNotFoundError:\n    print(\"App not found\")\nexcept RateLimitError:\n    print(\"Rate limit exceeded, please wait\")\nexcept Exception as e:\n    print(f\"Extraction failed: {e}\")\n```\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## Development\n\n```bash\n# Clone the repository\ngit clone https://github.com/yourusername/appstore-metadata-extractor-python.git\ncd appstore-metadata-extractor-python\n\n# Install in development mode\npip install -e \".[dev]\"\n\n# Run tests\npytest\n\n# Run linting\nblack src tests\nisort src tests\nflake8 src tests\nmypy src\n```\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Disclaimer\n\nThis tool is for educational and research purposes only. Make sure to comply with Apple's Terms of Service and robots.txt when using this tool. Be respectful of rate limits and implement appropriate delays between requests.\n\n## Acknowledgments\n\n- Built with [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/) for web scraping\n- Uses [Rich](https://github.com/Textualize/rich) for beautiful CLI output\n- Powered by [Pydantic](https://pydantic-docs.helpmanual.io/) for data validation\n\n## Related Projects\n\nFor a full-featured solution with web API, authentication, and UI, check out the [parent project](https://github.com/Bickster-LLC/appstore-metadata-extractor).\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Extract and monitor metadata from Apple App Store applications",
    "version": "0.1.2",
    "project_urls": {
        "Changelog": "https://github.com/Bickster-LLC/appstore-metadata-extractor-python/blob/main/CHANGELOG.md",
        "Documentation": "https://github.com/Bickster-LLC/appstore-metadata-extractor-python#readme",
        "Homepage": "https://github.com/Bickster-LLC/appstore-metadata-extractor-python",
        "Issues": "https://github.com/Bickster-LLC/appstore-metadata-extractor-python/issues",
        "Repository": "https://github.com/Bickster-LLC/appstore-metadata-extractor-python"
    },
    "split_keywords": [
        "app store",
        " metadata",
        " ios",
        " apple",
        " scraping",
        " monitoring"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "03b28ca4345a072da15d8438dded4fbe0ba76e887545ca9d1d295a10333dd156",
                "md5": "78c02944d5d558347f746ebb9b9ec748",
                "sha256": "cdadb203ea861efbf5bba5cd326157bf29464815425d62b450fd40859f2344df"
            },
            "downloads": -1,
            "filename": "apple_appstore_metadata_extractor-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "78c02944d5d558347f746ebb9b9ec748",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 47250,
            "upload_time": "2025-07-29T16:43:31",
            "upload_time_iso_8601": "2025-07-29T16:43:31.205705Z",
            "url": "https://files.pythonhosted.org/packages/03/b2/8ca4345a072da15d8438dded4fbe0ba76e887545ca9d1d295a10333dd156/apple_appstore_metadata_extractor-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f4faa577a1fecbf0c48b76f7cae947d6556466e305881d1d0c1a4bb06f953800",
                "md5": "fb30eef68be00ba47a7d2d7f08b7e684",
                "sha256": "d8c7769ffe2ece88b97b50767c5c811f8df0fef41ce548bf367ef79b4d615eba"
            },
            "downloads": -1,
            "filename": "apple_appstore_metadata_extractor-0.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "fb30eef68be00ba47a7d2d7f08b7e684",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 58503,
            "upload_time": "2025-07-29T16:43:32",
            "upload_time_iso_8601": "2025-07-29T16:43:32.613053Z",
            "url": "https://files.pythonhosted.org/packages/f4/fa/a577a1fecbf0c48b76f7cae947d6556466e305881d1d0c1a4bb06f953800/apple_appstore_metadata_extractor-0.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-29 16:43:32",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Bickster-LLC",
    "github_project": "appstore-metadata-extractor-python",
    "github_not_found": true,
    "lcname": "apple-appstore-metadata-extractor"
}
        
Elapsed time: 1.06959s