0

当我们从 instagram 下载数据时,即使您提供时间窗口(它会跳过较旧的日期但仍会扫描整个历史记录),它也会通过以下命令扫描帐户的整个帖子:

instaloader --login=username
--password=password
--post-metadata-txt="{likes} likes, {comments} comments." 
--post-filter="date_utc >= datetime(2019, 12, 31) and not is_video" 

这是非常低效的。我想知道有没有更有效的方法来下载数据?

4

1 回答 1

1

Instaloader 的命令行界面不直接支持这一点,这意味着您必须编写一个小 Python 脚本来实现这一点。Instaloader 文档中有一个示例,用于在特定时间段内下载帖子。它与您想要实现的目标仅在以下几点不同:

  • 使用自定义post_metadata_txt_pattern。为此,请实例化 Instaloader

    L = instaloader.Instaloader(post_metadata_txt_pattern="{likes} likes, {comments} comments.")
    
  • 登录:

    L.load_session_from_file('username')
    
  • 加载到最新的帖子(没有特定的SINCE日期)。这允许更简单的循环。也按not is_video过滤:

    for post in takewhile(lambda p: p.date_utc > datetime(2019, 12, 31), posts):
        if not post.is_video:
            L.download_post(post, 'target_directory')
    

关键是takewhile函数,它会在遇到不符合给定条件的帖子时结束下载循环。考虑到帖子是最新的,下载循环会在所有足够新的帖子被下载后立即终止。

把它们放在一起,我们得到:

from datetime import datetime
from itertools import takewhile

import instaloader

L = instaloader.Instaloader(post_metadata_txt_pattern="{likes} likes, {comments} comments.")

L.load_session_from_file('username')

posts = L.get_hashtag_posts('hashtag')
# or
# posts = instaloader.Profile.from_username(L.context, 'profile').get_posts()

for post in takewhile(lambda p: p.date_utc > datetime(2019, 12, 31), posts):
    if not post.is_video:
        L.download_post(post, 'target_directory')

将其写入文件,例如downloader.py并使用python downloader.py执行它。对load_session_from_file的调用假定已经保存了一个 Instaloader 会话,要获得一个,只需在执行代码片段之前调用instaloader -l username即可。

于 2020-02-06T10:46:20.543 回答