| """ |
| Real Estate Data Scraper Template |
| This is a production-ready blueprint for scraping PropertyFinder or Aqarmap. |
| """ |
| import requests |
| from bs4 import BeautifulSoup |
| import json |
| import time |
|
|
| def scrape_property_finder_egypt(): |
| print("[*] Starting Data Ingestion Pipeline...") |
| |
| |
| url = "https://www.propertyfinder.eg/en/search?c=1&l=4&ob=mr&page=1" |
| |
| headers = { |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" |
| } |
|
|
| try: |
| response = requests.get(url, headers=headers) |
| if response.status_code != 200: |
| print(f"[!] Failed to fetch data: HTTP {response.status_code}") |
| return |
| |
| soup = BeautifulSoup(response.text, 'html.parser') |
| |
| |
| |
| cards = soup.find_all('div', class_='property-card-module_property-card__row__t2p_f') |
| |
| properties = [] |
| for card in cards: |
| title = card.find('h2').text.strip() if card.find('h2') else "Unknown" |
| price = card.find('p', class_='price').text.strip() if card.find('p', class_='price') else "0" |
| location = card.find('span', class_='location').text.strip() if card.find('span', class_='location') else "Unknown" |
| |
| |
| img_tag = card.find('img') |
| image_url = img_tag['src'] if img_tag and 'src' in img_tag.attrs else "" |
|
|
| properties.append({ |
| "title": title, |
| "price": price, |
| "location": location, |
| "image": image_url, |
| "status": "للبيع", |
| "source": "PropertyFinder" |
| }) |
| |
| |
| with open('raw_properties.json', 'w', encoding='utf-8') as f: |
| json.dump(properties, f, ensure_ascii=False, indent=4) |
| |
| print(f"[+] Scraped {len(properties)} properties successfully.") |
| |
| except Exception as e: |
| print(f"[!] Error during scraping: {e}") |
|
|
| if __name__ == "__main__": |
| scrape_property_finder_egypt() |
|
|