Pracuję na prostym skrobaku internetowym w Pythonie 3, ale kiedy wysyłam żądanie get lub post, odpowiedź wynosi 403. W Pythonie 2 działa jednak dobrze. Używam tej samej wersji bibliotek żądań w obu wersjach. Próbowałem też z, Verify=False/True
ale różnica w obu wersjach pozostaje.
żądania = 2.22.0
certifi = 2019.9.11
from requests import get
url = 'https://www.gamestop.com/'
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.5',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0',
'DNT': '1',
'Upgrade-Insecure-Requests': '1',
'Connection': 'keep-alive',
'Host': 'www.gamestop.com'
}
res = get(url, headers=header, verify=False).status_code
print(res)
# 403 when using python 3.7.4
# 200 when using python 2.7.16
Edytuj przez @blhsing:
Poniższa lista śledzi, które konkretne wersje Pythona działają, a które nie działają zgodnie z komentarzami. Dotychczasowe sukcesy i niepowodzenia były spójne dla każdej konkretnej wersji Pythona na różnych platformach.
Edytuj tę sekcję pytania z własnymi wynikami wraz z konkretnymi wersjami języka Python użytymi do wygenerowania wyników.
2.7.14 works (blhsing)
2.7.16 works (repl.it)
3.6.5 works (blhsing)
3.6.8 fails (Reinderien and blhsing)
3.7.3 works (wim and blhsing)
3.7.4 fails (repl.it and blhsing)
3.8.0 fails (OP)
Demo na repl.it: Python 2.7.16 i Python 3.7.4
ssl.OPENSSL_VERSION
). Nie potrzebujesz wszystkich tych nagłówków, aby to zrobić, wystarczy zwykły stary get (url).Odpowiedzi:
Jest to wyjątek zgłoszony przez urlib3:
Zgodnie z najnowszymi informacjami o wersji, sekcja 1.25.5 (2019-09-19) :
Możesz śledzić ten problem na Githubie , został on zamknięty.
TLDR
Użytkownik @sethmlarson na Github znalazł ten błąd na urllib3 :
ustawienie tej wartości, aby
True
włączyć weryfikację certyfikatów serwera, zamiast być wyłączone.źródło