Загрузка части веб-страницы - интеллектуальный анализ данных - PullRequest
1 голос
/ 22 апреля 2011

это в основном то, что я делаю. Я выбираю научную статью на 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();
    }

Есть ли альтернатива, которая будет быстрее и / или проще? Может быть, где-то есть база данных для этого? (Я не уверен, что в Викискладе есть статистика вкладов пользователей).

Кроме того, я использую C #, потому что я наиболее знаком с ним. Я мог бы переключиться на Java, чтобы разрешить кроссплатформенность, но я открыт для любых других предложений.

Ответы [ 3 ]

8 голосов
/ 22 апреля 2011

Я думаю, что Википедия предоставляет свои данные для скачивания (так что вам не нужно удалять их со страницы HTML).

См .: http://dumps.wikimedia.org/enwiki/

HTH

1 голос
/ 22 апреля 2011

Выбор только определенной части документа можно выполнить с помощью запроса диапазона, который задокументирован в RFC 2616, раздел 14.16 .

Например:

$ curl -H"range: bytes=1-20" www.apache.org
!DOCTYPE HTML PUBLIC
$
0 голосов
/ 22 апреля 2011

Я думаю, что вы можете иметь дело с WIKI в формате XML, чтобы вы могли использовать XPATH для получения необходимых данных.

...