Spaces:
Sleeping
Sleeping
| import os | |
| import requests | |
| from apify_client import ApifyClient | |
| from dotenv import load_dotenv | |
| import json | |
| # --- CONFIGURATION --- | |
| # Load environment variables from the .env file (if it exists) | |
| load_dotenv() | |
| ACTOR_ID = "e-commerce/allegro-product-detail-scraper" | |
| # --- HELPER FUNCTIONS --- | |
| def sanitize_name(text): | |
| """Sanitizes text by removing Polish characters and special symbols for a folder name.""" | |
| polish_chars = { | |
| "ą": "a", | |
| "ć": "c", | |
| "ę": "e", | |
| "ł": "l", | |
| "ń": "n", | |
| "ó": "o", | |
| "ś": "s", | |
| "ź": "z", | |
| "ż": "z", | |
| } | |
| text = text.lower() | |
| result = "" | |
| for char in text: | |
| if char in polish_chars: | |
| result += polish_chars[char] | |
| elif char.isalnum(): | |
| result += char | |
| else: | |
| result += "_" | |
| # Remove double underscores | |
| while "__" in result: | |
| result = result.replace("__", "_") | |
| return result.strip("_") | |
| def get_high_res_image(url): | |
| """Converts a thumbnail/resized link to the original high-resolution Allegro link.""" | |
| if not url: return None | |
| sizes = ["/s128/", "/s360/", "/s720/", "/s1024/", "/s1440/"] | |
| for size in sizes: | |
| if size in url: | |
| return url.replace(size, "/original/") | |
| return url | |
| def get_api_token(): | |
| """ | |
| Retrieves API token. | |
| Priority 1: from .env file (environment variable). | |
| Priority 2: prompts user input in the console. | |
| """ | |
| token = os.getenv("APIFY_TOKEN") | |
| if token: | |
| print("Info: API Token loaded from .env file.") | |
| return token | |
| return AttributeError("API Token is required but not provided.") | |
| def get_allegro_data(url): | |
| apify_token = get_api_token() | |
| if not apify_token: | |
| print("ERROR: API Token is required to run the script.") | |
| return | |
| client = ApifyClient(apify_token) | |
| run_input = { "startUrls": [url] } | |
| try: | |
| print("--- GATHERING DATA ---") | |
| run = client.actor(ACTOR_ID).call(run_input=run_input) | |
| dataset_items = list(client.dataset(run["defaultDatasetId"]).iterate_items()) | |
| if not dataset_items: | |
| print("Apify finished the job but returned no data.") | |
| return | |
| item = dataset_items[0] | |
| # --- DATA MAPPING --- | |
| # TITLE | |
| title = item.get("productTitle") or item.get("title") or "untitled" | |
| # DESCRIPTION | |
| description = item.get("description", "No description") | |
| # PARAMETERS | |
| parameter_list = [] | |
| specs = item.get("productSpecifications", {}) | |
| if isinstance(specs, dict): | |
| for key, value in specs.items(): | |
| parameter_list.append(f"{key}: {value}") | |
| elif not specs: | |
| raw_params = item.get("parameters") or item.get("attributes", []) | |
| for p in raw_params: | |
| name = p.get("name") or p.get("key") | |
| val = p.get("value") | |
| if name and val: | |
| parameter_list.append(f"{name}: {val}") | |
| # IMAGES | |
| unique_links = set() | |
| raw_images = item.get("images", []) | |
| for img in raw_images: | |
| if isinstance(img, str): unique_links.add(get_high_res_image(img)) | |
| elif isinstance(img, dict): unique_links.add(get_high_res_image(img.get("url"))) | |
| if not unique_links: | |
| thumb = item.get("thumbnail") | |
| if thumb: | |
| high_res = get_high_res_image(thumb) | |
| unique_links.add(high_res) | |
| print("Info: Retrieved main image from thumbnail (gallery was empty in API).") | |
| print(f"Found {len(unique_links)} images.") | |
| return { | |
| "title": title, | |
| "sanitized_title": sanitize_name(title), | |
| "url": url, | |
| "description": description, | |
| "parameters": parameter_list, | |
| "image_urls": list(unique_links), | |
| "image_count": len(unique_links), | |
| "price": f"{item.get('price')} {item.get('currency')}" | |
| } | |
| except Exception as e: | |
| print(f"Main error occurred: {e}") | |
| # --- USAGE --- | |
| if __name__ == "__main__": | |
| link = input("Enter the Allegro offer link: ") | |
| data = get_allegro_data(link) | |
| print(json.dumps(data, indent=4, ensure_ascii=False)) |