利用C#实现网络爬虫

2019-12-30 11:54:11王旭

第14行获得了读取的数据大小read,如果read>0说明数据可能还没有读完,所以在27行继续请求读下一个数据包;

如果read<=0说明所有数据已经接收完毕,这时rs.Html中存放了完整的HTML数据,就可以进行下一步的处理了。

第26行把这一次得到的字符串拼接在之前保存的字符串的后面,最后就能得到完整的HTML字符串。 

然后说一下判断所有任务完成的处理


private void StartDownload()
{
 _checkTimer = new Timer(new TimerCallback(CheckFinish), null, 0, 300);
 DispatchWork();
}

private void CheckFinish(object param)
{
 if (_workingSignals.IsFinished()) //检查是否所有工作实例都为Finished
 {
  _checkTimer.Dispose(); //停止定时器
  _checkTimer = null;
  if (DownloadFinish != null && _ui != null) //判断是否注册了完成事件
  {
   _ui.Dispatcher.Invoke(DownloadFinish, _index); //调用事件
  }
 }
}

第3行创建了一个定时器,每过300ms调用一次CheckFinish来判断是否完成任务。
第15行提供了一个完成任务时的事件,可以给客户程序注册。_index里存放了当前下载URL的个数。

该事件的定义是


public delegate void DownloadFinishHandler(int count);

/// <summary>
/// 全部链接下载分析完毕后触发
/// </summary>
public event DownloadFinishHandler DownloadFinish = null;

3. 保存页面文件

这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行了。


private void SaveContents(string html, string url)
{
 if (string.IsNullOrEmpty(html)) //判断html字符串是否有效
 {
  return;
 }
 string path = string.Format("{0}{1}.txt", _path, _index++); //生成文件名

 try
 {
  using (StreamWriter fs = new StreamWriter(path))
  {
   fs.Write(html); //写文件
  }
 }
 catch (IOException ioe)
 {
  MessageBox.Show("SaveContents IO" + ioe.Message + " path=" + path);
 }

 if (ContentsSaved != null)
 {
  _ui.Dispatcher.Invoke(ContentsSaved, path, url); //调用保存文件事件
 }
}

第23行这里又出现了一个事件,是保存文件之后触发的,客户程序可以之前进行注册。

 


public delegate void ContentsSavedHandler(string path, string url);

/// <summary>
/// 文件被保存到本地后触发
/// </summary>
public event ContentsSavedHandler ContentsSaved = null;