代码之家  ›  专栏  ›  技术社区  ›  JeffThompson

下载维基百科页面的全部历史记录

  •  4
  • JeffThompson  · 技术社区  · 7 年前

    下载整个维基百科文章或使用 Special:Export URL参数:

    curl -d "" 'https://en.wikipedia.org/w/index.php?title=Special:Export&pages=Stack_Overflow&limit=1000&offset=1' -o "StackOverflow.xml"
    

    全部的 网站,包括所有版本的每一篇文章从 here

    有没有预先构建的方法来实现这一点?(似乎一定有。)

    2 回复  |  直到 2 年前
        1
  •  5
  •   Tim Newsome    4 年前

    import mwclient
    import json
    import time
    
    site = mwclient.Site('en.wikipedia.org')
    page = site.pages['Wikipedia']
    
    for i, (info, content) in enumerate(zip(page.revisions(), page.revisions(prop='content'))):
        info['timestamp'] = time.strftime("%Y-%m-%dT%H:%M:%S", info['timestamp'])
        print(i, info['timestamp'])
        open("%s.json" % info['timestamp'], "w").write(json.dumps(
            { 'info': info,
                'content': content}, indent=4))
    
        2
  •  4
  •   Fredrick Brennan    2 年前

    漫无目的地四处游荡,寻找另一个问题的线索,我用我自己的方式说,我对这个话题一无所知!我是在读了你的问题后发现这个问题的: http://mwclient.readthedocs.io/en/latest/reference/page.html .看看 revisions

    http://mwclient.readthedocs.io/en/latest/user/page-ops.html#listing-page-revisions .

    使用 mwclient

    #!/usr/bin/env python3
    import logging, mwclient, pickle, os
    from mwclient import Site
    from mwclient.page import Page
    logging.root.setLevel(logging.DEBUG)
    
    logging.debug('getting page...')
    env_page = os.getenv("MEDIAWIKI_PAGE")
    page_name = env_page is not None and env_page or 'Stack Overflow'
    page_name = Page.normalize_title(env_page)
    site = Site('en.wikipedia.org') # https by default. change w/`scheme=`
    page = site.pages[page_name]
    
    logging.debug('extracting revisions (may take a really long time, depending on the page)...')
    revisions = []
    for i, revision in enumerate(page.revisions()):
        revisions.append(revision)
    
    logging.debug('saving to file...')
    with open('{}Revisions.mediawiki.pkl'.format(page_name), 'wb+') as f:
        pickle.dump(revisions, f, protocol=0) # protocol allows backwards compatibility between machines