2011-04-21 39 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