python-3.x - 如何使用 python 获取 Instagram 帖子的正确视频 url
问题描述
我正在尝试构建一个程序,该程序运行一个函数,该函数输入帖子的 url,输出帖子包含的图像和视频的链接。它对图像非常有用。但是,在获取视频链接时,它返回了一个错误的 url。我不知道如何处理这种情况。
https://scontent-lax3-2.cdninstagram.com/v/t50.2886-16/86731551_2762014420555254_3542675879337307555_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5jYXJvdXNlbF9pdGVtIiwicWVfZ3JvdXBzIjoiW1wiaWdfd2ViX2RlbGl2ZXJ5X3Z0c19vdGZcIl0ifQ&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_cat=106&_nc_ohc=WDuXskvIuLEAX9rj7MU&vs=17877888256532912_3147883953&_nc_vs=HBksFQAYJEdCOXJLd1gyMVdhWUNkQUpBS090UGo3eEhDb3hia1lMQUFBRhUAAsgBABUAGCRHTFBXTUFVTXNPaG5XcW9EQU5KUEE5bEZVdVZxYmtZTEFBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMBUAABgAFuD4nJGH9sE%2FFQIoAkMzLBdAEszMzMzMzRgSZGFzaF9iYXNlbGluZV8xX3YxEQB17gcA&_nc_rid=97e769e058&oe=5EDF10A5&oh=3713c35f89fca1aa9554a281aa3421ed
https://scontent-gmp1-1.cdninstagram.com/v/t50.2886-16/0_0_0_\x00.mp4?_nc_ht=scontent-gmp1-1.cdninstagram.com&_nc_cat=100&_nc_ohc=Wnu_-GvKHJoAX9F_ui1&oe=5EDE8214&oh=7920ac3339d5bf313e898c3cbec85fa2
这里有两个网址。第一个是从网页源复制的,而第二个是从 pyquery 抓取的数据中复制的。它们来自相同的 Instagram 帖子,相同的路径,但它们完全不同。第一个效果很好,但第二个不行。我该如何解决这个问题?如何获得正确的视频网址?
我在网上找了很久。但是没有用。请帮助或尝试提供一些想法如何实现这一目标。
这是我与问题相关的代码
def getUrls(url):
URL = str(url)
html = get_html(URL)
doc = pq(html)
urls = []
items = doc('script[type="text/javascript"]').items()
for item in items:
if item.text().strip().startswith('window._sharedData'):
js_data = json.loads(item.text()[21:-1], encoding='utf-8')
shortcode_media = js_data["entry_data"]["PostPage"][0]["graphql"]["shortcode_media"]
edges = shortcode_media['edge_sidecar_to_children']['edges']
for edge in edges:
is_video = edge['node']['is_video']
if is_video:
video_url = edge['node']['video_url']
video_url.replace(r'\u0026', "&")
urls.append(video_url)
else:
display_url = edge['node']['display_resources'][-1]['src']
display_url.replace(r'\u0026', "&")
urls.append(display_url)
return urls
提前致谢。
解决方案
你的代码没有问题。这是 Instagram 的一个已知间歇性问题,其他人也遇到过:https ://github.com/arc298/instagram-scraper/issues/545
似乎还没有已知的修复方法。
此外,虽然与您的问题无关,但值得一提的是,您无需检查display_resources
对象即可获取图像的 URL:
display_url = edge['node']['display_resources'][-1]['src']
已经有一个display_url
可用的属性(我猜你看到了这个,基于变量名?)。所以你可以简单地做:
display_url = edge['node']['display_url']
推荐阅读
- android - Android/IOS中如何使用URI处理百度地图中的多个目的地
- python - 如何使用 Python 将列值转换为行标题?
- c# - 将点表示法转换为 JSON
- json - jq - 组合来自不同键的数据
- azure - 登录 Azure AD 外部帐户
- eclipse - eclipse中方法/类名上的“i”图标是什么意思
- javascript - 在聊天容器上反应自动滚动到底部
- python-3.x - 我可以使用 python 线程在一个 python 代码中运行两个类吗?
- angular - RxJS / Angular 7:具有不同回调的forkjoin
- php - 使用 .htaccess 如何将查询字符串从根目录重定向到特定的 url?