Как парсить крупные маркетплейсы по типу Ozon, DNS и другие
Решил освоить тему парсинга. Нашёл первый же гайд на ютубе. Решил с ходу повторять за автором, но вместо парсинга каких-то малоизвестных сайтов, решил собрать информацию с 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 & 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 файл явно не имеет с тем, что находится по ссылке. Я так понимаю, озону не очень хочется иметь дело с ботами и поэтому я и получаю подобный ответ. Схожие ситуации я видел и на других крупных сайтах, когда менял ссылку. И возникает вопрос: как обходить подобные ограничения? Есть ли какой-то общий шаблон для обхода или у всех сайтов индивидуальный подход?