
# Continue with more scraper implementations

# 8. scrapers/linkedin_scraper.py
files_content['scrapers/linkedin_scraper.py'] = """\"\"\"LinkedIn job scraper\"\"\"

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from scrapers.base_scraper import BaseScraper
import time

class LinkedInScraper(BaseScraper):
    \"\"\"Scraper for LinkedIn jobs\"\"\"
    
    def __init__(self, settings):
        super().__init__(settings)
        self.platform = 'LinkedIn'
        self.base_url = 'https://www.linkedin.com'
    
    def login(self):
        \"\"\"Login to LinkedIn\"\"\"
        try:
            self.logger.info("Logging in to LinkedIn...")
            self.driver.get(f"{self.base_url}/login")
            self.random_delay()
            
            # Enter email
            email_input = self.safe_find_element(By.ID, 'username')
            if email_input:
                email_input.send_keys(self.settings.linkedin_email)
                self.random_delay(0.5, 1)
            
            # Enter password
            password_input = self.safe_find_element(By.ID, 'password')
            if password_input:
                password_input.send_keys(self.settings.linkedin_password)
                self.random_delay(0.5, 1)
            
            # Click login
            login_button = self.safe_find_element(By.XPATH, '//button[@type="submit"]')
            if login_button:
                self.safe_click(login_button)
                self.random_delay(3, 5)
            
            self.logger.info("Successfully logged in to LinkedIn")
            return True
            
        except Exception as e:
            self.logger.error(f"LinkedIn login failed: {str(e)}")
            return False
    
    def scrape_jobs(self):
        \"\"\"Scrape job listings from LinkedIn\"\"\"
        jobs = []
        
        try:
            # Login first
            if not self.login():
                return jobs
            
            # Navigate to jobs page
            for job_title in self.settings.job_titles:
                for location in self.settings.locations:
                    self.logger.info(f"Searching for {job_title} in {location}...")
                    
                    # Build search URL
                    search_url = self._build_search_url(job_title, location)
                    self.driver.get(search_url)
                    self.random_delay(2, 4)
                    
                    # Scroll and load more jobs
                    self._scroll_to_load_jobs()
                    
                    # Extract job listings
                    job_cards = self.driver.find_elements(By.CSS_SELECTOR, '.job-card-container')
                    self.logger.info(f"Found {len(job_cards)} job cards")
                    
                    for card in job_cards[:20]:  # Limit to first 20
                        try:
                            job_data = self._extract_job_data(card)
                            if job_data:
                                jobs.append(job_data)
                        except Exception as e:
                            self.logger.warning(f"Failed to extract job: {str(e)}")
                            continue
        
        except Exception as e:
            self.logger.error(f"Error scraping LinkedIn jobs: {str(e)}")
        
        return jobs
    
    def _build_search_url(self, job_title, location):
        \"\"\"Build LinkedIn job search URL\"\"\"
        job_title_encoded = job_title.replace(' ', '%20')
        location_encoded = location.replace(' ', '%20')
        
        url = f"{self.base_url}/jobs/search/?"
        url += f"keywords={job_title_encoded}"
        url += f"&location={location_encoded}"
        
        if self.settings.easy_apply_only:
            url += "&f_AL=true"  # Easy Apply filter
        
        return url
    
    def _scroll_to_load_jobs(self):
        \"\"\"Scroll to load more jobs\"\"\"
        last_height = self.driver.execute_script("return document.body.scrollHeight")
        
        for _ in range(3):  # Scroll 3 times
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            self.random_delay(1, 2)
            
            new_height = self.driver.execute_script("return document.body.scrollHeight")
            if new_height == last_height:
                break
            last_height = new_height
    
    def _extract_job_data(self, card):
        \"\"\"Extract job data from job card\"\"\"
        try:
            # Extract job details
            title_elem = card.find_element(By.CSS_SELECTOR, '.job-card-list__title')
            company_elem = card.find_element(By.CSS_SELECTOR, '.job-card-container__company-name')
            location_elem = card.find_element(By.CSS_SELECTOR, '.job-card-container__metadata-item')
            link_elem = card.find_element(By.CSS_SELECTOR, 'a')
            
            job_data = {
                'title': title_elem.text.strip(),
                'company': company_elem.text.strip(),
                'location': location_elem.text.strip(),
                'url': link_elem.get_attribute('href'),
                'platform': 'LinkedIn'
            }
            
            return job_data
            
        except Exception as e:
            self.logger.warning(f"Failed to extract job data: {str(e)}")
            return None
"""

