Python如何避免重复写入已存在的Instagram链接到文本文件?
解决Instagram用户名URL重复写入的问题
你现在的需求是验证Instagram用户名对应的URL是否存在,同时避免把已经在文本文件里的URL重复写进去。先指出原代码里的几个问题:
- 用
'w'模式打开文件会直接清空原有内容,不符合保留历史数据的需求 - 直接调用
write(url)会报错,因为url是列表类型,write仅接受字符串参数 - 未做去重判断,重复的用户名会被重复写入
下面是调整后的完整代码,核心逻辑是先读取文件中已有的URL存入集合(集合的查重效率远高于列表),每次检测到有效的URL时,先判断是否已存在于集合中,只有不存在时才写入文件:
import requests # 定义目标文件路径 file_path = "dictionaries/insta.txt" # 读取已存在的URL,存入集合用于快速查重 existing_urls = set() try: with open(file_path, 'r', encoding="utf-8") as f: # 逐行读取并去除换行符,过滤空行 existing_urls = {line.strip() for line in f if line.strip()} except FileNotFoundError: # 如果文件不存在,初始化空集合,后续追加写入时会自动创建文件 pass # 待检测的用户名列表 cli = ['duolingo', 'ryanair', 'mcguinness.paddy', 'duolingodeutschland', 'duolingobrasil'] # 以追加模式打开文件,保留原有内容 with open(file_path, 'a', encoding="utf-8") as insta_url_file: for username in cli: target_url = f"https://www.instagram.com/{username}/" try: # 发送请求并设置超时,避免长时间阻塞 r = requests.get(target_url, timeout=10) # 更可靠的有效性判断:状态码为200且未被重定向到登录页 # 原代码通过编码判断的方式不稳定,存在误判可能 if r.status_code == 200 and "/accounts/login/" not in r.url: output_line = f"instagram.com/{username}/" # 检查是否已存在,不存在则写入并更新集合 if output_line not in existing_urls: insta_url_file.write(output_line + "\n") existing_urls.add(output_line) print(f"已写入: {output_line}") else: print(f"已存在,跳过: {output_line}") else: print(f"用户名不存在: {username}") except requests.exceptions.RequestException as e: print(f"请求异常({username}): {str(e)}")
关键优化点说明
- 用
try-except处理文件不存在的场景,避免程序报错终止 - 使用集合存储已存在的URL,查重操作的时间复杂度为O(1),效率更高
- 替换原有的有效性判断逻辑:通过状态码+URL检查替代编码判断,结果更准确
- 用
with语句管理文件资源,自动完成文件关闭,避免资源泄漏 - 采用追加模式
'a'打开文件,确保原有内容不会被清空
内容的提问来源于stack exchange,提问作者TheBotHunter
相关产品推荐
相关产品推荐

