Как парсить крупные маркетплейсы по типу Ozon, DNS и другие

Рейтинг: 2Ответов: 3Опубликовано: 20.03.2023

Решил освоить тему парсинга. Нашёл первый же гайд на ютубе. Решил с ходу повторять за автором, но вместо парсинга каких-то малоизвестных сайтов, решил собрать информацию с OZON. Собственно говоря, вот простой пример кода, точь в точь, как в видео, но с другой ссылкой.

from bs4 import BeautifulSoup
import requests

URL = "https://www.ozon.ru/category/python-parsing/"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0"
}

response = requests.get(URL, headers=headers)
print(response.text)

У автора всё, ясное дело, работает, как по маслу и он получает полную html страницу, в то время, как я получаю вот это:

<!DOCTYPE html>
<html lang="en-US">
<head>
    <title>Just a moment...</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta name="robots" content="noindex,nofollow">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="/cdn-cgi/styles/challenges.css" rel="stylesheet">
    

</head>
<body class="no-js">
    <div class="main-wrapper" role="main">
    <div class="main-content">
        <h1 class="zone-name-title h1">
            <img class="heading-favicon" src="/favicon.ico" alt="Icon for www.ozon.ru"
                 onerror="this.onerror=null;this.parentNode.removeChild(this)">
            www.ozon.ru
        </h1>
        <h2 class="h2" id="challenge-running">
            Checking if the site connection is secure
        </h2>
        <noscript>
            <div id="challenge-error-title">
                <div class="h2">
                    <span class="icon-wrapper">
                        <div class="heading-icon warning-icon"></div>
                    </span>
                    <span id="challenge-error-text">
                        Enable JavaScript and cookies to continue
                    </span>
                </div>
            </div>
        </noscript>
        <div id="trk_jschal_js" style="display:none;background-image:url('/cdn-cgi/images/trace/managed/nojs/transparent.gif?ray=7ab069e89a609d55')"></div>
        <div id="challenge-body-text" class="core-msg spacer">
            www.ozon.ru needs to review the security of your connection before proceeding.
        </div>
        <form id="challenge-form" action="/category/python-parsing/?__cf_chl_f_tk=mgaVH1N1dJ_vEl061HhFwtE7KUFA_yxGJXn3HRXB.Gc-1679341088-0-gaNycGzNCPs" method="POST" enctype="application/x-www-form-urlencoded">
            <input type="hidden" name="md" value="wj4v0kwjsqvhZV5Muar.7VRGIuU0Pn2XkupLAxpB0Z4-1679341088-0-AXtM9mc7vp5btB4NIzVuKdDaIzZu7gUWyzkkX_ajubKCg6dYafxT5WCZ_BwKyOxqvImffwbqT0dmrpzuJ-rVvlyaPLSoqy8LcigPXaBQjnNe8ZgzFQP_FW3W33bvLljvZAFC0KqY7ck-ieOfkDQqxcn3IegHX4XXbd2_ifiLsV6UyIg71mtcAxWMud9ZmPyqhcxvgCPJvEC3Kk4m30AKQEVBxKFIivcvRkncgy0nd2Crl67VoDepqdS0qGeoDS0TvuuNJHA0dYVd6BdHwWGHeD5jR170kqpUG5dYTIohBGj_n8YgVuFfQRlmfhoofEUqFOi4FliT0Ic02RFyND95C4BFuRWmnyn1HDYd3yVtLkSvwZzOlDVKF1qhUzTPM8SzOA_4mwJGuz6nGtDpdNmPr5NS8qZEFfZZ8BnTPOAg9u1EHyiy08Gp0MOitHUDoNFYyG8BFPBcJlO0SEMdnNALdvy_-tHsMphs3lAX1KVr3NGQsk25bNQXL9BCm5Wy-2gkA32G2b__h5twbi1EwQdeWOyKbobiLkMI0Oq-sMKYRdie0NA4-ZVVuuIfKO4F_XZX0QsYNBNraeG-0HVluxIwEQZ-TUZ0GG3JThzJDmnqH5d8Pkty1wJK7zDRVFJ_XaG-5rZdyoTzn2LKLPUhJsTyJI0lZzmNcJUnSExhqniDIdnQzuXzURxga4ZqEpdy9YhehMNz1iTRZjf0NLREOt0POeRSNhMDG9-pPMuIg4Xq-iPiH4jCbjC9qPrCzpNDFD8WJlWiBXIHEFg0zXSz82ZrJUtvMFBJxQWXgrgoZGKnGYkHJ41zsdwTgJMMWISJdFylkN22DVDq8rWl0304cDzsoI8vKR4cF_7JwlUJxPqpFyewF9JX3HWrIwa2mYU7r_UWFxLvUF-gCq6CgVVEpjFI5ySC8kTixRgy2SHpDaQTl24XAzNY26uVDeGr8eAKrxcaYlQFkN8nPLZrDA7kj1PGehelK0hrkxkAwrFEkB1KVQB32vwG2CWOiOCGYvxxOdnzar7OUTbuNJOMR3ji3QzWcXuPS02zsMP0EqpxdGCrJGfpBA-AWjbLKLPYw6M2ZCQeGzrnI4RbErbNU2FeKuyKm-EhAQt2df6BJnFyFwJI8rUu4nbTvkpFFkdwV5JbYc8N32sOWxnIkZfcXRlr-IZmEJbsUsqzGgL8FW1MzU4GiHmPbNs5ZdHwUQJRCuz2e2ndjyVNno8U8BNO1pu85R00Nv-v2cJLGDzx8jNyndvNexHpG4ZInAB9lML8_U_Jtz9EKvMrQre5CGLyG_HPS3whU6ol76WlcsP53mCw_N9hr9T81C8wyrZJdwUTnGgKIbUjPchAza3q98zaoyHlIkwC-cQ_yqEdtP0ru1LNcKT80Ya-FyE1xgYgFYGUAXCtn4_Pm9f58h_9SyJZ7VO5mtZLgK0inS-MT_iKYsTsxA6JC_Wo79S0RunRVn3G6FAjM_jq_zswh_ZbqADRJkZghG548xUeuh4lgcCAbct0JgF6ZckoZeYP4beUtovy9mMfQKROgLRAmQZtsVT7oHMV837ORuk0xtp-ufLAe60ZI7Kt5UdMh5DI-UoR8vm4lCAMaf48yUqBg-g1kV9usCL2acMaXOKNaRcsOOkdDGc2KAYacSYcNm8qGX6lwEo6cQjHs8C_UjBu_CNd30VRoAR3ZUov18HdZqLZmqz5hENQ-o0zDpcWf1xPR27qDaddeHi4j5_6kwrzj96ptaBMyDtOTewQj9YbTtargNx2eYgL0ac3QTq4CZDwoAEMPEOkumGtfYzMJ2gipTPpw5MiuNZL9hFTivqvus9yaqN9Kbu9otJ7gQm8o37OBanZaQiHSimLVo3qvolrmOPmrfT12MGQWXQXUXwQmXvjPGBv-LE2YwETe5KLs5adNJFNffyglJ7ruve33E9a32x0EEo6c8l0zzqmKqR0kXAr0O2fCE5CqOmONJrpdmJhCz5y0z_M9dyZtPXl8_5e5w2xVO8-6Hi6ZKJXbiPoXRnzG9-fOxuk11jgJSz_3cuYURT9sgFwGnhNj5ffMDBlihiLPyK3TBhWb0_9COldg9x8w1vqO2gBtPOHMwYY2nSfqzYPVaFA-B14jZMr0VmCLmyDjfiMiOl8Cdb8emr1q9x3vyyg4iSXC7zaEWx_9P7XNUyeV-7Jyc_0XWTMz5QIayha6j8XQVh6qUbKGOwnaIVTIcrDtKJrMt9TnhK0clO76XZrYFlO-ZqGcKcYQA">
        </form>
    </div>
