2011-04-21 38 views
1

这基本上是我在做什么。我从en.wikipedia.org中选择一篇科学文章,并获取编辑过的用户列表以及他们编辑文章的次数。为了得到这个,我按照页面中的链接来获取,并将其引导至工具服务器。我使用此页http://toolserver.org/~daniel/WikiSense/Contributors.php?wikilang=en&wikifam=.wikipedia.org&page=Quantum_mechanics&since=&until=&grouped=on&hideanons=on&order=-edit_count&max=100&order=-edit_count&format=wiki来检索排序列表中的编辑器,并排除匿名。这很好,因为它有一个很好格式化的列表(尽管它有我不需要的日期)。下载网页的一部分 - 数据挖掘

但是,为了评判他们的可信度,我需要查看顶级用户并查看他们贡献的热门文章,看看他们是编辑了大量科学文章还是随机垃圾。我很难获取每个用户的数据,因为目前我唯一可以找到的网站显示用户历史记录为http://en.wikipedia.org/w/index.php?title=Special:Contributions&limit=5000&target=Aquirata

但是,获取单个用户的网页需要相当长的时间,至少20秒,然后我仍然必须分析无用的数据等等。我不需要接近尽可能多的数据,因为我不得不下载数据。这是到目前为止我的代码用于获取用户的数据:

static string getWebPage(string url) 
    { 
     WebClient client = new WebClient(); 
     client.Headers.Add("user-agent", 
      "Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4"); 

     return client.DownloadString(url); 
    } 

    static void Main(string[] args) 
    { 
     string url = "http://en.wikipedia.org/w/index.php?title=Special:Contributions&limit=50&target=Aquirata"; 

     string page = getWebPage(url); 
     var lines = page.Split('\n', '\r'); 
     var edits = lines.Where(t => t.StartsWith("<li class")); 
     foreach (string s in edits) 
      Console.WriteLine(s); 
     Console.ReadLine(); 
    } 

是否有一种可能的选择,这将是更快和/或更容易?也许有一个数据库在这个地方? (我不确定wikimedia是否有用户贡献的统计数据)。

此外,我使用C#是因为我最熟悉它。我可能会切换到Java允许跨平台,但我打开任何其他建议。

回答

1

只能使用范围请求来完成文档的某个部分的选择,这些请求在RFC 2616 Section 14.16中进行了说明。

例如:

$ curl -H"range: bytes=1-20" www.apache.org 
!DOCTYPE HTML PUBLIC 
$ 
0

我认为你可以用维基作为处理XML,所以你可以使用的XPath来获取所需的数据。

+0

XPATH是什么? – 2011-04-21 23:11:26