notes.py 3.34 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/usr/bin/env python3

##
# 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"
##


##
# salvati in un moulo esterno
from secret import access_token, access_token_secret
from secret import consumer_key, consumer_secret
##


##
# mi autentico
from tweepy import OAuthHandler

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


##
from tweepy.streaming import StreamListener
from tweepy import Stream

import json


# classe per "ascoltare" i tweets
# http://docs.tweepy.org/en/latest/streaming_how_to.html
class Listener(StreamListener):

    def on_data(self, json_data):
        # stringa contenente json
        # print(json_data)
        data = json.loads(json_data)
        print(data["text"])
        return True

    def on_error(self, status):
        print(status)


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

##
# posso filtrare in base a parole contenute
stream.filter(track=['python'])
##


##
# salviamo il .json in un file
class SavingListener(StreamListener):
    def __init__(self, filename):
        self.filename = filename

    def on_data(self, json_data):
        with open(self.filename, "a") as f:
            f.write(json_data)
        print(json_data)
        return True

    def on_error(self, status):
        print(status)

listener = SavingListener("test.json")
stream = Stream(auth, listener)
stream.filter(track=['python'])
##


##
# leggiamo il .json
with open("test.json") as f:
    lines = f.readlines()

print(len(lines), "tweets")

tweets = [json.loads(line) for line in lines]
# ma esplode, dobbiamo gestire il casi di tweet invalido:


def load(json_string):
    try:
        return json.loads(json_string)
    except ValueError:
        return None

#
# parentesi sulle comprehension
#

tweets = [load(line) for line in lines]
tweets = [tw for tw in tweets if tw]

for tw in tweets:
    if tw:
        print(tw["text"])
##

##
# solo le lingue dei tweet
print([tw["lang"] for tw in tweets])

from collections import Counter
# Counter restituisce un dizionario {"linguaggio": n_apparizioni}
# il metodo .items() di un dizionario da una lista di coppie (chiave, valore)
couples = Counter([tw["lang"] for tw in tweets]).items()
keys = [cp[0] for cp in couples]
values = [cp[1] for cp in couples]

# queste due comprehension possono essere sostituite da:
keys, value = zip(*couples)
# ma è qualcosa di avanzato...

import matplotlib.pyplot as plt
plt.bar(range(len(keys)), values, align='center')
plt.xticks(range(len(keys)), keys)
plt.show(block=True)
##


##
# visto come generare il grafico di un attrubuto dei tweet, possiamo fare una
# funzione per farne uno qualsiasi
def plot(tweets, key):
    couples = Counter([tw[key] for tw in tweets]).items()
    keys = [cp[0] for cp in couples]
    values = [cp[1] for cp in couples]

    plt.bar(range(len(keys)), values, align='center')
    plt.xticks(range(len(keys)), keys)
    plt.show(block=True)

print(tweets[0].keys())
plot(tweets, "source")
##

##
# si possono fare altre analisi, come per esempio la massima sorgente dei tweet

counted = Counter([tw["source"] for tw in tweets])
src_max = max(counted, key=counted.get)

print(src_max, counted[src_max])
##


##
# altri esempi, se avanza tempo
##