首页 > 解决方案 > 如何使用 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

提前致谢。

标签: python-3.xweb-scrapingscrapy

解决方案


你的代码没有问题。这是 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']

推荐阅读