import requests import bz2 import shutil import os import concurrent.futures YEARLY_PROJECTS = [ "dewiki", "frwiki", "eswiki", "itwiki", "ruwiki", "jawiki", "viwiki", "zhwiki", "ptwiki", "enwiktionary", "plwiki", "nlwiki", "svwiki", "metawiki", "arwiki", "shwiki", "cebwiki", "mgwiktionary", "fawiki", "frwiktionary", "ukwiki", "hewiki", "kowiki", "srwiki", "trwiki", "loginwiki", "huwiki", "cawiki", "nowiki", "mediawikiwiki", "fiwiki", "cswiki", "idwiki", "rowiki", "enwikisource", "frwikisource", "ruwiktionary", "dawiki", "bgwiki", "incubatorwiki", "enwikinews", "specieswiki", "thwiki" ] MONTHLY_PROJECTS = ["wikidatawiki", "commonswiki", "enwiki"] ALL_PROJECTS = [ "aawiki", "aawikibooks", "aawiktionary", "abwiki", "abwiktionary", "acewiki", "adywiki", "aewikimedia", "afwiki", "afwikibooks", "afwikiquote", "afwiktionary", "akwiki", "akwikibooks", "akwiktionary", "alswiki", "altwiki", "amiwiki", "amwiki", "amwikimedia", "amwikiquote", "amwiktionary", "angwiki", "angwikibooks", "angwikiquote", "angwikisource", "angwiktionary", "anpwiki", "anwiki", "anwiktionary", "arcwiki", "arwiki", "arwikibooks", "arwikimedia", "arwikinews", "arwikiquote", "arwikisource", "arwikiversity", "arwiktionary", "arywiki", "arzwiki", "astwiki", "astwikibooks", "astwikiquote", "astwiktionary", "aswiki", "aswikibooks", "aswikiquote", "aswikisource", "aswiktionary", "atjwiki", "avkwiki", "avwiki", "avwiktionary", "awawiki", "aywiki", "aywikibooks", "aywiktionary", "azbwiki", "azwiki", "azwikibooks", "azwikiquote", "azwikisource", "azwiktionary", "banwiki", "banwikisource", "barwiki", "bat_smgwiki", "bawiki", "bawikibooks", "bbcwiki", "bclwiki", "bclwikiquote", "bclwiktionary", "bdwikimedia", "be_x_oldwiki", "betawikiversity", "bewiki", "bewikibooks", "bewikimedia", "bewikiquote", "bewikisource", "bewiktionary", "bewwiki", "bgwiki", "bgwikibooks", "bgwikinews", "bgwikiquote", "bgwikisource", "bgwiktionary", "bhwiki", "bhwiktionary", "biwiki", "biwikibooks", "biwiktionary", "bjnwiki", "bjnwikiquote", "bjnwiktionary", "blkwiki", "blkwiktionary", "bmwiki", "bmwikibooks", "bmwikiquote", "bmwiktionary", "bnwiki", "bnwikibooks", "bnwikiquote", "bnwikisource", "bnwikivoyage", "bnwiktionary", "bowiki", "bowikibooks", "bowiktionary", "bpywiki", "brwiki", "brwikimedia", "brwikiquote", "brwikisource", "brwiktionary", "bswiki", "bswikibooks", "bswikinews", "bswikiquote", "bswikisource", "bswiktionary", "btmwiki", "btmwiktionary", "bugwiki", "bxrwiki", "cawiki", "cawikibooks", "cawikimedia", "cawikinews", "cawikiquote", "cawikisource", "cawiktionary", "cbk_zamwiki", "cdowiki", "cebwiki", "cewiki", "chowiki", "chrwiki", "chrwiktionary", "chwiki", "chwikibooks", "chwiktionary", "chywiki", "ckbwiki", "ckbwiktionary", "cnwikimedia", "commonswiki", "cowiki", "cowikibooks", "cowikimedia", "cowikiquote", "cowiktionary", "crhwiki", "crwiki", "crwikiquote", "crwiktionary", "csbwiki", "csbwiktionary", "cswiki", "cswikibooks", "cswikinews", "cswikiquote", "cswikisource", "cswikiversity", "cswikivoyage", "cswiktionary", "cuwiki", "cvwiki", "cvwikibooks", "cywiki", "cywikibooks", "cywikiquote", "cywikisource", "cywiktionary", "dagwiki", "dawiki", "dawikibooks", "dawikiquote", "dawikisource", "dawiktionary", "dewiki", "dewikibooks", "dewikinews", "dewikiquote", "dewikisource", "dewikiversity", "dewikivoyage", "dewiktionary", "dgawiki", "dinwiki", "diqwiki", "diqwiktionary", "dkwikimedia", "donatewiki", "dsbwiki", "dtpwiki", "dtywiki", "dvwiki", "dvwiktionary", "dzwiki", "dzwiktionary", "eewiki", "elwiki", "elwikibooks", "elwikinews", "elwikiquote", "elwikisource", "elwikiversity", "elwikivoyage", "elwiktionary", "emlwiki", "enwiki", "enwikibooks", "enwikinews", "enwikiquote", "enwikisource", "enwikiversity", "enwikivoyage", "enwiktionary", "eowiki", "eowikibooks", "eowikinews", "eowikiquote", "eowikisource", "eowikivoyage", "eowiktionary", "eswiki", "eswikibooks", "eswikinews", "eswikiquote", "eswikisource", "eswikiversity", "eswikivoyage", "eswiktionary", "etwiki", "etwikibooks", "etwikimedia", "etwikiquote", "etwikisource", "etwiktionary", "euwiki", "euwikibooks", "euwikiquote", "euwikisource", "euwiktionary", "extwiki", "fatwiki", "fawiki", "fawikibooks", "fawikinews", "fawikiquote", "fawikisource", "fawikivoyage", "fawiktionary", "ffwiki", "fiu_vrowiki", "fiwiki", "fiwikibooks", "fiwikimedia", "fiwikinews", "fiwikiquote", "fiwikisource", "fiwikiversity", "fiwikivoyage", "fiwiktionary", "fjwiki", "fjwiktionary", "fonwiki", "foundationwiki", "fowiki", "fowikisource", "fowiktionary", "frpwiki", "frrwiki", "frwiki", "frwikibooks", "frwikinews", "frwikiquote", "frwikisource", "frwikiversity", "frwikivoyage", "frwiktionary", "furwiki", "fywiki", "fywikibooks", "fywiktionary", "gagwiki", "ganwiki", "gawiki", "gawikibooks", "gawikiquote", "gawiktionary", "gcrwiki", "gdwiki", "gdwiktionary", "glkwiki", "glwiki", "glwikibooks", "glwikiquote", "glwikisource", "glwiktionary", "gnwiki", "gnwikibooks", "gnwiktionary", "gomwiki", "gomwiktionary", "gorwiki", "gorwiktionary", "gotwiki", "gotwikibooks", "gpewiki", "gucwiki", "gurwiki", "guwiki", "guwikibooks", "guwikiquote", "guwikisource", "guwiktionary", "guwwiki", "guwwikinews", "guwwikiquote", "guwwiktionary", "gvwiki", "gvwiktionary", "hakwiki", "hawiki", "hawiktionary", "hawwiki", "hewiki", "hewikibooks", "hewikinews", "hewikiquote", "hewikisource", "hewikivoyage", "hewiktionary", "hifwiki", "hifwiktionary", "hiwiki", "hiwikibooks", "hiwikimedia", "hiwikiquote", "hiwikisource", "hiwikiversity", "hiwikivoyage", "hiwiktionary", "howiki", "hrwiki", "hrwikibooks", "hrwikiquote", "hrwikisource", "hrwiktionary", "hsbwiki", "hsbwiktionary", "htwiki", "htwikisource", "huwiki", "huwikibooks", "huwikinews", "huwikiquote", "huwikisource", "huwiktionary", "hywiki", "hywikibooks", "hywikiquote", "hywikisource", "hywiktionary", "hywwiki", "hzwiki", "iawiki", "iawikibooks", "iawiktionary", "idwiki", "idwikibooks", "idwikimedia", "idwikiquote", "idwikisource", "idwiktionary", "iewiki", "iewikibooks", "iewiktionary", "iglwiki", "igwiki", "igwikiquote", "igwiktionary", "iiwiki", "ikwiki", "ikwiktionary", "ilowiki", "incubatorwiki", "inhwiki", "iowiki", "iowiktionary", "iswiki", "iswikibooks", "iswikiquote", "iswikisource", "iswiktionary", "itwiki", "itwikibooks", "itwikinews", "itwikiquote", "itwikisource", "itwikiversity", "itwikivoyage", "itwiktionary", "iuwiki", "iuwiktionary", "jamwiki", "jawiki", "jawikibooks", "jawikinews", "jawikiquote", "jawikisource", "jawikiversity", "jawikivoyage", "jawiktionary", "jbowiki", "jbowiktionary", "jvwiki", "jvwikisource", "jvwiktionary", "kaawiki", "kaawiktionary", "kabwiki", "kawiki", "kawikibooks", "kawikiquote", "kawiktionary", "kbdwiki", "kbdwiktionary", "kbpwiki", "kcgwiki", "kcgwiktionary", "kgwiki", "kiwiki", "kjwiki", "kkwiki", "kkwikibooks", "kkwikiquote", "kkwiktionary", "klwiki", "klwiktionary", "kmwiki", "kmwikibooks", "kmwiktionary", "knwiki", "knwikibooks", "knwikiquote", "knwikisource", "knwiktionary", "koiwiki", "kowiki", "kowikibooks", "kowikinews", "kowikiquote", "kowikisource", "kowikiversity", "kowiktionary", "krcwiki", "krwiki", "krwikiquote", "kshwiki", "kswiki", "kswikibooks", "kswikiquote", "kswiktionary", "kuswiki", "kuwiki", "kuwikibooks", "kuwikiquote", "kuwiktionary", "kvwiki", "kwwiki", "kwwikiquote", "kwwiktionary", "kywiki", "kywikibooks", "kywikiquote", "kywiktionary", "labswiki", "ladwiki", "lawiki", "lawikibooks", "lawikiquote", "lawikisource", "lawiktionary", "lbewiki", "lbwiki", "lbwikibooks", "lbwikiquote", "lbwiktionary", "lezwiki", "lfnwiki", "lgwiki", "lijwiki", "lijwikisource", "liwiki", "liwikibooks", "liwikinews", "liwikiquote", "liwikisource", "liwiktionary", "lldwiki", "lmowiki", "lmowiktionary", "lnwiki", "lnwikibooks", "lnwiktionary", "loginwiki", "lowiki", "lowiktionary", "lrcwiki", "ltgwiki", "ltwiki", "ltwikibooks", "ltwikiquote", "ltwikisource", "ltwiktionary", "lvwiki", "lvwikibooks", "lvwiktionary", "madwiki", "maiwiki", "maiwikimedia", "map_bmswiki", "mdfwiki", "mediawikiwiki", "metawiki", "mgwiki", "mgwikibooks", "mgwiktionary", "mhrwiki", "mhwiki", "mhwiktionary", "minwiki", "minwiktionary", "miwiki", "miwikibooks", "miwiktionary", "mkwiki", "mkwikibooks", "mkwikimedia", "mkwikisource", "mkwiktionary", "mlwiki", "mlwikibooks", "mlwikiquote", "mlwikisource", "mlwiktionary", "mniwiki", "mniwiktionary", "mnwiki", "mnwikibooks", "mnwiktionary", "mnwwiki", "mnwwiktionary", "mrjwiki", "mrwiki", "mrwikibooks", "mrwikiquote", "mrwikisource", "mrwiktionary", "mswiki", "mswikibooks", "mswikisource", "mswiktionary", "mtwiki", "mtwiktionary", "muswiki", "mwlwiki", "mxwikimedia", "myvwiki", "mywiki", "mywikibooks", "mywiktionary", "mznwiki", "nahwiki", "nahwikibooks", "nahwiktionary", "napwiki", "napwikisource", "nawiki", "nawikibooks", "nawikiquote", "nawiktionary", "nds_nlwiki", "ndswiki", "ndswikibooks", "ndswikiquote", "ndswiktionary", "newiki", "newikibooks", "newiktionary", "newwiki", "ngwiki", "niawiki", "niawiktionary", "nlwiki", "nlwikibooks", "nlwikimedia", "nlwikinews", "nlwikiquote", "nlwikisource", "nlwikivoyage", "nlwiktionary", "nnwiki", "nnwikiquote", "nnwiktionary", "nostalgiawiki", "novwiki", "nowiki", "nowikibooks", "nowikimedia", "nowikinews", "nowikiquote", "nowikisource", "nowiktionary", "nqowiki", "nrmwiki", "nsowiki", "nvwiki", "nycwikimedia", "nywiki", "nzwikimedia", "ocwiki", "ocwikibooks", "ocwiktionary", "olowiki", "omwiki", "omwiktionary", "orwiki", "orwikisource", "orwiktionary", "oswiki", "outreachwiki", "pagwiki", "pamwiki", "papwiki", "pawiki", "pawikibooks", "pawikisource", "pawiktionary", "pcdwiki", "pcmwiki", "pdcwiki", "pflwiki", "pihwiki", "piwiki", "piwiktionary", "plwiki", "plwikibooks", "plwikimedia", "plwikinews", "plwikiquote", "plwikisource", "plwikivoyage", "plwiktionary", "pmswiki", "pmswikisource", "pnbwiki", "pnbwiktionary", "pntwiki", "pswiki", "pswikibooks", "pswikivoyage", "pswiktionary", "ptwiki", "ptwikibooks", "ptwikimedia", "ptwikinews", "ptwikiquote", "ptwikisource", "ptwikiversity", "ptwikivoyage", "ptwiktionary", "pwnwiki", "quwiki", "quwikibooks", "quwikiquote", "quwiktionary", "rmwiki", "rmwikibooks", "rmwiktionary", "rmywiki", "rnwiki", "rnwiktionary", "roa_rupwiki", "roa_rupwiktionary", "roa_tarawiki", "rowiki", "rowikibooks", "rowikinews", "rowikiquote", "rowikisource", "rowikivoyage", "rowiktionary", "rswikimedia", "ruewiki", "ruwiki", "ruwikibooks", "ruwikimedia", "ruwikinews", "ruwikiquote", "ruwikisource", "ruwikiversity", "ruwikivoyage", "ruwiktionary", "rwwiki", "rwwiktionary", "sahwiki", "sahwikiquote", "sahwikisource", "satwiki", "sawiki", "sawikibooks", "sawikiquote", "sawikisource", "sawiktionary", "scnwiki", "scnwiktionary", "scowiki", "scwiki", "scwiktionary", "sdwiki", "sdwikinews", "sdwiktionary", "sewiki", "sewikibooks", "sewikimedia", "sgwiki", "sgwiktionary", "shiwiki", "shnwiki", "shnwikibooks", "shnwikivoyage", "shnwiktionary", "shwiki", "shwiktionary", "shywiktionary", "simplewiki", "simplewikibooks", "simplewikiquote", "simplewiktionary", "siwiki", "siwikibooks", "siwiktionary", "skrwiki", "skrwiktionary", "skwiki", "skwikibooks", "skwikiquote", "skwikisource", "skwiktionary", "slwiki", "slwikibooks", "slwikiquote", "slwikisource", "slwikiversity", "slwiktionary", "smnwiki", "smwiki", "smwiktionary", "snwiki", "snwiktionary", "sourceswiki", "sowiki", "sowiktionary", "specieswiki", "sqwiki", "sqwikibooks", "sqwikinews", "sqwikiquote", "sqwiktionary", "srnwiki", "srwiki", "srwikibooks", "srwikinews", "srwikiquote", "srwikisource", "srwiktionary", "sswiki", "sswiktionary", "stqwiki", "stwiki", "stwiktionary", "suwiki", "suwikibooks", "suwikiquote", "suwikisource", "suwiktionary", "svwiki", "svwikibooks", "svwikinews", "svwikiquote", "svwikisource", "svwikiversity", "svwikivoyage", "svwiktionary", "swwiki", "swwikibooks", "swwiktionary", "szlwiki", "szywiki", "tawiki", "tawikibooks", "tawikinews", "tawikiquote", "tawikisource", "tawiktionary", "taywiki", "tcywiki", "tenwiki", "test2wiki", "testwiki", "testwikidatawiki", "tetwiki", "tewiki", "tewikibooks", "tewikiquote", "tewikisource", "tewiktionary", "tgwiki", "tgwikibooks", "tgwiktionary", "thwiki", "thwikibooks", "thwikinews", "thwikiquote", "thwikisource", "thwiktionary", "tiwiki", "tiwiktionary", "tkwiki", "tkwikibooks", "tkwikiquote", "tkwiktionary", "tlwiki", "tlwikibooks", "tlwikiquote", "tlwiktionary", "tlywiki", "tnwiki", "tnwiktionary", "towiki", "towiktionary", "tpiwiki", "tpiwiktionary", "trvwiki", "trwiki", "trwikibooks", "trwikimedia", "trwikinews", "trwikiquote", "trwikisource", "trwikivoyage", "trwiktionary", "tswiki", "tswiktionary", "ttwiki", "ttwikibooks", "ttwikiquote", "ttwiktionary", "tumwiki", "twwiki", "twwiktionary", "tyvwiki", "tywiki", "uawikimedia", "udmwiki", "ugwiki", "ugwikibooks", "ugwikiquote", "ugwiktionary", "ukwiki", "ukwikibooks", "ukwikinews", "ukwikiquote", "ukwikisource", "ukwikivoyage", "ukwiktionary", "urwiki", "urwikibooks", "urwikiquote", "urwiktionary", "uzwiki", "uzwikibooks", "uzwikiquote", "uzwiktionary", "vecwiki", "vecwikisource", "vecwiktionary", "vepwiki", "vewiki", "viwiki", "viwikibooks", "viwikiquote", "viwikisource", "viwikivoyage", "viwiktionary", "vlswiki", "votewiki", "vowiki", "vowikibooks", "vowikiquote", "vowiktionary", "warwiki", "wawiki", "wawikibooks", "wawikisource", "wawiktionary", "wbwikimedia", "wikidatawiki", "wikifunctionswiki", "wikimania2015wiki", "wikimania2016wiki", "wikimania2017wiki", "wowiki", "wowikiquote", "wowiktionary", "wuuwiki", "xalwiki", "xhwiki", "xhwikibooks", "xhwiktionary", "xmfwiki", "yiwiki", "yiwikisource", "yiwiktionary", "yowiki", "yowikibooks", "yowiktionary", "yuewiktionary", "zawiki", "zawikibooks", "zawikiquote", "zawiktionary", "zeawiki", "zghwiki", "zh_classicalwiki", "zh_min_nanwiki", "zh_min_nanwikibooks", "zh_min_nanwikiquote", "zh_min_nanwikisource", "zh_min_nanwiktionary", "zh_yuewiki", "zhwiki", "zhwikibooks", "zhwikinews", "zhwikiquote", "zhwikisource", "zhwikiversity", "zhwikivoyage", "zhwiktionary", "zuwiki", "zuwikibooks", "zuwiktionary" ] DUMP = "2024-11" test_url = f"https://dumps.wikimedia.org/other/mediawiki_history/{DUMP}/aawiki/{DUMP}.aawiki.all-time.tsv.bz2" DUMP_LOC_PREFIX = f"https://dumps.wikimedia.org/other/mediawiki_history/{DUMP}/" FILE_LOC_PREFIX = "/data/users/mgaughan/mw-repo-lifecycles/wiki_activity_data/compressed_monthly_activity_files/" YEARS = ['2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024'] MONTHS = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'] def download_file(url): print(f"Try to get {url}") response = requests.get(url) if "content-disposition" in response.headers: content_disposition = response.headers["content-disposition"] filename = FILE_LOC_PREFIX + content_disposition.split("filename=")[1] else: filename = FILE_LOC_PREFIX + url.split("/")[-1] with open(filename, mode="wb") as file: file.write(response.content) print(f"Downloaded file {filename}") return filename def batch_for_monthly(): urls = [] for entry in MONTHLY_PROJECTS: for year in YEARS: for month in MONTHS: urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.{year}-{month}.tsv.bz2") for url in urls: try: download_file(url) except Exception: print(f"error! {url}") def batch_for_yearly(): urls = [] for entry in YEARLY_PROJECTS: for year in YEARS: urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.{year}.tsv.bz2") for url in urls: try: download_file(url) except Exception: print(f"error! {url}") def batch_parallel_for_single(): urls = [] for entry in ALL_PROJECTS: if entry not in YEARLY_PROJECTS and entry not in MONTHLY_PROJECTS: urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.all-time.tsv.bz2") for url in urls: download_file(url) ''' with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: future_to_filepath = {executor.submit(download_file, url): url for url in urls} for future in concurrent.futures.as_completed(future_to_filepath): filepath = future_to_filepath[future] try: data = future except KeyboardInterrupt: print("Keyboard interrupt received, shutting down executor") executor.shutdown(wait=False, cancel_futures=True) except Exception as exc: print('generated an exception: %s' % (exc)) ''' if __name__ == "__main__": batch_for_monthly()