什么是新的 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())
如果你想使用正则表达式获取对象,你可以使用这个(灵感来自@Emixam23)
/(?<=<script type="text\/javascript">window[.]_sharedData = ){[\s\S]*}(?=;<\/script>)/
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())
如果你想使用正则表达式获取对象,你可以使用这个(灵感来自@Emixam23)
/(?<=<script type="text\/javascript">window[.]_sharedData = ){[\s\S]*}(?=;<\/script>)/