# 9. scrapers/naukri_scraper.py
files_content['scrapers/naukri_scraper.py'] = """\"\"\"Naukri.com job scraper\"\"\"

from selenium.webdriver.common.by import By
from scrapers.base_scraper import BaseScraper

class NaukriScraper(BaseScraper):
    \"\"\"Scraper for Naukri.com jobs\"\"\"
    
    def __init__(self, settings):
        super().__init__(settings)
        self.platform = 'Naukri'
        self.base_url = 'https://www.naukri.com'
    
    def login(self):
        \"\"\"Login to Naukri\"\"\"
        try:
            self.logger.info("Logging in to Naukri...")
            self.driver.get(f"{self.base_url}/nlogin/login")
            self.random_delay(2, 3)
            
            # Enter email
            email_input = self.safe_find_element(By.ID, 'usernameField')
            if email_input:
                email_input.send_keys(self.settings.naukri_email)
                self.random_delay(0.5, 1)
            
            # Enter password
            password_input = self.safe_find_element(By.ID, 'passwordField')
            if password_input:
                password_input.send_keys(self.settings.naukri_password)
                self.random_delay(0.5, 1)
            
            # Click login
            login_button = self.safe_find_element(By.XPATH, '//button[@type="submit"]')
            if login_button:
                self.safe_click(login_button)
                self.random_delay(3, 5)
            
            self.logger.info("Successfully logged in to Naukri")
            return True
            
        except Exception as e:
            self.logger.error(f"Naukri login failed: {str(e)}")
            return False
    
    def scrape_jobs(self):
        \"\"\"Scrape job listings from Naukri\"\"\"
        jobs = []
        
        try:
            # Login first
            if not self.login():
                return jobs
            
            # Search for jobs
            for job_title in self.settings.job_titles:
                for location in self.settings.locations:
                    self.logger.info(f"Searching Naukri for {job_title} in {location}...")
                    
                    # Build search URL
                    search_url = self._build_search_url(job_title, location)
                    self.driver.get(search_url)
                    self.random_delay(2, 4)
                    
                    # Extract job listings
                    job_cards = self.driver.find_elements(By.CSS_SELECTOR, '.jobTuple')
                    self.logger.info(f"Found {len(job_cards)} jobs on Naukri")
                    
                    for card in job_cards[:20]:
                        try:
                            job_data = self._extract_job_data(card)
                            if job_data:
                                jobs.append(job_data)
                        except Exception as e:
                            self.logger.warning(f"Failed to extract job: {str(e)}")
                            continue
        
        except Exception as e:
            self.logger.error(f"Error scraping Naukri jobs: {str(e)}")
        
        return jobs
    
    def _build_search_url(self, job_title, location):
        \"\"\"Build Naukri search URL\"\"\"
        job_title_encoded = job_title.replace(' ', '-')
        location_encoded = location.replace(' ', '-')
        
        url = f"{self.base_url}/{job_title_encoded}-jobs-in-{location_encoded}"
        return url
    
    def _extract_job_data(self, card):
        \"\"\"Extract job data from job card\"\"\"
        try:
            title_elem = card.find_element(By.CSS_SELECTOR, '.title')
            company_elem = card.find_element(By.CSS_SELECTOR, '.companyInfo')
            location_elem = card.find_element(By.CSS_SELECTOR, '.location')
            link_elem = card.find_element(By.CSS_SELECTOR, 'a')
            
            job_data = {
                'title': title_elem.text.strip(),
                'company': company_elem.text.strip(),
                'location': location_elem.text.strip(),
                'url': link_elem.get_attribute('href'),
                'platform': 'Naukri'
            }
            
            return job_data
            
        except Exception as e:
            return None
"""

# 10. scrapers/hirist_scraper.py
files_content['scrapers/hirist_scraper.py'] = """\"\"\"Hirist.com job scraper\"\"\"

from selenium.webdriver.common.by import By
from scrapers.base_scraper import BaseScraper

class HiristScraper(BaseScraper):
    \"\"\"Scraper for Hirist.com jobs\"\"\"
    
    def __init__(self, settings):
        super().__init__(settings)
        self.platform = 'Hirist'
        self.base_url = 'https://www.hirist.com'
    
    def login(self):
        \"\"\"Login to Hirist\"\"\"
        try:
            self.logger.info("Logging in to Hirist...")
            self.driver.get(f"{self.base_url}/login")
            self.random_delay(2, 3)
            
            # Hirist login implementation
            # Note: Adjust selectors based on actual Hirist login page
            email_input = self.safe_find_element(By.NAME, 'email')
            if email_input:
                email_input.send_keys(self.settings.hirist_email)
            
            password_input = self.safe_find_element(By.NAME, 'password')
            if password_input:
                password_input.send_keys(self.settings.hirist_password)
            
            login_button = self.safe_find_element(By.XPATH, '//button[contains(text(), "Login")]')
            if login_button:
                self.safe_click(login_button)
                self.random_delay(3, 5)
            
            self.logger.info("Successfully logged in to Hirist")
            return True
            
        except Exception as e:
            self.logger.error(f"Hirist login failed: {str(e)}")
            return False
    
    def scrape_jobs(self):
        \"\"\"Scrape job listings from Hirist\"\"\"
        jobs = []
        
        try:
            if not self.login():
                return jobs
            
            for job_title in self.settings.job_titles:
                search_url = f"{self.base_url}/jobs/{job_title.replace(' ', '-').lower()}"
                self.driver.get(search_url)
                self.random_delay(2, 4)
                
                # Extract job listings (adjust selectors as needed)
                job_cards = self.driver.find_elements(By.CSS_SELECTOR, '.job-card')
                
                for card in job_cards[:15]:
                    try:
                        job_data = self._extract_job_data(card)
                        if job_data:
                            jobs.append(job_data)
                    except:
                        continue
        
        except Exception as e:
            self.logger.error(f"Error scraping Hirist: {str(e)}")
        
        return jobs
    
    def _extract_job_data(self, card):
        \"\"\"Extract job data from card\"\"\"
        try:
            title = card.find_element(By.CSS_SELECTOR, '.job-title').text
            company = card.find_element(By.CSS_SELECTOR, '.company-name').text
            url = card.find_element(By.CSS_SELECTOR, 'a').get_attribute('href')
            
            return {
                'title': title,
                'company': company,
                'location': 'India',  # Default
                'url': url,
                'platform': 'Hirist'
            }
        except:
            return None
"""

print("Created scraper implementations")
print("Total files:", len(files_content))
