紧接着上一篇文章,上篇文章发起了http请求,这篇文章来说说http请求结果的处理吧,
还是先看看类图吧:
说说这些类干什么的了
HtmlRequestInfo 是RequestInfo的子类 主要是在爬网是需要一些特殊的信息。
ProcessBase 是处理http返回结果的基类,ProcessHtml 是一个典型的爬虫 ,ProcessJS 处理返回结果中的js,ProcessImage处理图片流
FilterBase 主要用来抓取url链接 FilterHtml用来抓取页面中的页面链接url,FilterImage 抓取图片的url FilterJs抓取js的url
LogBase 是用来记录日志的 LogText 以文本的形式写log
MessageBase 是ProcessBase 之间通信的桥梁,MSMQMessage 实现了该接口。
还是来说说大致的流程吧
这个ProcessBase的子类扮演者相同的角色,为了便于实施分布式不部署,Process之间默认采用消息队列来通信。
ProcessHtml 的地位应该比较基础,主要用于爬网,默认情况它把StartUrl的地址作为爬虫的开始地址,改url返回的内容中究竟要取那些url连接者是有ProcessHtml的Filers属性来决定的,看看Filers的定义大家就很清楚了
static ConcurrentDictionary<FilterBase, bool> _filters;
public ConcurrentDictionary<FilterBase, bool> Filers
{
set { _filters = value; }
get { return _filters; }
}
每一个FilterBase都会返回特定的url字符数组。
如:
<HttpTasks>
<add key="ProcessRequest.ProcessHtml, ProcessRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" value="True"/>
<add key="ProcessRequest.ProcessJS, ProcessRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" value="False"/>
<add key="ProcessRequest.ProcessImage, ProcessRequest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" value="False"/>
</HttpTasks>
这里有3个FilterBase,value表示当前process是否处理,为false则放到特定的队列中,有其他的process来处理。
具体的细节我就不说了,大家请下载源代码吧 http://download.csdn.net/detail/dz45693/4177053