python - 无法在获取请求中使用 json 参数获得所需的响应

标签 python json python-3.x web-scraping python-requests

我正在尝试从这个 webpage 获得 json 响应使用以下方法,但这就是我得到的 {"message": "Must provide valid one of: query_id, query_hash", "status": "fail"。我尝试打印响应 url,如第二个脚本中的 r.url 所示,以查看它是否与我尝试发送的那个匹配,但我发现它在结构上有所不同。

如果我在请求中直接使用 url(从开发工具中获取),我会得到所需的内容:

import json
import requests

check_url = 'https://www.instagram.com/graphql/query/?query_hash=7dabc71d3e758b1ec19ffb85639e427b&variables=%7B%22tag_name%22%3A%22instagood%22%2C%22first%22%3A2%2C%22after%22%3A%22QVFDa3djMUFwM1BkRWJNTlEzRmxBYkRGdFBDVzViU2JoNVZPbWNQSmNCTE1HNDlhYWdsdi1EcE5ickhvYjhRWUhqUDhIcXE3YTE4M1JMbmdVN0lMSXM3ZA%3D%3D%22%7D'
r = requests.get(check_url)
print(r.json())

但是,我无法让它工作:

import json
import requests

url = 'https://www.instagram.com/explore/tags/instagood/'
query_url = 'https://www.instagram.com/graphql/query/?'

payload = {
    "query_hash": "7dabc71d3e758b1ec19ffb85639e427b",
    "variables": {"tag_name":"instagood","first":"2","after":"QVFDa3djMUFwM1BkRWJNTlEzRmxBYkRGdFBDVzViU2JoNVZPbWNQSmNCTE1HNDlhYWdsdi1EcE5ickhvYjhRWUhqUDhIcXE3YTE4M1JMbmdVN0lMSXM3ZA=="}
}

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=json.dumps(payload))
    print(r.content)

我怎样才能使上面的脚本工作?

最佳答案

您的问题与您对参数的编码方式有关。 从第一个示例中的 check_url 我们可以看到:

?query_hash=7dabc71d3e758b1ec19ffb85639e427b&variables=%7B%22tag_name%22%3A%22...

这个 URL 有 2 个参数:

  1. query_hash - 字符串
  2. 变量 - 根据转义值 (%7B%22) 判断,看起来像 URL 编码字符串。

如你所见,%7B%22对应于{"。换句话说,第二个参数是url转义的JSON字符串。

从这里我们可以得到关于新解决方案的线索:

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)

如您所见,传递给 requests.get 方法的 params 是一个带有两个键的字典。这将被翻译成 ?query_hash=value1&variables=value2

要获得变量的正确值,我们只需将 JSON 转储为字符串。请求库将处理 URL 转义字符串中的所有字符,例如 {"

关于python - 无法在获取请求中使用 json 参数获得所需的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62038350/

相关文章:

python - 将 pandas Dataframe 转换为字典时保留行的顺序

MYSQL根据AS结果过滤查询结果

javascript - 使用 jquery 将 json 转换为数组

javascript - 来自带有 Chart.js 的 JSON 文件的多行/数据系列

python - 尝试在 python 中将数字的阶乘打印为 (5 x 4 x 3 x 2 x1 =120)

python - PySpark - 按一个或多个选项卡拆分 RDD 的记录

python - 使用python从多个powerpoint文件中提取文本

python - 查看 numpy OrderedDict 中的值是否与另一个 OrderedDict 中的值相同的最快方法是什么?

python - 在主页显示计数和 top_categories

python - 从导入的函数打开文件