</div>
<script>
    (function(){
        window._cf_chl_opt={
            cvId: '2',
            cZone: 'www.ozon.ru',
            cType: 'managed',
            cNounce: '75480',
            cRay: '7ab069e89a609d55',
            cHash: '2337fb4b1388d6c',
            cUPMDTk: "\/category\/python-parsing\/?__cf_chl_tk=mgaVH1N1dJ_vEl061HhFwtE7KUFA_yxGJXn3HRXB.Gc-1679341088-0-gaNycGzNCPs",
            cFPWv: 'g',
            cTTimeMs: '1000',
            cMTimeMs: '0',
            cTplV: 4,
            cTplB: 'cf',
            cK: "",
            cRq: {
                ru: 'aHR0cHM6Ly93d3cub3pvbi5ydS9jYXRlZ29yeS9weXRob24tcGFyc2luZy8=',
                ra: 'TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6MTAxLjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTAxLjA=',
                rm: 'R0VU',
                d: 'Kkymxbhlc6np7JrZJ9J4xYoItezawSumsdW0D7f/vqw0TpGoMqXosmLwgLqP1cLSd0RCyMGHJAbdtXexD+UX/qRMYn3Gh5aB76jZUQDSUp0ql+YaZb3v1U3s16FKnbHEoGL6QzgtBAEBHLyaH2NP/EbTA4rO25ct/mnLTeCLDelbNKvfBwVnGKmF/Bjf1cewoBBTYiRN4Gf62c6h8aYglNpV7FPdDZ5dWfrl6vpXj7/9QMNZolj2oiSutXwdN59BJlU59gGKCUj0FIXHB108liTcmeqTHXNRm4gL959pvxTdDJ6eaoJtTa3nJB+Nsm3cL7srRnZImXgAOxGpF5m++Gw3ybjyneQuW2HeuQNgAaRXcA65KnxLmsrzfYFArbNVRL3ddSr3Y8Ejt6zXHa9ffOa9HlorRlBwmFKD+Oh56/tkp046FmiJgSGyVGtAtrRHekqG60tJLxRoLxGkP8NuifgetaVISXAAZMHXyS5P0cvNPHwnU3pEuWhd7GiFJ71y2//3FOkb13eMVIfRWg6TMOk7YkDwQGLvetEHv2Oy9EYNpafDDBxmfY1u1OZyfSaiRYIO7DorOd/U6sTGpv1HkrLgilMr1SGKdl9PlUd36QQgpFcjEaJxIBzaveGb/R5KqGjikyy2/OAjrv6Jw8KjPpvBx+G6xuPoi8peUEH8q9XhULIbe9OJrjlRqB006Sey',
                t: 'MTY3OTM0MTA4OC4xMDEwMDA=',
                m: '8IHRffWnhD08X8dzkmMQ3TlgFN9pGaJWaTekuYf9AoE=',
                i1: 'xAdfJV0Ak6ApqbTA2q+BMA==',
                i2: 'dBsKoCvMjcImGiifIK63Pw==',
                zh: 'BeG1Y6okiAexwvHls5N2EZU105or2Splnt04RFuP4eg=',
                uh: '0NkkKy6upVyRnG3K4yRzgPFx2YEn2KrA6wDA09kQVB8=',
                hh: 'QkfpengPNcR0cQs7TqBhQQRdgaWKMmnpIF3CGO6XxRU=',
            }
        };
        var trkjs = document.createElement('img');
        trkjs.setAttribute('src', '/cdn-cgi/images/trace/managed/js/transparent.gif?ray=7ab069e89a609d55');
        trkjs.setAttribute('alt', '');
        trkjs.setAttribute('style', 'display: none');
        document.body.appendChild(trkjs);
        var cpo = document.createElement('script');
        cpo.src = '/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=7ab069e89a609d55';
        window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash;
        window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, location.href.length - window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search;
        if (window.history && window.history.replaceState) {
            var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash;
            history.replaceState(null, null, "\/category\/python-parsing\/?__cf_chl_rt_tk=mgaVH1N1dJ_vEl061HhFwtE7KUFA_yxGJXn3HRXB.Gc-1679341088-0-gaNycGzNCPs" + window._cf_chl_opt.cOgUHash);
            cpo.onload = function() {
                history.replaceState(null, null, ogU);
            };
        }
        document.getElementsByTagName('head')[0].appendChild(cpo);
    }());
