什么是新的 instagram json 端点?

What is the new instagram json endpoint?

Instagram 曾在端点 https://www.instagram.com/<username>/?__a=1 下将开放数据公开为 json。这在一夜之间发生了变化,端点不再可用。什么是新端点或什么可以替代它?

提前致谢!

端点不再存在。由于丑闻,Facebook 正在限制 API。数据当然还在那里,Instagram 的前端需要它,所以现在的替代方法是抓取页面并在那里找到 json 数据。这是我的做法:

  • 通过 http 访问 https://www.instagram.com/<username>
  • 查找文本以 window._sharedData = 开头的 script 标签。您可以为此使用正则表达式或抓取库。
  • 剩下的文字(除了最后的;)就是你想要的json数据。
  • 将字符串化的 json 转换为 json 以便像以前一样访问它。
  • 'entry_data'键中'ProfilePage'键的第一个元素正好对应旧端点返回的json

这是一个使用 Python 的例子:

import requests
from bs4 import BeautifulSoup
import re
import json

r = requests.get('https://www.instagram.com/github/')
soup = BeautifulSoup(r.content)
scripts = soup.find_all('script', type="text/javascript", text=re.compile('window._sharedData'))
stringified_json = scripts[0].get_text().replace('window._sharedData = ', '')[:-1]

json.loads(stringified_json)['entry_data']['ProfilePage'][0]

Out[1]:
{u'graphql': {u'user': {u'biography': u'How people build software.',
u'blocked_by_viewer': False,
...
}

如果您正在寻找正则表达式:

<script type="text\/javascript">window[.]_sharedData = {[\s\S]*};<\/script>

此端点仍然有效,但您必须拥有来自当前登录会话的有效 cookie。

https://www.instagram.com/<username>/?__a=1

有效,但您必须登录

您可以像 instagram-scraper 包一样创建会话。

您不需要提供用户名和密码。下面的代码片段将创建一个匿名会话。

import requests
import json
try:
    from urllib.parse import urlparse
except ImportError:
    from urlparse import urlparse

BASE_URL = 'https://www.instagram.com/'
CHROME_WIN_UA = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'

session = requests.Session()
session.headers = {'user-agent': CHROME_WIN_UA, 'Referer': BASE_URL}
session.cookies.set('ig_pr', '1')
req = session.get(BASE_URL)
session.headers.update({'X-CSRFToken': req.cookies['csrftoken']})

url = "https://www.instagram.com/instagram/?__a=1"
response = session.get(url, cookies="", headers={'Host': urlparse(url).hostname}, stream=False, timeout=90)
print(response.json())

https://github.com/arc298/instagram-scraper

如果你想使用正则表达式获取对象,你可以使用这个(灵感来自@Emixam23)

/(?<=<script type="text\/javascript">window[.]_sharedData = ){[\s\S]*}(?=;<\/script>)/