This commit is contained in:
2026-02-02 22:17:32 +01:00
commit f3dda6bee2

126
scraping.py Normal file
View File

@@ -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 30120 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()