Не удается получить JSON с веб-сайта, работает для одного URL, но не для другого

#python #python-3.x

Вопрос:

Поэтому я пытаюсь получить данные с игрового сайта, чтобы выполнить некоторые вычисления и статистику для развлечения и обучения.

Это работает для некоторых api, но не для других. Используя Google Chrome и введя URL-адрес, они оба работают просто отлично.

Этот код работает просто отлично:

 def get_race():
    session = requests.Session()

    payload = {
        'username': Config("USERNAME"), # Get from the environment
        'password': Config("PASSWORD"), # FYI It's free and easy to set up an account to test
    }

    session.post("https://zwiftpower.com/ucp.php?mode=login", data=payload)

    url = "https://zwiftpower.com/cache3/results/2321133_view.json?"
    return session.get(url).json()
 

С другой стороны, этот код не работает:

 def get_primes():
    session = requests.Session()

    payload = {
        'username': Config("USERNAME"),
        'password': Config("PASSWORD"),
    }

    session.post("https://zwiftpower.com/ucp.php?mode=login", data=payload)

    url = "https://zwiftpower.com/api3.php?do=event_primesamp;zid=2321133"
    return session.get(url).json()
 

Я попытался удалить .json(), но, похоже, я даже не вошел в систему.

Заголовки из того, который работает, используя Google chrome

Запрос

 :authority: zwiftpower.com
:method: GET
:path: /cache3/results/2321133_zwift.json?_=1633507608083
:scheme: https
accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: sv-SE,sv;q=0.9,en-US;q=0.8,en;q=0.7,nb;q=0.6
cookie: xxx
dnt: 1
referer: https://zwiftpower.com/events.php?zid=2321133
sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
sec-gpc: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
x-requested-with: XMLHttpRequest
 

Ответ

 content-encoding: gzip
content-type: application/json
date: Wed, 06 Oct 2021 08:06:49 GMT
etag: W/"fe0ed3a7a38ea229ddc7891e5bf88088"
last-modified: Wed, 06 Oct 2021 06:16:21 GMT
server: AmazonS3
vary: Accept-Encoding
via: 1.1 54c4a3ab55229e407630e7a126ca0932.cloudfront.net (CloudFront)
x-amz-cf-id: RLvDk1sWw_xoeS3Eog-5nlU4hhM97zfOe0O8hVCfoWd4emTWrO_Cpw==
x-amz-cf-pop: CPH50-C1
x-amz-version-id: tvjoKrm4gLJ8iuad1F31UODoxpK3Sdd7
x-cache: RefreshHit from cloudfront
x-edge-origin-shield-skipped: 0
 

Headers from the one that doesn’t work, using google chrome

Request

 :authority: zwiftpower.com
:method: GET
:path: /api3.php?do=event_primesamp;zid=2321133amp;_=1633507608084
:scheme: https
accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: sv-SE,sv;q=0.9,en-US;q=0.8,en;q=0.7,nb;q=0.6
cookie: xxx
dnt: 1
referer: https://zwiftpower.com/events.php?zid=2321133
sec-ch-ua: "Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
sec-gpc: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
<x-requested-with: XMLHttpRequest
 

Ответ

 content-encoding: gzip
content-length: 2671
content-type: text/html; charset=UTF-8
date: Wed, 06 Oct 2021 08:06:54 GMT
vary: Accept-Encoding
via: 1.1 54c4a3ab55229e407630e7a126ca0932.cloudfront.net (CloudFront)
x-amz-cf-id: wZp1k5auKXGLi-jaMdgSlH2AhaEIOZ6gCT-GcR8TvuZx_9fILMwW-g==
x-amz-cf-pop: CPH50-C1
x-cache: Miss from cloudfront
x-powered-by: PHP/5.6.40
 

Заголовки из session.get(url).заголовки

Это тот, который работает

 {'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Last-Modified': 'Wed, 06 Oct 2021 11:46:40 GMT', 'x-amz-version-id': 'S2xtY_REBLfKDhjIm1ceS0d46kTVtGYj', 'Server': 'AmazonS3', 'X-Edge-Origin-Shield-Skipped': '0', 'Content-Encoding': 'gzip', 'Date': 'Wed, 06 Oct 2021 12:00:34 GMT', 'ETag': 'W/"601d731f1d16a60000b93246614bd107"', 'Vary': 'Accept-Encoding', 'X-Cache': 'RefreshHit from cloudfront', 'Via': '1.1 7c587fa0463f61b130aff5ca04c29170.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop': 'CPH50-C1', 'X-Amz-Cf-Id': 'QU2CCu0mJSfeQvl8eylggLZDxQasq8fd0ztt9-RRafEYysJGSZ3cvQ=='}
 

Не работает

 {'Content-Type': 'text/html; charset=UTF-8', 'Content-Length': '5951', 'Connection': 'keep-alive', 'Cache-Control': 'private, no-cache="set-cookie"', 'Content-Encoding': 'gzip', 'Date': 'Wed, 06 Oct 2021 12:00:36 GMT', 'Expires': 'Wed, 06 Oct 2021 12:00:36 GMT', 'Set-Cookie': 'CloudFront-Key-Pair-Id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0, CloudFront-Signature=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0, CloudFront-Policy=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0', 'Vary': 'Accept-Encoding', 'X-Powered-By': 'PHP/5.6.40', 'X-Cache': 'Miss from cloudfront', 'Via': '1.1 4272985387a50d2af0b808fc13483a80.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop': 'CPH50-C1', 'X-Amz-Cf-Id': 'xmHSoeibqgAwYabgTU7S2_8NKFHmcNdkB-vQLdVcwmxjARgo8SBb2A=='}
 

Комментарии:

1. Это может быть проблемой на стороне сервера. Работает ли все это через веб-браузер (возможно, после того, как сначала были удалены все файлы cookie и логины, т. Е. с помощью просмотра в частном режиме)?

2. Это работает при использовании закрытого режима. Но поскольку это работает при использовании браузера, должен быть какой-то обходной путь?

3. Каковы на самом деле коды состояния различных запросов?

4. Обратите внимание, что вы говорите, что api3.php не работает, но в ваших списках заголовков вы показываете api3.php один как тот, который работает. Пожалуйста, перепроверьте.

5. Почему вы перечисляете заголовки из Google Chrome? Я почти уверен, что запросы также могут отображать заголовки для каждого запроса; это кажется более актуальным.