Webscraping z urllib - 403 forbidden w odpowiedzi

0

Próbuję pobrać dane z urla dostępnego dla zalogowanego użytkownika - listę przedmiotów dodanych do ulubionych.
Używam do tego Pythona 3 i biblioteki urllib. (pip freeze rzecze, że wersja to urllib3==1.22)

Mój kod:

from urllib.request import urlopen
import json

url = 'https://www.vinted.pl/members/ubrania/favourite_list'

cookie = ("G_ENABLED_IDPS=google; "
    "_vinted_pl_session=JakieSCookieKtoreDostajeOdStronki; "
    "euconsent=dalejroznedanenanana "
)

useragent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36 '

headers = { 
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 ',
    'accept-encoding': 'gzip, deflate, br ',
    'accept-language': 'pl,en-US;q=0.9,en;q=0.8,de;q=0.7 ',
    'cache-control': 'no-cache ',
    'cookie': cookie, 
    'pragma': 'no-cache ',
    'referer': 'https://www.vinted.pl/forum ',
    'sec-fetch-mode': 'navigate ',
    'sec-fetch-site': 'none ',
    'sec-fetch-user': '?1 ',
    'upgrade-insecure-requests': '1 ',
    'User-Agent': useragent }

with urlopen(url, data=bytes(json.dumps(headers), encoding="utf-8")) as response:  #tu wywala wyjątek
   print(response)

W toku testowania kolejnych wersji i upewniania się, że request wykonywany przez Pythona idealnie odzwierciedla request wychodzący z przeglądarki, ustawiłam każdy możliwy header tak samo. (screen działającego w przeglądarce requesta w załączniku)

Generalnie zakładam, że 403 Forbidden wynika stąd, że portal jakimś sposobem nadal potrafi rozpoznać mój program jako skrypt, a nie przeglądarkę. Cała autoryzacja requestu wydaje się opierać na cookie, który też kopiuję i ustawiam identyczny, jak w przeglądarce. (dbając też o to, by używać zawsze aktualnego cookie, zmieniającego się przy każdym kolejnym requeście - konkretniej, wartość "_vinted_pl_session" pobieram z odpowiedzi ostatnio wykonanego requestu w przeglądarce i wstawiam do programu, to jedyna zmieniająca się wartość w cookie)

Pytanie brzmi, czym w takim razie różni się request z mojego programu od requestu przeglądarki, że skrypt dostaje odpowiedź 403?

1

Wysyłasz swoje nagłówki jako dane binarne.

from urllib.request import Request, urlopen
import json

url = 'https://www.vinted.pl/members/ubrania/favourite_list'

cookie = ("G_ENABLED_IDPS=google; "
    "_vinted_pl_session=JakieSCookieKtoreDostajeOdStronki; "
    "euconsent=dalejroznedanenanana "
)

useragent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36 '

headers = { 
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 ',
    'accept-encoding': 'gzip, deflate, br ',
    'accept-language': 'pl,en-US;q=0.9,en;q=0.8,de;q=0.7 ',
    'cache-control': 'no-cache ',
    'cookie': cookie, 
    'pragma': 'no-cache ',
    'referer': 'https://www.vinted.pl/forum ',
    'sec-fetch-mode': 'navigate ',
    'sec-fetch-site': 'none ',
    'sec-fetch-user': '?1 ',
    'upgrade-insecure-requests': '1 ',
    'User-Agent': useragent }

req = Request(url, headers=headers)
with urlopen(req) as response:
   print(response)

1 użytkowników online, w tym zalogowanych: 0, gości: 1