From f3dda6bee27fa11e8089f46f8e1552f9dfa466f3 Mon Sep 17 00:00:00 2001 From: gabri Date: Mon, 2 Feb 2026 22:17:32 +0100 Subject: [PATCH] ipi1 --- scraping.py | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 scraping.py diff --git a/scraping.py b/scraping.py new file mode 100644 index 0000000..cdb9b36 --- /dev/null +++ b/scraping.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +""" +Script per estrarre la lista dei seguiti (following) di un profilo Instagram → salva in CSV. +Usa Instaloader - richiede login con tuo account. + +Utilizzo: + python scraping.py --username TUO_USERNAME --password TUA_PASSWORD --target TARGET_USERNAME [--output seguiti.csv] [--limit 500] +""" + +import argparse +import sys +import time +import random +from datetime import datetime +import csv + +try: + import instaloader +except ImportError: + print("Errore: installa instaloader con → pip install instaloader") + sys.exit(1) + + +def main(): + parser = argparse.ArgumentParser(description="Estrae seguiti Instagram e salva in CSV") + parser.add_argument("--username", required=True, help="Tuo username IG (per login)") + parser.add_argument("--password", required=True, help="Tua password IG") + parser.add_argument("--target", required=True, help="Username del profilo target") + parser.add_argument("--output", default=None, help="File CSV di output (default: following_{target}_YYYY-MM-DD.csv)") + parser.add_argument("--limit", type=int, default=0, help="Limita il numero di seguiti estratti (0 = tutti)") + + args = parser.parse_args() + + # Nome file di default + if args.output is None: + today = datetime.now().strftime("%Y-%m-%d") + args.output = f"following_{args.target}_{today}.csv" + + print(f"Target: @{args.target}") + print(f"Salvataggio in: {args.output}\n") + + L = instaloader.Instaloader() + + # Login + try: + print("Login...", end=" ") + L.login(args.username, args.password) + print("OK") + except instaloader.exceptions.BadCredentialsException: + print("Credenziali non valide") + sys.exit(1) + except Exception as e: + print(f"Errore login: {e}") + sys.exit(1) + + # Carica profilo target + try: + print(f"Caricamento @{args.target}...", end=" ") + profile = instaloader.Profile.from_username(L.context, args.target) + print("OK") + except Exception as e: + print(f"Errore caricamento profilo: {e}") + sys.exit(1) + + if profile.is_private: + print("ATTENZIONE: Profilo privato → devi seguirlo per vedere i seguiti.") + + followees_data = [] + count = 0 + start_time = time.time() + + print("Inizio estrazione seguiti... (pausa tra richieste per evitare blocchi)") + + try: + for followee in profile.get_followees(): + count += 1 + username = followee.username + full_name = followee.full_name if followee.full_name else "" + + followees_data.append([username, full_name]) + print(f" {count:5d} | @{username} | {full_name}") + + if args.limit > 0 and count >= args.limit: + print(f"\nLimite raggiunto: {args.limit} seguiti") + break + + # Anti-ban: pausa random più lunga + time.sleep(random.uniform(6.0, 15.0)) # era 2.0-5.5 → ora molto più lento ma più sicuro + + except instaloader.exceptions.LoginRequiredException: + print("\nSessione scaduta o login richiesto → riprova") + sys.exit(1) + except instaloader.exceptions.ConnectionException as e: + print(f"\nBlocco Instagram? Errore connessione: {e}") + print("Aspetta 30–120 minuti prima di riprovare") + sys.exit(1) + except Exception as e: + print(f"\nErrore durante scraping: {e}") + sys.exit(1) + + # Salvataggio in CSV + try: + with open(args.output, mode="w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + # Header + writer.writerow([ + "username", + "full_name", + "estratto_il", + f"@{args.target} - {datetime.now().strftime('%Y-%m-%d %H:%M')}" + ]) + writer.writerow([]) # riga vuota per separare header da dati + # Dati + for row in followees_data: + writer.writerow(row + [""]) # colonna vuota per allineamento + + print(f"\nCompletato!") + print(f"Estratti {len(followees_data)} seguiti") + print(f"Tempo: {(time.time() - start_time):.1f} secondi") + print(f"File salvato: {args.output}") + except Exception as e: + print(f"Errore salvataggio CSV: {e}") + + +if __name__ == "__main__": + main() \ No newline at end of file