Привіт

Hello

Головна

Блог

Досвід

Парсер Indeed

Про мене

Контакти

Меню

Парсер Indeed

Послуги
  • Парсинг сайту

  • Обхід захисту

  • Технології
  • Python, Selenium

  • Cloudflare Bypass

  • Локація та рік
  • Віддалено ©

  • 2023

  • Деталі проєкту ...

    01

    Виклик

    Indeed використовує багаторівневу систему захисту Cloudflare, яка блокує автоматизовані запити. Потрібно було створити рішення для обходу Bot Detection, CAPTCHA-челенджів та fingerprint-аналізу браузера без порушення правил сервісу.

    02

    Рішення

    Розробив кастомний Selenium-драйвер з undetected-chromedriver, ротацією User-Agent, емуляцією людської поведінки (рандомні паузи, скролінг, рух миші) та проксі-пулом для розподілу навантаження.

    03

    Результат

    Стабільний парсер зі швидкістю 500+ вакансій/годину, 95% success rate обходу Cloudflare. Клієнт отримав автоматизований інструмент для моніторингу ринку праці з експортом у CSV/Excel.

    Приклад коду
    # Indeed Parser - Cloudflare Bypass
    from undetected_chromedriver import Chrome, ChromeOptions
    from bs4 import BeautifulSoup
    import random, time, csv
    
    class IndeedScraper:
        def __init__(self):
            self.options = ChromeOptions()
            self.options.add_argument('--disable-blink-features=AutomationControlled')
            self.user_agents = [
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0',
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/120.0.0.0'
            ]
    
        def bypass_cloudflare(self, driver, url):
            """Обхід Cloudflare захисту з емуляцією людської поведінки"""
            driver.get(url)
            time.sleep(random.uniform(3, 7))
    
            # Емуляція скролінгу
            for _ in range(3):
                driver.execute_script(f"window.scrollBy(0, {random.randint(100, 300)})")
                time.sleep(random.uniform(0.5, 1.5))
    
        def extract_company_data(self, soup):
            """Витягування даних компанії"""
            return {
                'company': soup.select_one('.companyName').text.strip(),
                'location': soup.select_one('.companyLocation').text.strip(),
                'website': self.extract_website(soup),
                'email': self.extract_email(soup),
                'phone': self.extract_phone(soup)
            }
    
        def save_to_csv(self, data, filename='indeed_results.csv'):
            """Експорт результатів у CSV"""
            with open(filename, 'w', newline='', encoding='utf-8') as f:
                writer = csv.DictWriter(f, fieldnames=data[0].keys())
                writer.writeheader()
                writer.writerows(data)