Ваша проблема связана с тем, как вы кодируете параметры. Из check_url
в вашем первом примере мы видим:
?query_hash=7dabc71d3e758b1ec19ffb85639e427b&variables=%7B%22tag_name%22%3A%22...
Этот URL-адрес имеет 2 параметра:
query_hash
- строка variables
- выглядит как строка в кодировке URL, судя по escape-значениям (%7B%22
).
Как вы правильно определили, %7B%22
соответствует {"
. Другими словами, второй параметр - это строка JSON с экранированием URL.
Отсюда мы можем получить представление о новом решении:
query_url = 'https://www.instagram.com/graphql/query/?'
variables = {"tag_name": "instagood", "first": "2",
"after": "QVFDa3djMUFwM1BkRWJNTlEzRmxBYkRGdFBDVzViU2JoNVZPbWNQSmNCTE1HNDlhYWdsdi1EcE5ickhvYjhRWUhqUDhIcXE3YTE4M1JMbmdVN0lMSXM3ZA=="}
payload = {
"query_hash": "7dabc71d3e758b1ec19ffb85639e427b",
"variables": json.dumps(variables)
}
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) ' + \
'Chrome/81.0.4044.138 Safari/537.36'
r = s.get(query_url, params=payload)
print(r.content)
Как видите, params
, переданное методу requests.get
, является dict с двумя ключами. Это будет преобразовано в ?query_hash=value1&variables=value2
.
Чтобы получить правильное значение для variables
, мы просто выгружаем JSON в строку. Библиотека запросов позаботится об экранировании URL-адресов всех символов, таких как {
и "
, в строке.