ipi1
This commit is contained in:
126
scraping.py
Normal file
126
scraping.py
Normal 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 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()
|
||||
Reference in New Issue
Block a user