python-3.x - 如何使用 python 获取 Instagram 帖子的正确视频 url

标签 python-3.x web-scraping scrapy

我正在尝试构建一个程序,该程序运行一个函数,该函数输入帖子的 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']

关于python-3.x - 如何使用 python 获取 Instagram 帖子的正确视频 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62243191/

相关文章:

python - matplotlib 中的斜体标题不起作用

python-3.x - NetworkX:在 DAG 中查找最长路径,返回最大的所有关系

python - 无法一次性返回所有结果

python - 使用 scrapy 抓取特定网站时出现 "Too many requests"错误

python - 如何删除scrapy输出中的逗号

python - 正则表达式提取具有不同长度和特殊字符的所有数字

python - 为什么 sklearn 预处理 LabelEncoder inverse_transform 仅适用于一列?

python-2.7 - 从脚本中抓取。不会导出数据

python - 从下拉菜单python中的每个选项中抓取表格

python - 是否可以在同一个Scrapy蜘蛛中为不同的请求设置不同的设置?