corso.py 2.45 KB
Newer Older
edne's avatar
edne committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Politecnico Open unix Labs (https://poul.org)
# Edoardo Negri (http://edne.net)

from tweepy import OAuthHandler
from tweepy.streaming import StreamListener
from tweepy import Stream
import json


# per poter usare le API di Twitter è necessario registare l'app
# https://apps.twitter.com/
access_token = "XXXXXXX"
access_token_secret = "XXXXXXX"
consumer_key = "XXXXXXX"
consumer_secret = "XXXXXXX"


# autenticazione
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)


class Listener(StreamListener):
    """Listener che salva sul file tweets.json"""

    def on_data(self, json_data):
        """funzione chiamata all'arrivo di un tweet"""
        with open("tweets.json", "a") as f:
            f.write(json_data)
        # print(json_data)

    def on_error(self, status):
        """funzione chiamata in caso di errore"""
        print(status)


listener = Listener()
stream = Stream(auth, listener)

# decommentare per far partire lo stream
# stream.filter(track=["python"])
# ctrl-C per uccidere il processo


# Apro il file con i tweet salvati

with open("tweets.json") as f:
    tweets_json = f.readlines()  # lista di stringhe


def load(s):
    """funione per convertire una stringa (json) in un dizionario"""
    try:
        return json.loads(s)
    except ValueError:
        # se la conversione non riesce ritorna None
        return None


# applico load all'intera lista
tweets_data = [load(tw_j) for tw_j in tweets_json]

# rimuovo gli elementi che sono None
# (l'operatore if si aspetta una variabile di tipo logico, i valori 0, [] e
# None vengono convertiti a False, tutto il resto a True)
tweets_data = [tw for tw in tweets_data if tw]


#
# Disegno il grafico a torta lingue e numero tweet
#

from collections import Counter
from matplotlib import pyplot as plt  # http://matplotlib.org/


# lista linguaggi (ripetuti)
langs = [tw["lang"] for tw in tweets_data]

# dizionario {lingua: n_occorrenze}
counted = Counter(langs)

# dizionario con solo le lingue con più di 100 tweet
top = {k: v for (k, v) in counted.items() if v > 100}

# lista con i numeri dei tweet nelle antre lingue
others = [v for (k, v) in counted.items() if v <= 100]

# aggiungo il campo "others" al dizionario
others_sum = sum(others)
top["others"] = others_sum


sizes = list(top.values())
labels = list(top.keys())

# http://matplotlib.org/examples/pie_and_polar_charts/pie_demo_features.html
plt.pie(sizes, labels=labels)
plt.show(block=True)