调整从URL获取HTML的方法

时间:2011-08-17 13:55:10

标签: .net httpwebrequest web-crawler

有许多问题和答案显示如何从URL获取HTML内容,但我需要一个非常快速的算法,因为我们有很多Web连接要做。

那么从URL获取内容(通常是HTML)的最有效方法是什么?

2 个答案:

答案 0 :(得分:2)

WebClient可能有一个更简单的api,但两者都应该有用。

就运行大量请求而言,您应该使用多个线程或线程池来实现它。如果网址在同一台服务器上,则应注意不要超载。

如果你想通过线程池实现它的例子,我可以提供它们。

更新

using System;
using System.Threading;
using System.Collections.Generic;
using System.Net;
using System.IO;

namespace WebClientApp
{
class MainClassApp
{
    private static int requests = 0;
    private static object requests_lock = new object();

    public static void Main() {

        List<string> urls = new List<string> { "http://www.google.com", "http://www.slashdot.org"};
        foreach(var url in urls) {
            ThreadPool.QueueUserWorkItem(GetUrl, url);
        }

        int cur_req = 0;

        while(cur_req<urls.Count) {

            lock(requests_lock) {
                cur_req = requests; 
            }

            Thread.Sleep(1000);
        }

        Console.WriteLine("Done");
    }

private static void GetUrl(Object the_url) {

        string url = (string)the_url;
        WebClient client = new WebClient();
        Stream data = client.OpenRead (url);

        StreamReader reader = new StreamReader(data);
        string html = reader.ReadToEnd ();

        /// Do something with html
        Console.WriteLine(html);

        lock(requests_lock) {
            requests++; 
        }
    }
}

}

答案 1 :(得分:1)

使用Parallel.Invoke设置所有请求并为其提供慷慨MaxDegreesOfParallelism

您将花费大部分时间等待I / O,因此尽可能多地使用多线程。