很多网页的内容包括图片是用JS或Jquery动态加载的,用Webbrowser直接获得的源码是没有参考价值的,而JS加载后含所有element的代码很难获取的,起码笔者搜索了一圈下来看到的方法都几乎没有使用价值。
笔者这里分享一种解决方案,随便找个网页会动态加载内容的,不难发现需要加载的内容需要你滚动页面,视野范围内的内容就会动态加载,于是乎,办法就来了。
首先,你还必须先研究一下你需要抓取的网站的内容构造,比如笔者需要抓取的网页共有100张图片,并且需要页面滚动到图片位置这些图片才会加载。于是先用普通浏览器等加载完右击页面选检查,分析得到这些图片的class里面包含title,下面就可以根据这个来操作了。在webBrowser1_DocumentCompleted也就是加载完之后(注意并不是js也加载完),获取当前页面所有元素并存储在docall当中,然后开启Timer1。
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
currentEleIndex = 0;
docAll = webBrowser1.Document.All;
this.timer1.Enabled = true;
}
在Timer1里面,根据上面的分析我们遍历所有元素,找到class包含title的图片元素并滚动到此元素,这时候js就会执行了,这里有一句scrollcount++ % 5 == 0来控制并不对每个图片都执行这个操作,因为页面图片太多,每个都执行一边没必要,这里设置每5个滚动一次,因为窗口可是范围一般都可以显示大于2行。这里有个要注意的,在页面滚动的时候会不断触发webBrowser1_DocumentCompleted事件。docAll和docAll.Count即元素总数也会不断改变。最后,在页面不再刷新的时候就可以执行后面的工作了,也就是这里 startprocess();所转向的函数。
//webbrowser加载完后,要往下滚动来让js加载所有项目及图片
//timer1隔一段时间滚动一下
private void timer1_Tick(object sender, EventArgs e)
{
while (currentEleIndex < docAll.Count)
{
string s = docAll[currentEleIndex].GetAttribute("classname");