下载网页的一部分 - 数据挖掘

时间:2011-04-21 21:04:25

标签: c# php http data-mining

这基本上就是我正在做的事情。我从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 个答案:

答案 0 :(得分:8)

我认为维基百科提供了下载数据(因此您无需从HTML页面中删除它)。

请参阅:http://dumps.wikimedia.org/enwiki/

HTH

答案 1 :(得分:1)

只选择文档的某个部分可以使用范围请求完成,这些请求记录在RFC 2616 Section 14.16中。

例如:

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

答案 2 :(得分:0)

我认为您可以将WIKI作为XML处理,以便您可以使用XPATH来获取所需的数据。