【问题标题】:How to create a for loop from a input dependent function in Python?如何从 Python 中的输入依赖函数创建 for 循环?
【发布时间】:2019-07-06 09:36:30
【问题描述】:

我终于掌握了 Python 的窍门,并开始在日常工作中使用它。然而,学习曲线仍然很陡峭,我在尝试使用我找到的代码 here 用于从电报频道抓取成员的新东西时遇到了障碍。

目前在第 38-44 行中,我们可以从列表中选择一个组,它将用户数据抓取到 members.csv 中。

编辑:解决了 CSV 命名问题:


    print('Saving In file...')
    print(target_group.title)
    filename = target_group.title 
    with open(("{}.csv".format(filename)),"w",encoding='UTF-8') as f:

我想创建一个 for 循环来遍历列表中的每个组,而不是依赖输入。

print('Choose a group to scrape members from:')
i=0
for g in groups:
    print(str(i) + '- ' + g.title)
    i+=1 
g_index = input("Enter a Number: ")
target_group=groups[int(g_index)]

问题是我不确定如何用 for 循环替换这部分代码。

尽管将其更改为 for 循环只会在每次迭代时覆盖相同的 members.csv 文件,但我计划对其进行更改,以便输出为唯一文件。

所以回到我的问题。如何使这个单个程序迭代循环遍历所有组,或者只选择所有组。

感谢您的帮助!

【问题讨论】:

    标签: python python-3.x for-loop web-scraping telethon


    【解决方案1】:

    无法对此进行测试,但可能是这样的?这会为每个组创建一个新的 .csv 文件。

    for chat in chats:
        try:
            if chat.megagroup == True:
                groups.append(chat)
        except:
            continue
    
    for current_group in groups:
    
        print(f"Fetching members for group \"{current_group.title}\"...")
        all_participants = client.get_participants(current_group, aggressive=True)
    
        current_file_name = f"members_{current_group.title}.csv"
    
        print(f"Saving in file \"{current_file_name}\"...")
        with open(current_file_name, "w+", encoding="UTF-8") as file:
            writer = csv.writer(file, delimiter=",", lineterminator="\n")
            writer.writerow(["username", "user id", "access hash", "name", "group", "group id"])
            for user in all_participants:
                username = user.username if user.username else ""
                first_name = user.first_name.strip() if user.first_name else ""
                last_name = user.last_name.strip() if user.last_name else ""
                name = f"{first_name} {last_name}"
                row = [username, user.id, user.access_hash, name, current_group.title, current_group.id]
                writer.writerow(row)
        print(f"Finished writing to file \"{current_file_name}\".")
    print("Members scraped successfully.")
    

    【讨论】:

    • 感谢您的意见!我试过了,但没有用。我可以通过以下修复解决 CSV 命名问题:''' print('Saving In file...') print(target_group.title) filename = target_group.title with open(("{}.csv" .format(filename)),"w",encoding='UTF-8') as f: '''
    • 现在我正试图找出一种方法让它遍历每个目标组。
    • 抱歉,刚刚在我的原始帖子中添加了一个修复程序(我将 current_group 视为某些部分的字符串,哎呀)。让我知道它现在是否有效。
    【解决方案2】:

    最终解决了问题:

    关于命名 CSV 文件:使用 title 属性命名文件并在字符串中替换。

    g_index = chat_num
    target_group=groups[int(g_index)]
    filename = target_group.title 
    print('Fetching Members from {} ...'.format(filename))
    all_participants = []
    all_participants = client.get_participants(target_group, aggressive=True)
    
    print('Saving In file...')
    with open(("{}.csv".format(filename)),"w",encoding='UTF-8') as f:
    

    关于为序列创建 for 循环: 原始代码(发布在问题中)不包含 for 循环。我的解决方法是从所有内容创建一个函数,然后遍历一个索引列表,该列表等于检测到的实例数量。最后看起来是这样的:

    chat_list_index = list(range(len(chats)))
    
    for x in chat_list_index:
        try: 
            get(x)
        except:
            print("No more groups.", end = " ")
            pass
        pass
    print("Done")
    

    总体而言,这可能不是完成我所寻求的最佳解决方案,但它现在对我来说已经足够了,而且我学到了很多东西。也许将来有人会发现这很有用。此处提供完整代码:(https://github.com/ivanstruk/telegram-member-scraper/)。

    干杯!

    【讨论】:

    • 您可以在此处删除两个pass,因为forexcept 不是空范围,所以不需要它们。
    • 谢谢!这是有道理的!
    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2023-04-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多