我想知道是否有人可以在这里给我一些指导。我希望能够以编程方式尽快在网页上获取每个图像。这就是我目前正在做的事情:(请注意,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 ...........
}
}
}
但是,我发现很多图像都很慢,而且还会劫持我的剪贴板。我想知道是否有更好的方法?
答案 0 :(得分:1)
我建议使用HttpWebRequest
和HttpWebResponse
。在您的评论中,您询问了效率/速度。
从使用HttpWebRequest
传输数据的角度来看,最糟糕的情况与使用浏览器控件相同,但几乎肯定要好得多。当您(或浏览器)向Web服务器发出请求时,您最初只获取页面本身的标记。此标记可能包括图像引用,flash等对象以及引用但未实际包含在页面本身中的资源(如脚本和css文件)。然后,Web浏览器将继续请求呈现页面所需的所有相关资源,但使用HttpWebRequest
,您只能请求您实际需要的内容(图像)。
从资源或处理能力的角度来看,从页面中提取实体是没有比较的:使用broswer控件比扫描HttpWebResponse
要占用更多资源。使用C#代码扫描一些数据非常快。渲染网页涉及javascript,图形渲染,CSS解析,布局,缓存等。实际上,这是一项非常密集的操作。在程序控制下使用浏览器,这很快就会变得明显:我怀疑你每隔一秒左右就可以处理多个页面。
另一方面,直接处理Web服务器的C#程序(不涉及渲染引擎)可能每秒处理数十个(如果不是数百个)页面。出于所有实际目的,您实际上仅受服务器响应时间和Internet连接的限制。
答案 1 :(得分:0)
这里有多种方法。
如果这是一次性的事情,只需浏览网站并选择文件&gt;将页面另存为...并让浏览器在本地保存所有图像。
如果这是一个反复发生的事情,有很多不同的方式。
购买一个执行此操作的程序。我确信有数百个实现。
使用html agility包抓取页面并编译我想要的所有图像的列表。然后为下载并保存它的每个图像旋转一个线程。您可能会根据各种因素(例如您的(和站点)带宽和本地磁盘速度)限制线程数。请注意,某些站点对它们将处理的每个连接的并发请求数有任意限制。根据网站的不同,这可能只有3个。
这绝不是决定性的。还有很多其他方法。我可能不会通过WebBrowser控件来做到这一点。该代码看起来很脆弱。