🔹 Реализовал на Patchright и Scrapy.
🔹 Логика работы: загружаем контент с динамического сайта конкурента, затем передаём данные в Scrapy для многопоточного парсинга и сохранения данных в папку на сервере.
🔹 Конфиг Patchright (используется реальный браузер Chrome):
context = await p.chromium.launch_persistent_context(
user_data_dir=user_data_dir,
channel="chrome",
headless=True,
no_viewport=True
)
🔹 Отключаю загрузку картинок и видео для ускорения работы и экономии ресурсов:
await context.route("**/*.{png,jpg,jpeg,gif,webp,svg,mp4,avi,mov}", lambda route: route.abort())
🔹 Контент страницы подгружается только по мере скролинга, поэтому был реализован быстрый скролл до конца страницы с помощью цикла:
page = await context.new_page()
await page.goto(url)
await page.wait_for_load_state("domcontentloaded")
if await page.evaluate("document.body.scrollHeight > window.innerHeight"):
last_position = 0
while True:
await page.evaluate("window.scrollBy(0, 50000);")
await asyncio.sleep(0.5)
new_position = await page.evaluate("window.scrollY")
if new_position == last_position:
break
last_position = new_position
🔹 Конфиг Scrapy для многопоточного парсинга:
process = CrawlerProcess(settings={
'CONCURRENT_REQUESTS': MAX_CONCURRENT_TASKS,
'LOG_LEVEL': 'ERROR',
'RANDOMIZE_DOWNLOAD_DELAY': True,
'HTTPCACHE_ENABLED': True,
'HTTPCACHE_EXPIRATION_SECS': 86400,
'RETRY_ENABLED': True,
'RETRY_TIMES': 5,
'RETRY_HTTP_CODES': [500, 502, 503, 504, 408, 429, 403, 404, 410],
'COOKIES_ENABLED': True,
'DEFAULT_REQUEST_HEADERS': headers,
'ROBOTSTXT_OBEY': False
})
🔹 Результат: быстрая обработка больших объемов данных, загрузка 5000 файлов занимает в районе 1 минуты, при проблемах скачивания программа автоматически делает повторные попытки в к-ве 5 штук, к-во потоков - 15.
