我正在尝试查找维基百科上所有图像的完整列表,然后我可以将其过滤到公共域图像。我从这里下载了SQL转储:
http://dumps.wikimedia.org/enwiki/latest/
研究了数据库架构:
我想我理解它但是当我从维基百科页面中选择一个样本图像时,我无法在转储中的任何地方找到它。例如:
http://en.wikipedia.org/wiki/File:Carrizo_2a.JPG
我在转储'image','imagelinks'和'page'上搜索'Carrizo_2a.JPG'并且找不到它。
这些转储不完整吗?我误解了结构吗?有一个更好的方法吗?
另外,向前迈出一步:在我将列表过滤掉并且我想下载大量图像(数千个)后,我看到一些提及我需要从站点的镜像中执行此操作以防止超载维基百科/维基。如果对此也有任何指导,那将会有所帮助。
答案 0 :(得分:10)
MediaWiki将文件数据存储在两个或三个位置,具体取决于您的计算方式:
当前文件版本的实际元数据存储在image
表中。这可能是你最想要的;你会找到最新的en.wikipedia转储here。
旧的替代文件修订版的数据被移动到oldimage
表,该表与image
表的结构基本相同。此表也被转储,最新的表是here。
最后,每个文件(通常)也对应于命名空间6(File:
)中非常普通的wiki页面。您可以在XML转储中找到这些文本,与任何其他页面相同。
哦,您在英语维基百科转储中找不到链接到的文件的原因是它们来自维基共享资源的共享存储库。您可以在Commons data dumps中找到它们。
至于下载实际文件,here's the (apparently) official documentation.据我所知,“批量下载目前(截至2012年9月)可通过镜像获得,但不是直接从维基媒体服务器提供。“如果你想要一个tarball中的所有图像,你将不得不使用镜像。如果你只是在维基百科和/或下议院的图像上拉出数百万的相对较小的子集,那么直接使用维基媒体服务器应该没问题。
请记住行使基本的礼貌:发送一个user-agent string来表明自己并且不要太过刻苦。特别是,我建议按顺序运行下载,这样您只有在完成上一个文件后才开始下载下一个文件。这不仅比并行下载更容易实现,而且它确保您不会超过您的带宽份额,并允许下载速度或多或少地自动适应服务器负载。
聚苯乙烯。无论您是从镜像下载文件还是直接从维基媒体服务器下载文件,您都需要确定它们所在的目录。典型的Wikipedia文件URL如下所示:
http://upload.wikimedia.org/wikipedia/en/a/ab/File_name.jpg
其中“wikipedia/en
”部分标识维基媒体项目和语言(由于历史原因,Commons列为“wikipedia/commons
”),the "a/ab
" part由前两个十六进制数字给出UTF-8中文件名的MD5哈希值(因为它们在数据库转储中编码)。