Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>LiveScrape - Web Scraping Tool</title> | |
| <script src="https://cdn.tailwindcss.com"></script> | |
| <script> | |
| tailwind.config = { | |
| theme: { | |
| extend: { | |
| colors: { | |
| 'primary-blue': '#2563EB', | |
| 'dark-blue': '#1D4ED8', | |
| 'light-blue': '#DBEAFE', | |
| } | |
| } | |
| } | |
| } | |
| </script> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <style> | |
| @keyframes pulse { | |
| 0% { transform: scale(1); opacity: 1; } | |
| 50% { transform: scale(1.05); opacity: 0.8; } | |
| 100% { transform: scale(1); opacity: 1; } | |
| } | |
| .animate-pulse-slow { | |
| animation: pulse 3s infinite; | |
| } | |
| .progress-bar { | |
| transition: width 0.5s ease-in-out; | |
| } | |
| .scrape-card { | |
| transition: transform 0.3s ease, box-shadow 0.3s ease; | |
| } | |
| .scrape-card:hover { | |
| transform: translateY(-5px); | |
| box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); | |
| } | |
| .preview-table { | |
| max-height: 300px; | |
| overflow-y: auto; | |
| } | |
| .status-badge { | |
| animation: ping 1.5s cubic-bezier(0,0,0.2,1) infinite; | |
| } | |
| @keyframes ping { | |
| 75%, 100% { transform: scale(1.5); opacity: 0; } | |
| } | |
| </style> | |
| </head> | |
| <body class="bg-gray-50 min-h-screen"> | |
| <!-- Navigation --> | |
| <nav class="bg-gray-900 text-white shadow-lg"> | |
| <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div class="flex items-center justify-between h-16"> | |
| <div class="flex items-center space-x-3"> | |
| <div class="bg-primary-blue p-2 rounded-lg"> | |
| <i class="fas fa-cloud-download-alt text-white text-2xl"></i> | |
| </div> | |
| <a href="#" class="text-xl font-bold text-white">Live<span class="text-primary-blue">Scrape</span></a> | |
| </div> | |
| <div class="hidden md:block"> | |
| <div class="ml-10 flex items-baseline space-x-4"> | |
| <a href="#" class="text-primary-blue px-3 py-2 rounded-md text-sm font-medium">Dashboard</a> | |
| <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">How It Works</a> | |
| <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium">Privacy Policy</a> | |
| </div> | |
| </div> | |
| <div class="md:hidden flex items-center"> | |
| <button id="mobile-menu-button" class="text-gray-400 hover:text-white focus:outline-none"> | |
| <i class="fas fa-bars text-xl"></i> | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </nav> | |
| <!-- Main Content --> | |
| <div class="max-w-7xl mx-auto py-12 px-4 sm:px-6 lg:px-8"> | |
| <div class="text-center mb-16"> | |
| <h1 class="text-4xl font-extrabold text-gray-900 sm:text-5xl sm:tracking-tight"> | |
| Web Scraping Made <span class="text-primary-blue">Effortless</span> | |
| </h1> | |
| <p class="mt-5 max-w-xl mx-auto text-xl text-gray-500"> | |
| Extract structured data from the web in real-time. Export directly to spreadsheets with one click. | |
| </p> | |
| </div> | |
| <div class="flex flex-col lg:flex-row gap-8"> | |
| <!-- Input Form --> | |
| <div class="lg:w-1/2"> | |
| <div class="bg-white shadow-xl rounded-2xl overflow-hidden scrape-card"> | |
| <div class="bg-gradient-to-r from-primary-blue to-purple-600 py-4 px-6"> | |
| <h2 class="text-white text-2xl font-bold flex items-center"> | |
| <i class="fas fa-search mr-3"></i> Search & Scrape Data | |
| </h2> | |
| </div> | |
| <div class="p-6"> | |
| <div class="mb-6"> | |
| <label class="block text-gray-700 font-medium mb-2">Enter Search Query</label> | |
| <div class="flex"> | |
| <input | |
| type="text" | |
| class="flex-1 py-3 px-4 border border-gray-300 rounded-l-lg focus:outline-none focus:ring-2 focus:ring-primary-blue" | |
| placeholder="e.g., 'top hospitals in New York' or 'IT companies in Bangalore'" | |
| id="search-query" | |
| > | |
| <button class="bg-primary-blue hover:bg-dark-blue text-white font-semibold py-3 px-6 rounded-r-lg flex items-center transition duration-300" id="scrape-btn"> | |
| <i class="fas fa-bolt mr-2 animate-pulse-slow text-yellow-300"></i> Scrape | |
| </button> | |
| </div> | |
| <p class="mt-2 text-sm text-gray-500">Enter any search term to scrape real-time data</p> | |
| </div> | |
| <div class="mb-6 relative"> | |
| <label class="block text-gray-700 font-medium mb-2">Scraping Status</label> | |
| <div class="bg-gray-100 rounded-lg p-4 border border-gray-200"> | |
| <div id="status-container" class="hidden"> | |
| <div class="flex items-center justify-between mb-2"> | |
| <div class="flex items-center"> | |
| <span class="flex h-4 w-4 relative"> | |
| <span class="status-badge animate-ping absolute inline-flex h-full w-full rounded-full bg-primary-blue opacity-75"></span> | |
| <span class="relative inline-flex rounded-full h-4 w-4 bg-primary-blue"></span> | |
| </span> | |
| <span class="ml-2 font-medium text-gray-800" id="status-text">Accessing search engines</span> | |
| </div> | |
| <div class="text-sm text-primary-blue font-medium" id="progress-text">0%</div> | |
| </div> | |
| <div class="w-full bg-gray-300 rounded-full h-2.5"> | |
| <div class="bg-primary-blue h-2.5 rounded-full progress-bar" style="width: 0%;" id="progress-bar"></div> | |
| </div> | |
| </div> | |
| <div id="status-placeholder" class="text-center text-gray-500 py-4"> | |
| <i class="fas fa-search fa-2x"></i> | |
| <p class="mt-2">Your scraping results will appear here</p> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="mb-4"> | |
| <div class="flex items-center justify-between mb-4"> | |
| <label class="block text-gray-700 font-medium">Export Format</label> | |
| <div class="text-sm text-gray-500" id="record-count">0 records</div> | |
| </div> | |
| <div class="flex space-x-4"> | |
| <div class="flex-1"> | |
| <button | |
| id="download-csv" | |
| class="w-full py-3 bg-gradient-to-r from-blue-500 to-green-500 text-white font-bold rounded-lg hover:opacity-90 transition duration-300 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center" | |
| disabled | |
| > | |
| <i class="far fa-file-alt mr-2"></i> Download CSV | |
| </button> | |
| </div> | |
| <div class="flex-1"> | |
| <button | |
| id="download-xlsx" | |
| class="w-full py-3 bg-gradient-to-r from-green-500 to-blue-700 text-white font-bold rounded-lg hover:opacity-90 transition duration-300 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center" | |
| disabled | |
| > | |
| <i class="far fa-file-excel mr-2"></i> Download Excel | |
| </button> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="mt-8 bg-white shadow-lg p-6 rounded-2xl"> | |
| <h3 class="font-bold text-xl text-gray-800 mb-4 flex items-center"> | |
| <i class="fas fa-lightbulb mr-2 text-yellow-500"></i> Pro Tips | |
| </h3> | |
| <ul class="space-y-3"> | |
| <li class="flex items-start"> | |
| <i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i> | |
| <span>Be specific with your search for more accurate results (e.g., "Top 10 hospitals in Chicago")</span> | |
| </li> | |
| <li class="flex items-start"> | |
| <i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i> | |
| <span>Include location for place-specific results (e.g., "IT companies in London")</span> | |
| </li> | |
| <li class="flex items-start"> | |
| <i class="fas fa-check-circle text-green-500 mt-1 mr-2"></i> | |
| <span>Your searches are processed in real-time and results are never stored</span> | |
| </li> | |
| </ul> | |
| </div> | |
| </div> | |
| <!-- Results Preview --> | |
| <div class="lg:w-1/2"> | |
| <div class="bg-white shadow-xl rounded-2xl overflow-hidden h-full scrape-card"> | |
| <div class="bg-gradient-to-r from-purple-600 to-indigo-700 py-4 px-6"> | |
| <h2 class="text-white text-2xl font-bold flex items-center"> | |
| <i class="fas fa-table mr-3"></i> Results Preview | |
| </h2> | |
| </div> | |
| <div class="p-6 h-full"> | |
| <div class="mb-4"> | |
| <div class="flex items-center justify-between"> | |
| <h3 class="font-bold text-gray-800">Data Preview <span class="text-sm text-gray-600">(first 10 results)</span></h3> | |
| <div class="text-sm bg-blue-100 text-primary-blue px-3 py-1 rounded-full font-medium" id="result-source">Source: Google</div> | |
| </div> | |
| </div> | |
| <div class="preview-table bg-white border border-gray-200 rounded-lg overflow-hidden"> | |
| <div class="relative overflow-x-auto"> | |
| <table class="w-full text-sm text-left text-gray-500"> | |
| <thead class="text-xs uppercase bg-gray-50 text-gray-700"> | |
| <tr> | |
| <th scope="col" class="px-6 py-3"> | |
| Name | |
| </th> | |
| <th scope="col" class="px-6 py-3"> | |
| Address | |
| </th> | |
| <th scope="col" class="px-6 py-3"> | |
| Phone | |
| </th> | |
| <th scope="col" class="px-6 py-3"> | |
| Rating | |
| </th> | |
| </tr> | |
| </thead> | |
| <tbody id="result-preview"> | |
| <tr class="text-center py-12"> | |
| <td colspan="4" class="py-16"> | |
| <i class="fas fa-inbox text-gray-300 text-5xl mb-4"></i> | |
| <p class="text-gray-500">Preview your scraped data here</p> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <div class="mt-6"> | |
| <h3 class="font-bold text-gray-800 mb-3 flex items-center"> | |
| <i class="fas fa-user-shield mr-2"></i> Ethical Scraping Practices | |
| </h3> | |
| <div class="flex flex-wrap gap-2"> | |
| <div class="bg-green-100 text-green-800 text-xs font-medium px-3 py-1 rounded-full"> | |
| Robots.txt Compliant | |
| </div> | |
| <div class="bg-yellow-100 text-yellow-800 text-xs font-medium px-3 py-1 rounded-full"> | |
| Rate Limited | |
| </div> | |
| <div class="bg-blue-100 text-blue-800 text-xs font-medium px-3 py-1 rounded-full"> | |
| Public Data Only | |
| </div> | |
| <div class="bg-purple-100 text-purple-800 text-xs font-medium px-3 py-1 rounded-full"> | |
| No Personal Data | |
| </div> | |
| <div class="bg-pink-100 text-pink-800 text-xs font-medium px-3 py-1 rounded-full"> | |
| 2s Delay Between Requests | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Footer --> | |
| <footer class="bg-gray-900 text-white py-12 mt-16"> | |
| <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | |
| <div class="flex flex-col md:flex-row justify-between"> | |
| <div class="mb-6 md:mb-0"> | |
| <div class="flex items-center space-x-3"> | |
| <div class="bg-primary-blue p-2 rounded-lg"> | |
| <i class="fas fa-cloud-download-alt text-white text-xl"></i> | |
| </div> | |
| <a href="#" class="text-xl font-bold text-white">Live<span class="text-primary-blue">Scrape</span></a> | |
| </div> | |
| <p class="mt-4 max-w-xs text-gray-400"> | |
| Web scraping tool for ethically collecting and exporting publicly available data. | |
| </p> | |
| </div> | |
| <div class="grid grid-cols-2 md:grid-cols-3 gap-8"> | |
| <div> | |
| <h3 class="text-lg font-semibold mb-4">Resources</h3> | |
| <ul class="space-y-2"> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Documentation</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">API Reference</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Tutorials</a></li> | |
| </ul> | |
| </div> | |
| <div> | |
| <h3 class="text-lg font-semibold mb-4">Company</h3> | |
| <ul class="space-y-2"> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">About</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Blog</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Careers</a></li> | |
| </ul> | |
| </div> | |
| <div> | |
| <h3 class="text-lg font-semibold mb-4">Legal</h3> | |
| <ul class="space-y-2"> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Privacy</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Terms</a></li> | |
| <li><a href="#" class="text-gray-400 hover:text-white transition">Compliance</a></li> | |
| </ul> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="mt-12 pt-8 border-t border-gray-800 text-sm text-gray-400 text-center"> | |
| © 2023 LiveScrape. All rights reserved. | |
| </div> | |
| </div> | |
| </footer> | |
| <script> | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const scrapeBtn = document.getElementById('scrape-btn'); | |
| const downloadCsvBtn = document.getElementById('download-csv'); | |
| const downloadXlsxBtn = document.getElementById('download-xlsx'); | |
| const searchInput = document.getElementById('search-query'); | |
| const statusContainer = document.getElementById('status-container'); | |
| const statusPlaceholder = document.getElementById('status-placeholder'); | |
| const statusText = document.getElementById('status-text'); | |
| const progressText = document.getElementById('progress-text'); | |
| const progressBar = document.getElementById('progress-bar'); | |
| const resultPreview = document.getElementById('result-preview'); | |
| const recordCount = document.getElementById('record-count'); | |
| const resultSource = document.getElementById('result-source'); | |
| // Sample data for demonstration | |
| const sampleData = [ | |
| {name: "New York Medical Center", address: "123 Medical Dr, New York", phone: "(212) 555-1234", rating: "4.8"}, | |
| {name: "Manhattan General Hospital", address: "456 Health Ave, Manhattan", phone: "(212) 555-5678", rating: "4.6"}, | |
| {name: "Central City Metro Health", address: "789 Care Blvd, Brooklyn", phone: "(718) 555-4321", rating: "4.7"}, | |
| {name: "Queen's Medical Center", address: "101 Forest Hills Ln, Queens", phone: "(718) 555-9876", rating: "4.5"}, | |
| {name: "Bronx Community Hospital", address: "321 Wellness Rd, Bronx", phone: "(917) 555-6789", rating: "4.3"}, | |
| {name: "Staten Island Health", address: "987 Healers Way, Staten Island", phone: "(347) 555-4567", rating: "4.4"}, | |
| {name: "Downtown Medical Plaza", address: "654 Center St, Manhattan", phone: "(646) 555-2345", rating: "4.2"}, | |
| {name: "Upper East Side Health", address: "789 Park Ave, New York", phone: "(212) 555-8765", rating: "4.9"}, | |
| {name: "West Side Urgent Care", address: "567 Broadway, New York", phone: "(212) 555-2341", rating: "4.3"}, | |
| {name: "City Children's Hospital", address: "333 Hope Ave, Bronx", phone: "(201) 555-8765", rating: "4.8"}, | |
| ]; | |
| // Simulate scraping progress | |
| function simulateScraping() { | |
| if (!searchInput.value.trim()) { | |
| alert('Please enter a search query'); | |
| return; | |
| } | |
| // Show status container | |
| statusPlaceholder.classList.add('hidden'); | |
| statusContainer.classList.remove('hidden'); | |
| // Disable button while scraping | |
| scrapeBtn.disabled = true; | |
| scrapeBtn.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> Scraping...'; | |
| // Reset progress | |
| let progress = 0; | |
| progressBar.style.width = '0%'; | |
| progressText.textContent = '0%'; | |
| // Create fake progress for demo | |
| const interval = setInterval(() => { | |
| progress += Math.floor(Math.random() * 15) + 5; | |
| if (progress >= 100) progress = 100; | |
| progressBar.style.width = `${progress}%`; | |
| progressText.textContent = `${progress}%`; | |
| // Update status text based on progress | |
| if (progress < 25) { | |
| statusText.textContent = "Accessing search engines..."; | |
| } else if (progress < 50) { | |
| statusText.textContent = "Retrieving search results..."; | |
| } else if (progress < 75) { | |
| statusText.textContent = "Scraping data from search results..."; | |
| } else if (progress < 95) { | |
| statusText.textContent = "Cleaning and structuring data..."; | |
| } else { | |
| statusText.textContent = "Preparing for export..."; | |
| } | |
| if (progress === 100) { | |
| clearInterval(interval); | |
| setTimeout(finishScraping, 800); | |
| } | |
| }, 500); | |
| } | |
| // Finish scraping simulation | |
| function finishScraping() { | |
| // Reset button | |
| scrapeBtn.disabled = false; | |
| scrapeBtn.innerHTML = '<i class="fas fa-bolt mr-2 animate-pulse-slow text-yellow-300"></i> Scrape'; | |
| // Enable download buttons | |
| downloadCsvBtn.disabled = false; | |
| downloadXlsxBtn.disabled = false; | |
| // Display success status | |
| statusText.innerHTML = '<i class="fas fa-check-circle text-green-500 mr-2"></i> Scraping complete!'; | |
| // Update record counter | |
| recordCount.textContent = `${sampleData.length} records`; | |
| // Set result source (random example) | |
| const sources = ['Google', 'Bing', "DuckDuckGo", 'Public Data Source']; | |
| resultSource.textContent = `Source: ${sources[Math.floor(Math.random() * sources.length)]}`; | |
| // Show preview data | |
| resultPreview.innerHTML = ''; | |
| sampleData.forEach((item, index) => { | |
| const row = document.createElement('tr'); | |
| row.className = index % 2 === 0 ? 'bg-white border-b' : 'bg-gray-50 border-b'; | |
| row.innerHTML = ` | |
| <th scope="row" class="px-6 py-4 font-medium text-gray-900"> | |
| ${item.name} | |
| </th> | |
| <td class="px-6 py-4"> | |
| ${item.address} | |
| </td> | |
| <td class="px-6 py-4"> | |
| ${item.phone} | |
| </td> | |
| <td class="px-6 py-4"> | |
| <div class="inline-flex items-center bg-yellow-100 text-yellow-800 text-sm px-2 py-1 rounded"> | |
| <i class="fas fa-star mr-1 text-yellow-500"></i> ${item.rating} | |
| </div> | |
| </td> | |
| `; | |
| resultPreview.appendChild(row); | |
| }); | |
| } | |
| // Download functions (simulated) | |
| function downloadCsv() { | |
| alert(`CSV download started for: ${searchInput.value || 'your search'}`); | |
| } | |
| function downloadXlsx() { | |
| alert(`Excel download started for: ${searchInput.value || 'your search'}`); | |
| } | |
| // Event listeners | |
| scrapeBtn.addEventListener('click', simulateScraping); | |
| downloadCsvBtn.addEventListener('click', downloadCsv); | |
| downloadXlsxBtn.addEventListener('click', downloadXlsx); | |
| // Enable scraping if Enter is pressed in the search box | |
| searchInput.addEventListener('keypress', function(e) { | |
| if (e.key === 'Enter') { | |
| simulateScraping(); | |
| } | |
| }); | |
| }); | |
| </script> | |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=madansa7/webscrapper" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
| </html> |