最近在学习的时候总结了下,发现既然js能通过元素的id去找到这个元素,那么我用c#是不是可以这样去搞呢,但是我们事先不知道他们的id,还好的是,我并非想全部去抓取某个元素里的内容,我只是想抓取某一类元素的内容,那图片来说吧,我要抓取某个网站里面的图片。
先说下原理:利用WebBrowser类中的GetElementsByTagName(元素类型)方法我们就可以将网页中的某种类型的元素获取到,结果一集合的方式得出,例如GetElementsByTagName("img"),我们就得到图片类型的集合了。得到图片的集合后,我们再对集合里的元素进行解析,像这个<img src="http://img1.qq.com/www/xxx.gif" />,看到了吧,有这个src我们就可以搞到东西了。
下面面填下主要代码:
首先我们获取网页上的所需元素集合如img:
/// <summary> /// 检查出所有图片并采集到本地 /// </summary> public void SearchImgList() { //取得所有图片地址 string sImgUrl; WebBrowser wb = new WebBrowser(); HtmlElementCollection elemColl = this.wb.Document.GetElementsByTagName("img"); this.iImgCount = elemColl.Count; List<string> listsrcurl = new List<string>(); foreach (HtmlElement elem in elemColl) { sImgUrl = elem.GetAttribute("src"); listsrcurl.Add(sImgUrl); } }
我们将“img”元素的集合通过解析后放入listsrcurl中,集合中存放了这些img的url,通过url我们就可以去下载这些图片了
try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imgUrl); request.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1; Natas.Robot)"; request.Timeout = 100000; WebResponse response = request.GetResponse(); if (response.ContentType.ToLower().StartsWith("image/")) { Stream stream = response.GetResponseStream(); byte[] arrayByte = new byte[1024]; int imgLong = (int)response.ContentLength; int l = 0; FileStream fso = new FileStream(path, FileMode.Create);//path是保存地址 while (l < imgLong) { int i = stream.Read(arrayByte, 0, 1024); fso.Write(arrayByte, 0, i); l += i; } fso.Close(); stream.Close(); response.Close(); } else { return ; } } catch (WebException) { return ; }
差不多这些吧,这样可以下到一些使用img标签的图片了。