动态网页抓取(园子如何实现多线程使用webborwser采集页面其中我用到了)
优采云 发布时间: 2021-10-04 20:18动态网页抓取(园子如何实现多线程使用webborwser采集页面其中我用到了)
今天在园子里看到了一个学术驴写的爬虫机器人,用C#webbrowser和Application.DoEvents()实现采集动态网页
其实我也是用类似的方法抓取需要登录的网页,还有一些动态页面。
今天想讲的是如何实现webborwser采集页面的多线程使用
其中,我使用了一个 WeiFenLuo.winFormsUI.Docking.dll,它是一个开源组件
下载链接:
关于这个组件,园子里已经有前辈做过详细的使用方法了,这里不再赘述。
在MainForm窗体中添加一个微分罗控件,并将MainForm窗体的IsMdiContainer属性设置为True
并添加addWebForm方法动态添加子表单
public void addWebForm(string s)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new OneStringParmenters(addWebForm), s);
}
else
{
ChildForm f2 = new ChildForm();
f2.Text = s;
webForm.Add(s, f2);
f2.Show(dockPanel1);
}
}
向 ChildForm 窗体添加一个 Webborwser 控件
并添加打开页面的方法
public delegate void OneStringParmenters(string str);//1个string参数委托
public void Navigate(string url)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new OneStringParmenters(Navigate), url);
}
else
{
webBrowser1.Navigate(url);
}
}
和读取页面html方法
private string strHtmlLeng = "";
private delegate void NoParameters();//无参数委托;
public string StrHtmlLeng
{
get
{
if (this.InvokeRequired)
{
IAsyncResult iar = this.BeginInvoke(new NoParameters(GetHtmlLeng));
while (!iar.IsCompleted)
{
System.Threading.Thread.Sleep(0);
}
}
else
{
GetHtmlLeng();
}
return strHtmlLeng;
}
}
private void GetHtmlLeng()
{
strHtmlLeng = webBrowser1.DocumentText;
}
添加多线程方法模拟多线程打开页面读取html
public static void OpenWebPage(object strUrl)
{
DateTime dt = DateTime.Now;
string u = strUrl.ToString();
IAsyncResult iar = Program.form.BeginInvoke(new OneStringParmenters(Program.form.addWebForm), u);
while (!iar.IsCompleted)
{
System.Threading.Thread.Sleep(0);
}
int n = Program.form.webForm.Count;
Program.form.webForm[u].Navigate(u);
System.Threading.Thread.Sleep(TimeSpan.FromMinutes(1));
string strHtml = Program.form.webForm[u].StrHtmlLeng;
//把html输出到本地e盘,当采集信息时,可以直接操作html
System.IO.StreamWriter sw = new StreamWriter(string.Format("e:/{0}.txt", u));
sw.Write(string.Format("开始时间:{0}\r\n 结束时间:{1}\r\n 打开信息:{2}", dt.ToString("G"), DateTime.Now, strHtml));
sw.Dispose();
}
好的。现在使用多线程执行OpenWebPage方法,可以模拟Webborwser的多线程操作
下面是我写的测试用的小程序