# Apple App Store Metadata Extractor
[](https://badge.fury.io/py/apple-appstore-metadata-extractor)
[](https://pypi.org/project/apple-appstore-metadata-extractor/)
[](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
- 💰 **In-App Purchase details** - extract names and prices of all IAP items
- 🔗 **Support links** - app support, privacy policy, and developer website URLs
- 🔄 **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}")
# Access In-App Purchases
if metadata.in_app_purchases:
print(f"\nIn-App Purchases ({len(metadata.in_app_purchase_list)} items):")
for iap in metadata.in_app_purchase_list:
print(f" - {iap['name']}: {iap['price']}")
# Access Support Links
print(f"\nSupport Links:")
print(f" App Support: {metadata.app_support_url}")
print(f" Privacy Policy: {metadata.privacy_policy_url}")
print(f" Developer Website: {metadata.developer_website_url}")
# Access Screenshots (NEW in v0.1.10)
print(f"\nScreenshots:")
print(f" iPhone: {len(metadata.screenshots)} screenshots")
print(f" iPad: {len(metadata.ipad_screenshots)} screenshots")
if metadata.ipad_screenshots:
print(f" First iPad screenshot: {metadata.ipad_screenshots[0]}")
# 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"
}
]
}
```
## Extracted Fields
The extractor provides comprehensive app metadata including:
### Basic Information
- **app_id** - Apple App Store ID
- **bundle_id** - App bundle identifier
- **url** - App Store URL
- **name** - App name
- **subtitle** - App subtitle/tagline (web scraping required)
- **developer_name** - Developer name
- **developer_id** - Developer ID
- **developer_url** - Developer page URL
### Categories
- **category** / **primary_category** - Primary category name
- **category_id** / **primary_category_id** - Primary category ID
- **categories** - List of all categories
- **category_ids** - List of all category IDs
### Pricing & Purchases
- **price** - App price (numeric value)
- **formatted_price** - Formatted price string (e.g., "$4.99" or "Free")
- **currency** - Currency code (e.g., "USD")
- **in_app_purchases** - Boolean indicating if app has IAPs
- **in_app_purchase_list** - Detailed list of IAPs (web scraping required):
- name - IAP item name
- price - Formatted price
- price_value - Numeric price
- type - IAP type (auto_renewable_subscription, non_consumable, etc.)
- currency - Currency code
### Version Information
- **current_version** - Current version number
- **version_date** / **current_version_release_date** - Release date
- **whats_new** / **release_notes** - What's new in this version
- **version_history** - List of previous versions (web scraping required)
- **initial_release_date** - First release date
- **last_updated** - Last update to any field
### Content & Description
- **description** - Full app description
- **content_rating** - Age rating (e.g., "4+", "12+")
- **content_advisories** - List of content warnings
### Languages (web scraping required)
- **languages** - Human-readable language names (e.g., "English", "Spanish")
- **language_codes** - ISO language codes (e.g., "EN", "ES")
### Ratings & Reviews
- **average_rating** - Average user rating (0-5)
- **rating_count** - Total number of ratings
- **average_rating_current_version** - Rating for current version
- **rating_count_current_version** - Ratings for current version
- **rating_distribution** - Star breakdown (web scraping required)
- **reviews** - User reviews list (web scraping required)
### Media Assets
- **icon_url** - App icon URL (512x512)
- **icon_urls** - Dictionary of multiple icon sizes
- **screenshots** - List of iPhone screenshot URLs
- **ipad_screenshots** - List of iPad screenshot URLs (NEW in v0.1.10 - from iTunes API and web scraping)
### Support Links (web scraping required)
- **app_support_url** - Direct link to app support page
- **privacy_policy_url** - Link to privacy policy
- **developer_website_url** - Main developer website
- **support_url** - Support website (alias)
- **marketing_url** - Marketing website
### Technical Details
- **file_size_bytes** - Size in bytes
- **file_size_formatted** - Human-readable size (e.g., "245.8 MB")
- **minimum_os_version** - Minimum iOS version required
- **supported_devices** - List of compatible devices
### Features & Capabilities
- **features** - List of app features/capabilities
- **is_game_center_enabled** - Game Center support
- **is_vpp_device_based_licensing_enabled** - VPP device licensing
### Privacy Information (web scraping required)
- **privacy** - Detailed privacy information including:
- data_used_to_track
- data_linked_to_you
- data_not_linked_to_you
- privacy_details_url
### Related Content (web scraping required)
- **developer_apps** - Other apps by the same developer
- **similar_apps** - "You might also like" recommendations
- **rankings** - Chart positions (e.g., {"Games": 5, "Overall": 23})
### Metadata
- **data_source** - Source of the data (itunes_api, web_scrape, combined)
- **extracted_at** / **scraped_at** - When data was collected
- **raw_data** - Raw response data (optional, for debugging)
## Migration Guide
### v0.1.10 - Screenshot Updates
The iTunes API extractor now returns `ExtendedAppMetadata` instead of basic `AppMetadata`, which includes:
- `ipad_screenshots` - Separate field for iPad screenshots
- `developer_url` - Developer page URL from iTunes
- `initial_release_date` - When the app was first released
- `average_rating_current_version` and `rating_count_current_version`
```python
# The screenshots field still contains iPhone screenshots
iphone_screenshots = metadata.screenshots # iPhone only
# NEW: iPad screenshots are now separate
ipad_screenshots = metadata.ipad_screenshots # iPad only (if available)
```
### v0.1.6 - CombinedExtractor Migration
If you were using `CombinedAppStoreScraper`, it has been consolidated into `CombinedExtractor`. The old class name still works via an alias, but we recommend updating your code:
```python
# Old way (still works via alias)
from appstore_metadata_extractor import CombinedAppStoreScraper
scraper = CombinedAppStoreScraper()
result = scraper.fetch(url)
# New way (recommended)
from appstore_metadata_extractor import CombinedExtractor
extractor = CombinedExtractor()
metadata = extractor.fetch(url) # Synchronous method
# or
result = await extractor.extract(url) # Async method
```
The new `CombinedExtractor` offers:
- Full backward compatibility
- Better type safety
- Support for extraction modes (iTunes-only vs combined)
- Both sync and async interfaces
## 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
See [DEVELOPMENT.md](DEVELOPMENT.md) for detailed development setup and workflow instructions.
**Quick Start:**
```bash
# Clone and setup
git clone https://github.com/yourusername/appstore-metadata-extractor-python.git
cd appstore-metadata-extractor-python
./dev-setup.sh
# Activate environment and develop
source venv/bin/activate
```
## 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/45/6e/b4aa15764631c7aad1e7389cef084608c5aba9e502a7839662a98bb01a54/apple_appstore_metadata_extractor-0.1.12.tar.gz",
"platform": null,
"description": "# Apple App Store Metadata Extractor\n\n[](https://badge.fury.io/py/apple-appstore-metadata-extractor)\n[](https://pypi.org/project/apple-appstore-metadata-extractor/)\n[](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\udcb0 **In-App Purchase details** - extract names and prices of all IAP items\n- \ud83d\udd17 **Support links** - app support, privacy policy, and developer website URLs\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# Access In-App Purchases\nif metadata.in_app_purchases:\n print(f\"\\nIn-App Purchases ({len(metadata.in_app_purchase_list)} items):\")\n for iap in metadata.in_app_purchase_list:\n print(f\" - {iap['name']}: {iap['price']}\")\n\n# Access Support Links\nprint(f\"\\nSupport Links:\")\nprint(f\" App Support: {metadata.app_support_url}\")\nprint(f\" Privacy Policy: {metadata.privacy_policy_url}\")\nprint(f\" Developer Website: {metadata.developer_website_url}\")\n\n# Access Screenshots (NEW in v0.1.10)\nprint(f\"\\nScreenshots:\")\nprint(f\" iPhone: {len(metadata.screenshots)} screenshots\")\nprint(f\" iPad: {len(metadata.ipad_screenshots)} screenshots\")\nif metadata.ipad_screenshots:\n print(f\" First iPad screenshot: {metadata.ipad_screenshots[0]}\")\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## Extracted Fields\n\nThe extractor provides comprehensive app metadata including:\n\n### Basic Information\n- **app_id** - Apple App Store ID\n- **bundle_id** - App bundle identifier\n- **url** - App Store URL\n- **name** - App name\n- **subtitle** - App subtitle/tagline (web scraping required)\n- **developer_name** - Developer name\n- **developer_id** - Developer ID\n- **developer_url** - Developer page URL\n\n### Categories\n- **category** / **primary_category** - Primary category name\n- **category_id** / **primary_category_id** - Primary category ID\n- **categories** - List of all categories\n- **category_ids** - List of all category IDs\n\n### Pricing & Purchases\n- **price** - App price (numeric value)\n- **formatted_price** - Formatted price string (e.g., \"$4.99\" or \"Free\")\n- **currency** - Currency code (e.g., \"USD\")\n- **in_app_purchases** - Boolean indicating if app has IAPs\n- **in_app_purchase_list** - Detailed list of IAPs (web scraping required):\n - name - IAP item name\n - price - Formatted price\n - price_value - Numeric price\n - type - IAP type (auto_renewable_subscription, non_consumable, etc.)\n - currency - Currency code\n\n### Version Information\n- **current_version** - Current version number\n- **version_date** / **current_version_release_date** - Release date\n- **whats_new** / **release_notes** - What's new in this version\n- **version_history** - List of previous versions (web scraping required)\n- **initial_release_date** - First release date\n- **last_updated** - Last update to any field\n\n### Content & Description\n- **description** - Full app description\n- **content_rating** - Age rating (e.g., \"4+\", \"12+\")\n- **content_advisories** - List of content warnings\n\n### Languages (web scraping required)\n- **languages** - Human-readable language names (e.g., \"English\", \"Spanish\")\n- **language_codes** - ISO language codes (e.g., \"EN\", \"ES\")\n\n### Ratings & Reviews\n- **average_rating** - Average user rating (0-5)\n- **rating_count** - Total number of ratings\n- **average_rating_current_version** - Rating for current version\n- **rating_count_current_version** - Ratings for current version\n- **rating_distribution** - Star breakdown (web scraping required)\n- **reviews** - User reviews list (web scraping required)\n\n### Media Assets\n- **icon_url** - App icon URL (512x512)\n- **icon_urls** - Dictionary of multiple icon sizes\n- **screenshots** - List of iPhone screenshot URLs\n- **ipad_screenshots** - List of iPad screenshot URLs (NEW in v0.1.10 - from iTunes API and web scraping)\n\n### Support Links (web scraping required)\n- **app_support_url** - Direct link to app support page\n- **privacy_policy_url** - Link to privacy policy\n- **developer_website_url** - Main developer website\n- **support_url** - Support website (alias)\n- **marketing_url** - Marketing website\n\n### Technical Details\n- **file_size_bytes** - Size in bytes\n- **file_size_formatted** - Human-readable size (e.g., \"245.8 MB\")\n- **minimum_os_version** - Minimum iOS version required\n- **supported_devices** - List of compatible devices\n\n### Features & Capabilities\n- **features** - List of app features/capabilities\n- **is_game_center_enabled** - Game Center support\n- **is_vpp_device_based_licensing_enabled** - VPP device licensing\n\n### Privacy Information (web scraping required)\n- **privacy** - Detailed privacy information including:\n - data_used_to_track\n - data_linked_to_you\n - data_not_linked_to_you\n - privacy_details_url\n\n### Related Content (web scraping required)\n- **developer_apps** - Other apps by the same developer\n- **similar_apps** - \"You might also like\" recommendations\n- **rankings** - Chart positions (e.g., {\"Games\": 5, \"Overall\": 23})\n\n### Metadata\n- **data_source** - Source of the data (itunes_api, web_scrape, combined)\n- **extracted_at** / **scraped_at** - When data was collected\n- **raw_data** - Raw response data (optional, for debugging)\n\n## Migration Guide\n\n### v0.1.10 - Screenshot Updates\nThe iTunes API extractor now returns `ExtendedAppMetadata` instead of basic `AppMetadata`, which includes:\n- `ipad_screenshots` - Separate field for iPad screenshots\n- `developer_url` - Developer page URL from iTunes\n- `initial_release_date` - When the app was first released\n- `average_rating_current_version` and `rating_count_current_version`\n\n```python\n# The screenshots field still contains iPhone screenshots\niphone_screenshots = metadata.screenshots # iPhone only\n\n# NEW: iPad screenshots are now separate\nipad_screenshots = metadata.ipad_screenshots # iPad only (if available)\n```\n\n### v0.1.6 - CombinedExtractor Migration\n\nIf you were using `CombinedAppStoreScraper`, it has been consolidated into `CombinedExtractor`. The old class name still works via an alias, but we recommend updating your code:\n\n```python\n# Old way (still works via alias)\nfrom appstore_metadata_extractor import CombinedAppStoreScraper\nscraper = CombinedAppStoreScraper()\nresult = scraper.fetch(url)\n\n# New way (recommended)\nfrom appstore_metadata_extractor import CombinedExtractor\nextractor = CombinedExtractor()\nmetadata = extractor.fetch(url) # Synchronous method\n# or\nresult = await extractor.extract(url) # Async method\n```\n\nThe new `CombinedExtractor` offers:\n- Full backward compatibility\n- Better type safety\n- Support for extraction modes (iTunes-only vs combined)\n- Both sync and async interfaces\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\nSee [DEVELOPMENT.md](DEVELOPMENT.md) for detailed development setup and workflow instructions.\n\n**Quick Start:**\n```bash\n# Clone and setup\ngit clone https://github.com/yourusername/appstore-metadata-extractor-python.git\ncd appstore-metadata-extractor-python\n./dev-setup.sh\n\n# Activate environment and develop\nsource venv/bin/activate\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.12",
"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": "c64e1884f315b016f95c4bcd851010defce36045fb82118a3971bacd571e2527",
"md5": "c8cd570fc377a294e58aacbe5cd72268",
"sha256": "d1455399cc8ab47e045ef0791d918157057efe50365d104049db67ce568536e5"
},
"downloads": -1,
"filename": "apple_appstore_metadata_extractor-0.1.12-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c8cd570fc377a294e58aacbe5cd72268",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.11",
"size": 50144,
"upload_time": "2025-08-06T04:14:32",
"upload_time_iso_8601": "2025-08-06T04:14:32.037853Z",
"url": "https://files.pythonhosted.org/packages/c6/4e/1884f315b016f95c4bcd851010defce36045fb82118a3971bacd571e2527/apple_appstore_metadata_extractor-0.1.12-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "456eb4aa15764631c7aad1e7389cef084608c5aba9e502a7839662a98bb01a54",
"md5": "77859b7335a1decb51e0b1c2c2b8600c",
"sha256": "dabedff96a941ef97a8bf1cb374e9abc9a18235c54ab34c6fe3447ea81126fac"
},
"downloads": -1,
"filename": "apple_appstore_metadata_extractor-0.1.12.tar.gz",
"has_sig": false,
"md5_digest": "77859b7335a1decb51e0b1c2c2b8600c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.11",
"size": 74062,
"upload_time": "2025-08-06T04:14:33",
"upload_time_iso_8601": "2025-08-06T04:14:33.087460Z",
"url": "https://files.pythonhosted.org/packages/45/6e/b4aa15764631c7aad1e7389cef084608c5aba9e502a7839662a98bb01a54/apple_appstore_metadata_extractor-0.1.12.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-06 04:14:33",
"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"
}