最近做数据采集,碰到了很多钉子,这里一一记录下来。
很久没写东西了... ,不是没有写的,是没心情写,想的太多了,在想些什么,自己也说不清楚,往大了说关于人生,往小了说关于怎么活。扯远了,不废话了。
1、选择什么方式去采集?
网上方式很多WebClient,WebRequest和WebBroswer,分析需求之后选择 WebBroswer ,
原因有几点:
a、很多地方需要登陆之后才能采集,要做模拟登陆就会牵扯到状态保存问题等等
b、多级页面跳转,也需要模拟去触发点击事件
c、Ajax页面数据采集
2、WebBroswer 的加载状态问题,页面什么时候加载完?
WebBroswer 加载状态一个页面时候加载完 , 一开始是一个很头疼的问题 , 写了个Demo发单凭WebBrowser.ReadyState是不可靠的 , 有人直接延时,但延多少根本没办法确定。
后来测试发现WebBrowser_DocumentCompleted事件会重复触发,造成业务逻辑混乱,找到问题之后就好办了,用完就去掉它这个委托。
if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;
webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
3、如何查找某Html元素?
for (int i = 0; i < hDoc.All.Count; i++)
{
if (hDoc.All[i].TagName.ToUpper().Equals("INPUT"))
{
if (hDoc.All[i].GetAttribute("type").Trim().Equals("button"))
{
hDoc.All[i].InvokeMember("click"); //触发它的事件
break;
}
}
}
4、如何获取Ajax页面动态加载的数据?
if (WebBrowser.ReadyState != WebBrowserReadyState.Complete || WebBrowserst.StatusText != "完成" && !WebBrowser.IsBusy) return;
然后再用timer延时2秒去取WebBrowser.Document,就可以了
5、如何给WebBroswer加入内容?
//例如注册脚本
HtmlElement ele = webBrowser1.Document.CreateElement("script");
ele.SetAttribute("type", "text/javascript");
ele.SetAttribute("text", "function aa(s){alert(s);}");
WebBrowser.Document.Body.AppendChild(ele);
6、如何调用WebBroswer加载页面内的Js方法?
WebBrowser.Document.InvokeScript("aa", new object[] {'Hi , daniel;!'});
7、采集回来的Html代码不完整或者对方的代码本来就有问题怎么办?
这里要去修复Html代码,我用的HtmlParser,但效率不怎么样,目前还没发现更好的!
8、页面弹出错误脚本怎么办?
这里要分清是网页弹出来的还是浏览器弹出来的,WebBrowser本省就是一个浏览器。
如果是网页弹出来的,可以通过注入脚本去覆盖原来的alert方法,如果是浏览器的可以把WebBrowser.ScriptErrorsSuppresse设为True.
9、文件下载弹出框怎么处理?
我的解决办法是采用系统API,去找到那个窗体然后去点击上面的某个按钮。
来源:https://www.cnblogs.com/DanielChow/archive/2010/08/07/1794839.html