
Тот же результат показывает, когда я включаю безголовый режим.
Изменить: я только что понял, что HTML-код ответа имеет заголовок «Минуточку...», который я видел на HTML-коде страницы Cloudflare. Ошибка, вероятно, возникает из-за Cloudflare, а не из-за фактического сайта, который я сканирую, а это означает, что мой скрипт определяется как бот. Пытаюсь найти, какие файлы cookie/заголовки использовать, чтобы обойти это.
HTML-ответ: Pastebin1
HTML-запрос: Pastebin2
Request: GET https://kick.com/api/v1/subcategories?limit=32&page=2 {'cluster': 'v1', 'sec-ch-ua-platform': '"Windows"', 'referer': 'https://kick.com/browse/categories', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'accept': 'application/json', 'sec-ch-ua': '"HeadlessChrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"', 'sec-ch-ua-mobile': '?0'}
Я также пробовал:
- добавить файлы cookie в заголовок запроса с помощью page.set_extra_http_headers. Файлы cookie берутся из инспектора Chrome > Сеть > заголовки запросов.
- замените sec-ch-ua в заголовке запроса на тот, который я получил от Chrome.
- используйте драматургическую скрытность. это не работает. когда я включаю скрытый режим, для рассматриваемого веб-сайта загруженная страница будет пустой.
Завершить редактирование
Ниже приведен мой код:
import asyncio
from playwright.async_api import async_playwright
import time
# copied with cookie editor when opening the page with chrome
cookies = [
{
"domain": "kick.com",
"expirationDate": 1726721839.170133,
"name": "KP_UIDz-ssn",
"path": "/",
"value": "02drFYb8SXDKZm1tttHbDxrjgNuDdR4yBLOBCmEN9sCjbepNK6vZ1ESDUhPkXwwGDbuhype6dcvmnxsMesfoHNevNIZD4Htf8KWlaDjuN30u2N6SIIJciTgkEWG5nX8cWHWrf5qXLq8NU1SGriiT6yIfuTYvqEG3fvO1Kb"
},
{
"domain": ".kick.com",
"name": "__cf_bm",
"path": "/",
"value": "CmeY2iVdWeXaYGUuIDyRMRxDgMQjYhZcl3we_Qy8pW8-1726689886-1.0.1.1-mLpIWwhnp3_zmFV7.bmPiIafI7q_BdbQduJiSxKUcOOCFPV.3r3Yb.p36MT3Sa1Ubq2TCTVOuilQEV3X6u0kjw"
},
{
"domain": ".kick.com",
"name": "__stripe_mid",
"path": "/",
"value": "50b6ac3c-0cc6-44de-b64a-916706484819d40fd7"
},
{
"domain": ".kick.com",
"name": "__stripe_sid",
"path": "/",
"value": "2d4b8647-0a68-46f9-8921-e8ce26409063280566"
}
]
PAGE_DOWN_JS = """
div = document.querySelector('#main-container');
div.scrollBy(0, window.innerHeight);
"""
async def handle_response(response):
# Get the response body as text
html_content = await response.body()
print(f"Response: {html_content.decode('utf-8')}")
async def main():
async with async_playwright() as p:
# Launch the browser
browser = await p.chromium.launch(headless=True, args=["--start-maximized"])
context = await browser.new_context(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
await context.add_cookies(cookies)
page = await context.new_page()
# Navigate to the website
await page.goto('https://kick.com/browse/categories')
await page.wait_for_selector("#main-container")
button = page.locator("div.flex.flex-row.items-center.justify-center.gap-2>button>>nth=0")
await button.click()
await page.screenshot(path="/Users/gxsong/kick/screenshot_before.png")
page.on("console", lambda msg: print(f"Console [{msg.type}]: {msg.text}"))
page.on("response", lambda response: asyncio.create_task(handle_response(response)))
# Evaluate some JavaScript code on the page
await page.evaluate('''
window.addEventListener('scroll', function() {
console.log('Scrolled! Current scroll position:', window.scrollY);
});
''')
for i in range(10):
await page.evaluate(PAGE_DOWN_JS)
time.sleep(10)
# Get the loaded content of the page
await page.screenshot(path="/Users/gxsong/kick/screenshot.png")
page_content = await page.content()
# print(page_content)
# Close the browser
await browser.close()
# Run the async function
asyncio.run(main())
Подробнее здесь: https://stackoverflow.com/questions/790 ... and-user-a