我试图使用以下方法从这个webpage获取json响应,但这就是我得到的{"message": "Must provide valid one of: query_id, query_hash", "status": "fail"}
。我试图打印响应url,如第二个脚本中的r.url
,以查看它是否与我试图发送的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)
如何使上述脚本正常工作
在运行代码时,api调用后形成的URL包含不必要的转义字符。这就是搞砸API调用的原因
不建议在使用
get
时发送数据有效负载。解决这个问题的一个快速方法是使用post
请求。它工作得很好您的问题与如何编码参数有关。 从第一个示例中的
check_url
可以看出:此URL有2个参数:
query_hash
-字符串variables
-根据转义值(%7B%22
)判断,看起来像是URL编码的字符串李>正如您正确识别的,
%7B%22
对应于{"
。换句话说,第二个参数是url转义的JSON字符串从中我们可以得到有关新解决方案的线索:
如您所见,传递给
requests.get
方法的params
是一个带有两个键的dict。这将被翻译成?query_hash=value1&variables=value2
为了获得
variables
的正确值,我们只需将JSON转储为字符串。请求库将负责URL转义字符串中的所有字符,如{
和"
相关问题 更多 >
编程相关推荐