</script>


    <div class="footer" role="contentinfo">
        <div class="footer-inner">
            <div class="clearfix diagnostic-wrapper">
                <div class="ray-id">Ray ID: <code>7ab069e89a609d55</code></div>
            </div>
            <div class="text-center" id="footer-text">Performance &amp; security by <a rel="noopener noreferrer" href="https://www.cloudflare.com?utm_source=challenge&utm_campaign=m" target="_blank">Cloudflare</a></div>
        </div>
    </div>
</body>
</html>


Process finished with exit code 0

Ничего общего данный html файл явно не имеет с тем, что находится по ссылке. Я так понимаю, озону не очень хочется иметь дело с ботами и поэтому я и получаю подобный ответ. Схожие ситуации я видел и на других крупных сайтах, когда менял ссылку. И возникает вопрос: как обходить подобные ограничения? Есть ли какой-то общий шаблон для обхода или у всех сайтов индивидуальный подход?

Ответы

▲ 1

С 2022 года на Озон стоит защита от парсинга. Все способы, предложенные ранее этого года, потеряли актуальность. Попробуйте эту библиотеку: https://github.com/ultrafunkamsterdam/undetected-chromedriver. Мне помогло решить проблему. Библиотека работает с Selenium, помогает обходить проверки. Но это решение все равно медленное. Смотрите в сторону Selenium + прокси сервера.

▲ 1

Попробуй drissionpage(хоть и китайцы придумали, но работает круто). По крайней мере это самая лучшая библиотека, которая обходила в моих проектах, практически, любую защиту (включая cloudflare, etc)

▲ 0

Забавно будет, если они прикроют лазейку эту

Разбери откуда приходит json файл ответа сервера, адрес должен быть такой https://www.ozon.ru/api/entrypoint-api.bx/page/json/v2 у тебя в ответе будет еще параметр - params например с юрлом товара params = { 'url': '/product/тут юрл товара', }

Затем сформируй curl запрос через https://curlconverter.com/

И используй библиотеку curl-cffi, а не обычный requests