C# 快速从网页抓取图像

C# 快速从网页抓取图像,c#,C#,我想知道这里是否有人能给我一些指导。我希望能够通过编程尽快获得网页上的每一张图片。这就是我目前正在做的:注意clear是一个WebBrowser控件 if (clear.ReadyState == WebBrowserReadyState.Complete) { doc = (IHTMLDocument2)clear.Document.DomDocument; sobj = doc.selection; body = doc.body as HTMLBody; s

我想知道这里是否有人能给我一些指导。我希望能够通过编程尽快获得网页上的每一张图片。这就是我目前正在做的:注意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 ...........
        }
    }
}

然而,我发现这对很多图像来说都很慢,而且它还劫持了我的剪贴板。我想知道是否有更好的方法?

这里有多种方法

如果是一次性的,只需浏览到该站点并选择文件>另存页面为。。。并让浏览器在本地为您保存所有图像

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

购买一个这样做的程序。我确信有数百种实现

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

这决不是决定性的。还有很多其他的方法。不过,我可能不会通过WebBrowser控件来实现。这段代码看起来很脆弱。

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

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

从从页面中提取实体所需的资源或处理能力的角度来看,这是无法比较的:使用broswer控件比扫描HttpWebResponse要占用更多的资源。使用C代码扫描某些数据非常快。呈现网页涉及javascript、图形呈现、css解析、布局、缓存等。实际上,这是一个相当密集的行动。在编程控制下使用浏览器,这一点很快就会变得明显:我怀疑你每秒处理的页面可能超过一页


另一方面,一个直接处理web服务器的C程序,如果不涉及渲染引擎,可能每秒处理几十甚至几百页。实际上,你只会受到服务器响应时间和互联网连接的限制。

与其复制和粘贴,不如直接获取URL并下载图像?如果您使用HttpWebRequest和HttpWebResponse而不是浏览器控件,这也会大大降低资源密集度,但创建HttpWebRequest/Response、扫描它然后分别获取每个图像所需的时间不会比获取整个网页以及图像并扫描它所需的时间长?我并不真正关心资源,只关心speedSee答案。。。评论时间有点长了!