4

对于我的一个NLP项目,我想从 Wikipedia 随机下载大量页面(比如 10000 个)。在不下载整个 XML 转储的情况下,这是我能想到的:

  1. 打开维基百科页面
  2. 以广度优先搜索方式解析链接的 HTML 并打开每个页面
  3. 在2中获得的页面上递归打开链接

在第 2 步和第 3 步中,如果我达到了我想要的页数,我将退出。

你会怎么做?请提出您能想到的更好的想法。

答案:这是我的 Python 代码:

# Get 10000 random pages from Wikipedia.
import urllib2
import os
import shutil
#Make the directory to store the HTML pages.
print "Deleting the old randompages directory"
shutil.rmtree('randompages')

print "Created the directory for storing the pages"
os.mkdir('randompages')

num_page = raw_input('Number of pages to retrieve:: ')

for i in range(0, int(num_page)):
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    infile = opener.open('http://en.wikipedia.org/wiki/Special:Random')

    page = infile.read()

    # Write it to a file.
    # TODO: Strip HTML from page
    f= open('randompages/file'+str(i)+'.html','w')
    f.write(page)
    f.close()

    print "Retrieved and saved page",i+1
4

6 回答 6

24
for i = 1 to 10000
    get "http://en.wikipedia.org/wiki/Special:Random"
于 2010-01-03T13:49:43.493 回答
20

维基百科有一个API。使用此 API,您可以在给定的命名空间中获取任何随机文章:

http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=5

对于您调用的每篇文章,还可以获得 wiki 文本:

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Main%20Page&rvprop=content
于 2010-01-03T13:52:34.730 回答
1

我会采取相反的方式——从 XML 转储开始,然后丢弃你不想要的东西。

就您而言,如果您希望进行自然语言处理,我会假设您对具有完整句子的页面感兴趣,而不是链接列表。如果您以您描述的方式抓取链接,您将访问很多链接页面。

当您受益于使用 XML 解析工具使您的选择过程更容易时,为什么要避免使用 XML?

于 2010-01-03T13:53:03.107 回答
0

您可能能够完成大多数要求:

http://cs.fit.edu/~mmahoney/compression/enwik8.zip

是一个包含 100 MB 维基百科的 ZIP 文件,已为您提取。链接文件的大小约为 16 MB。

于 2010-01-03T13:51:44.457 回答
0

查看DBpedia 项目

有至少一些文章 URL 的小的可下载块。一旦你解析了10000,你可以仔细批量下载它们......

于 2010-01-03T13:51:58.950 回答
0

我知道它已经很久了,但是对于那些仍在寻找一种有效的方法来抓取和下载大量维基百科页面(或整个维基百科)而不违反robot.txt 文件的人来说,'Webb' 库很有用。链接在这里:

用于 Web 抓取和抓取的 Webb 库

于 2015-07-26T23:12:03.070 回答