Wiki script - Dump sorgenti delle guide (Python 3): differenze tra le versioni

modificato per seguire cambiamenti della nuova API di MW
(http->https nell'URL)
(modificato per seguire cambiamenti della nuova API di MW)
Riga 25: Riga 25:
NOMEFILE = 'wikidump.txt'
NOMEFILE = 'wikidump.txt'
NUMTHREAD = 4
NUMTHREAD = 4
# dizionario ordinato
mydict = OrderedDict()


def api(parametri):
def api(parametri):
       
 
         # codifica parametri
         # codifica parametri
         parametri_enc = urllib.parse.urlencode(parametri).encode('utf-8')
         parametri_enc = urllib.parse.urlencode(parametri).encode('utf-8')
         # creazione URL
         # creazione URL
         url_req = urllib.request.Request(URL, parametri_enc)
         url_req = urllib.request.Request(URL, parametri_enc)
       
 
         try:
         try:
             # dati risposta dal Wiki
             # dati risposta dal Wiki
Riga 42: Riga 46:


             return dati_json
             return dati_json
             
 
         except urllib.error.URLError as e:
         except urllib.error.URLError as e:
             print('Errore di connessione al Wiki')
             print('Errore di connessione al Wiki')
Riga 61: Riga 65:


         all_titles_params = {
         all_titles_params = {
                             'action' : 'query',
                             'action': 'query',
                             'list' : 'allpages',
                             'list': 'allpages',
                             'aplimit' : '500',
                             'aplimit': '500',
                             'apfilterredir' : 'nonredirects',
                             'apfilterredir': 'nonredirects',
                             'format' : 'json',
                             'format': 'json',
                             'apfrom' : ''
                             'apfrom': ''
                             }
                             }
       
 
        # dizionario ordinato
        mydict = OrderedDict()
       
         while True:
         while True:
             dati = api(all_titles_params)
             dati = api(all_titles_params)
Riga 80: Riga 81:
             # esiste un blocco successivo? Il limite di un blocco è 500.
             # esiste un blocco successivo? Il limite di un blocco è 500.
             try:
             try:
                 last = dati['query-continue']['allpages']['apfrom']
                 last = dati['continue']['apcontinue']


             except KeyError:
             except KeyError:
                 break
                 break
           
 
             # se esiste un blocco successivo, allora 'apfrom' assume il valore corrispondente
             # se esiste un blocco successivo, allora 'apfrom' assume il valore corrispondente
             # al titolo della prima guida del blocco successivo
             # al titolo della prima guida del blocco successivo
             all_titles_params['apfrom'] = ''.join(last)
             all_titles_params['apfrom'] = last
       
        return mydict


   
 
def get_content(dizionario):
def get_content():
     # accetta in ingresso il dizionario incompleto (senza contenuto delle guide)
     # accetta in ingresso il dizionario incompleto (senza contenuto delle guide)
     # e restituisce il dizionario completo, cioè qualcosa del tipo:
     # e restituisce il dizionario completo, cioè qualcosa del tipo:
Riga 102: Riga 101:
     #    ...
     #    ...
     # }
     # }
   
 
     # parametri
     # parametri
     content_ts_params = {
     content_ts_params = {
                         'action' : 'query',
                         'action': 'query',
                         'prop' : 'revisions',
                         'prop': 'revisions',
                         'rvprop' : 'content',
                         'rvprop': 'content',
                         'pageids' : '',
                         'pageids': '',
                         'format' : 'json'
                         'format': 'json'
                         }
                         }
   
 
     # lista delle chiavi del dizionario (pageids)
     # lista delle chiavi del dizionario (pageids)
     lista_pageid = list(dizionario.keys())
     lista_pageid = list(mydict.keys())
   
 
     # converte la lista appena ottenuta in una lista di liste (di max 50 valori ciascuna in
     # converte la lista appena ottenuta in una lista di liste (di max 50 valori ciascuna in
     # quanto 50 è il max valore consentito dall'API del Wiki)
     # quanto 50 è il max valore consentito dall'API del Wiki)
     # Qui viene usato il valore 40 per evitare possibili problemi
     # Qui viene usato il valore 40 per evitare possibili problemi
     listFifty = [lista_pageid[start:start + 40] for start in range(0, len(lista_pageid), 40)]
     listFifty = [lista_pageid[start:start + 40] for start in range(0, len(lista_pageid), 40)]
   
 
     q = queue.Queue()
     q = queue.Queue()


Riga 125: Riga 124:
         # inserisce le liste di id in una coda
         # inserisce le liste di id in una coda
         q.put(listaid)
         q.put(listaid)
   
 
     def mythreaded_func():
     def mythreaded_func():
         while not q.empty():
         while not q.empty():
Riga 132: Riga 131:
             # modifica il valore del dizionario con gli id separati da '|'
             # modifica il valore del dizionario con gli id separati da '|'
             content_ts_params['pageids'] = '|'.join(mystr)
             content_ts_params['pageids'] = '|'.join(mystr)
           
 
             d_reply = api(content_ts_params)
             d_reply = api(content_ts_params)
           
 
             for _id in mystr:          
             for _id in mystr:
                 mycontent = d_reply['query']['pages'][_id]['revisions'][0]['*']
                 mycontent = d_reply['query']['pages'][_id]['revisions'][0]['*']
                 dizionario[_id][1] = mycontent
                 mydict[_id][1] = mycontent
           
 
             q.task_done()
             q.task_done()
           
 
     for i in range(NUMTHREAD):
     for i in range(NUMTHREAD):
         t = Thread(target=mythreaded_func)
         t = Thread(target=mythreaded_func)
         t.start()
         t.start()
   
 
     q.join()
     q.join()
    return dizionario
def create_dict():
    # viene restituito il dizionario completo da inviare al file 
   
    my_partial_dict = get_pid_and_titles()
    my_full_dict = get_content(my_partial_dict)
     
    return my_full_dict




print('Download delle guide...')
print('Download delle guide...')
mydict = create_dict()
get_pid_and_titles()
 
get_content()


print('Scrittura sul file...')
print('Scrittura sul file...')
with open(NOMEFILE, 'w', encoding='utf8') as f:
with open(NOMEFILE, 'w', encoding='utf8') as f:
     for k,v in mydict.items():
     for k, v in mydict.items():
         # parsing di caratteri non consentiti in URL (i.e. il carattere "+")
         # parsing di caratteri non consentiti in URL (i.e. il carattere "+")
         name_parsed = urllib.parse.quote(v[0])
         name_parsed = urllib.parse.quote(v[0])
Riga 172: Riga 160:
         f.write('\n'.join(('þþþþ', url, v[1], 'øøøø', '')))
         f.write('\n'.join(('þþþþ', url, v[1], 'øøøø', '')))


print("Script terminato")  
print("Script terminato")
          
          
</pre>
</pre>
6 999

contributi