Меню
Парсер 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)