快速从网页抓取图像

时间:2011-01-10 20:04:20

标签: c#

我想知道是否有人可以在这里给我一些指导。我希望能够以编程方式尽快在网页上获取每个图像。这就是我目前正在做的事情:(请注意,clear是一个WebBrowser控件)

if (clear.ReadyState == WebBrowserReadyState.Complete)
{
    doc = (IHTMLDocument2)clear.Document.DomDocument;
    sobj = doc.selection;
    body = doc.body as HTMLBody;
    sobj.clear();
    range = body.createControlRange() as IHTMLControlRange;
    for (int j = 0; j < clear.Document.Images.Count; j++)
    {
        img = (IHTMLControlElement)clear.Document.Images[j].DomElement;
        HtmlElement ele = clear.Document.Images[j];
        string test = ele.OuterHtml;
        string test2 = ele.InnerHtml;

        range.add(img);
        range.select();
        range.execCommand("Copy", false, null);
        Image image = Clipboard.GetImage();
        if (image != null)
        {
            temp = new Bitmap(image);
            Clipboard.Clear();
            ......Rest of code ...........
        }
    }
}

但是,我发现很多图像都很慢,而且还会劫持我的剪贴板。我想知道是否有更好的方法?

2 个答案:

答案 0 :(得分:1)

我建议使用HttpWebRequestHttpWebResponse。在您的评论中,您询问了效率/速度。

从使用HttpWebRequest 传输数据的角度来看,最糟糕的情况与使用浏览器控件相同,但几乎肯定要好得多。当您(或浏览器)向Web服务器发出请求时,您最初只获取页面本身的标记。此标记可能包括图像引用,flash等对象以及引用但未实际包含在页面本身中的资源(如脚本和css文件)。然后,Web浏览器将继续请求呈现页面所需的所有相关资源,但使用HttpWebRequest,您只能请求您实际需要的内容(图像)。

资源或处理能力的角度来看,从页面中提取实体是没有比较的:使用broswer控件比扫描HttpWebResponse要占用更多资源。使用C#代码扫描一些数据非常快。渲染网页涉及javascript,图形渲染,CSS解析,布局,缓存等。实际上,这是一项非常密集的操作。在程序控制下使用浏览器,这很快就会变得明显:我怀疑你每隔一秒左右就可以处理多个页面。

另一方面,直接处理Web服务器的C#程序(不涉及渲染引擎)可能每秒处理数十个(如果不是数百个)页面。出于所有实际目的,您实际上仅受服务器响应时间和Internet连接的限制。

答案 1 :(得分:0)

这里有多种方法。

如果这是一次性的事情,只需浏览网站并选择文件&gt;将页面另存为...并让浏览器在本地保存所有图像。

如果这是一个反复发生的事情,有很多不同的方式。

  1. 购买一个执行此操作的程序。我确信有数百个实现。

  2. 使用html agility包抓取页面并编译我想要的所有图像的列表。然后为下载并保存它的每个图像旋转一个线程。您可能会根据各种因素(例如您的(和站点)带宽和本地磁盘速度)限制线程数。请注意,某些站点对它们将处理的每个连接的并发请求数有任意限制。根据网站的不同,这可能只有3个。

  3. 这绝不是决定性的。还有很多其他方法。我可能不会通过WebBrowser控件来做到这一点。该代码看起来很脆弱。