LINUX.ORG.RU

python requests: сайт на некоторые запросы отвечает нормально а на некоторые 403 forbidden

 , ,


0

1

Хочу скачать данные с https://www.rik.parlament.gov.rs/542645/rezultati/

смотрю в браузере сеть, и пытаюсь имитировать те же запросы с теми же параметрами, куками и заголовками

Вот все параметры:

import requests
url = 'https://www.rik.parlament.gov.rs'
common_headers = {
    'Host': 'www.rik.parlament.gov.rs',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0',
    'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'TE': 'trailers',
}
get_headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Upgrade-Insecure-Requests': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
}
post_headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Referer': 'https://www.rik.parlament.gov.rs/',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'X-Requested-With': 'XMLHttpRequest',
    'Origin': 'https://www.rik.parlament.gov.rs',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
}
post_doc_headers = {'Sec-Fetch-Dest': 'document'}
post_empty_headers = {'Sec-Fetch-Dest': 'empty'}
def params2str(data):
    return '&'.join(k+'='+v for k,v in data.items())
def content_length(data):
    return {'content_length':str(len(params2str(data)))}
def req_load(should_update_pies,type,election_round,region,municipality,election_station):
    return {
        'should_update_pies':str(should_update_pies),
        'type':str(type),
        'election_round':str(election_round),
        'region':str(region),
        'municipality':str(municipality),
        'election_station':str(election_station),
    }

Инициирую сессию, получаю куки

r0 = requests.get(url+'/542645/rezultati/',headers= common_headers|get_headers)
r0 # <Response [200]>

Запросы /get_results/ всегда заканчиваются удачно

r3 = requests.post(url+'/get_results/',data=req_load(1,2,341140,1,1,0), headers= common_headers|post_headers|post_doc_headers, cookies=r0.cookies.get_dict())
r3 # <Response [200]>, содержательный

А вот запросы /get_regions/ /get-municipalities/ /get-election-stations/ всегда заканчиваются неудачно

param = {'election_type':'2','election_round':'341140'}
r2 = requests.post(url+'/get_regions/', data=param, headers= common_headers|post_headers|post_empty_headers|content_length(param), cookies=r0.cookies.get_dict())
r2 # <Response [403]>

И с добавлением content_length и без него



Последнее исправление: FeelUs (всего исправлений: 1)

/get_regions/

А не может быть дело в том, что в оригинальном запросе с сайта используется дефис вместо подчёркивания: /get-regions/?

Там у них на всех запросах какая-то неконсистентность в этом деле. Надо внимательнее.

anonymous
()