Расшифровка данных о шансах путем перехвата ответовPython

Программы на Python
Ответить
Anonymous
 Расшифровка данных о шансах путем перехвата ответов

Сообщение Anonymous »

Код: Выделить всё

import asyncio
from datetime import datetime, UTC
from playwright.async_api import async_playwright

captured = []

async def run():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()

async def handle_response(response):
url = response.url.lower()

if any(k in url for k in ("feed", "ajax", "match", "odds")):
try:
content_type = response.headers.get("content-type", "")
if content_type.startswith("application/json"):
data = await response.json()
captured.append({
"url": response.url,
"data": data,
"captured_at": datetime.now(UTC).isoformat(),
})
print(f"Captured: {response.url}")
except Exception:
pass  # ignore non-JSON payloads

page.on("response", handle_response)

await page.goto(
"https://www.oddsportal.com/football/england/premier-league/",
wait_until="networkidle",
)

await asyncio.sleep(5)
print("Captured responses:", len(captured))
await browser.close()

asyncio.run(run())

Мой результат:

Код: Выделить всё

Captured responses: 0
Мы ожидаем захвата полезных данных JSON, содержащих данные о коэффициентах или совпадениях, например:

Код: Выделить всё

 {
"matches": [
{
"id": 123,
"home": "Arsenal",
"away": "Chelsea",
"details": {
"1x2 Match Winner": {
"1": "1.39",
"X": "4.83",
"2": "5.15"
},
"Full Time Over/Under": {
"Over/Under +3.5": {
"Over": "N/A",
"Under": "N/A"
},
"Over/Under +4.5": {
"Over": "1.21",
"Under": "3.58"
},
"Over/Under +4.5": {
"Over": "1.21",
"Under": "3.58"
},
"Over/Under +5": {
"Over": "N/A",
"Under": "N/A"
},}
}
]
}
Постановка проблемы
Oddsportal намеренно загружает данные через нестандартные/запутанные ответы, которые
  • не могут быть проанализированы с помощью response.json()
  • Их фактический API скрыт
  • При переходе по вкладкам (например, «Гандикап», «1X2») это продолжает вызывать запрос на получение https://www.oddsportal.com/pl/match-eve ... IN&lang=pl, и этот ответ представляет собой всего лишь несколько цифр, поэтому верьте, что веб-сайт его расшифровывает
Вместо того, чтобы ждать браузер для отображения текста на экране (анализ DOM), мы перехватываем необработанные данные, поступающие с сервера.
  • Идея: когда вы нажимаете вкладку (например, «Гандикап», «1X2»), браузер запрашивает данные с сервера. Мы фиксируем этот ответ JSON напрямую.
  • Преимущество: нулевые затраты на рендеринг. Вы получаете данные мгновенно, не дожидаясь обновления пользовательского интерфейса.


Подробнее здесь: https://stackoverflow.com/questions/798 ... terception
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»