我正在开发一个简单的程序来刮取公共用户的页面并检索其整个供稿。想法是在文件中存储多行,每行都包含一个JSON对象,作为分页返回的对象(类似{"data":{"user":{"edge_owner_to_timeline_media":{ ... }}}
)。
到目前为止,我已经成功地成功请求了用户页面并获得了所需的令牌以创建随后的请求,就像这样:
对https://instagram.com/username/的GET请求以检索HTML。
这样,我通过剥离<script type=\"text/javascript\">window._sharedData = ";
和;</script>
之间的响应中的所有内容来存储JSON文件的第一行,在其中找到一个嵌套了用户信息的JS对象。几个节点(["entry_data"]["ProfilePage"][0]["graphql"]["user"]
)。该部分进入字符串,例如"{\"data\":"<< Json::writeString(builder, node["user"]) << "}"
,并保存在我的JSON文件的第一行中。
从同一节点中提取用户ID,以后再进行分页。
我还从响应中检索到脚本/static/bundles/metro/ProfilePageContainer.js/UNIQUE_IDENTIFIER.js
的URL,然后请求该URL,以便可以从中提取s.pagination},queryId:"
之间的内容。
现在我有足够的数据来创建一个图形请求,该图形请求应通过构建以下查询来返回下一页:
string variables = "{\"id\":\"" + root["entry_data"]["ProfilePage"][0]["graphql"]["user"]["id"].asString() + "\",\"first\":50,\"after\":\"" + root["entry_data"]["ProfilePage"][0]["graphql"]["user"]["edge_owner_to_timeline_media"]["page_info"]["end_cursor"].asString() + "\"}";
string next_page = "https://www.instagram.com/graphql/query/?query_hash=" + queryIdFromScript + "&variables=" + curl_easy_escape(curl, variables.c_str(), variables.length());
此请求返回403。
我想知道如何解决这个问题。
我不知道是否有一种方法可以像从用户主页中那样发出请求,可以通过使用开发工具来实现,或者我应该如何使用cookie或类似的东西那个。
欢迎任何建议和指导。
谢谢!