我正在尝试从这个 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 个参数:
query_hash
- 字符串变量
- 根据转义值 (%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/