WebMagic爬虫主要由Downloader,PageProcessor,Pipelines,scheduler四个主要的部分构成。总调度类为Spider,主要负责请求任务分发,控制多个线程同时对多个网页进行下载,解析,存储。本文会针对这五个部分进行详细的代码剖析。
1.Downloader
1.1 Downloader接口
public interface Downloader {
/**
* Downloads web pages and store in Page object.
*
* @param request request
* @param task task
* @return page
*/
public Page download(Request request, Task task);
/**
* Tell the downloader how many threads the spider used.
* @param threadNum number of threads
*/
public void setThread(int threadNum);
}
Downloader接口声明了两个方法,最主要的方法是download,针对参数request,下载相应的页面,将下载内容等用Page对象封装,并返回,以供PageProcessor处理。download还有个task参数,这个参数用来提供下载页面时的一些参数配置。setThread方法并不是必须的,但是WebMagic使用了Httpclient来实现Downloader,HttpClient可以实现一个客户端控制多个HTTP请求,从而避免多次的创建HttpClient,节省内存空间。所以WebMagic声明setThread方法。具体的实现我会在HttpClientDownloader中说明。
1.2 AbstractDownloader抽象类
继承Downloader接口,但是新添加如下四个方法
/**
* A simple method to download a url.
*
* @param url url
* @return html
*/
public Html download(String url) {
return download(url, null);
}
/**
* A simple method to download a url.
*
* @param url url
* @param charset charset
* @return html
*/
public Html download(String url, String charset) {
Page page = download(new Request(url), Site.me().setCharset(charset).toTask());
return (Html) page.getHtml();
}
protected void onSuccess(Request request) {
}
protected void onError(Request request) {
}
这里不多做介绍,这四种方法对于整个爬虫的影响不大,尤其是第三,和第四个方法,暂时并没有搞清楚其作用是什么。
1.3 HttpClientDownloader类
这个类是实现了Downloader接口的类。它主要是借助HttpClient第三方包来实现HTTP请求,和对HTTP响应的处理,从而将相应页面的源码下载下来。当然HttpClientDownloader是有局限的,其短板是不能处理动态页面。该类中的httpClientGenerator对象负责HTTPClient的生成,httpClients对象存储不同域的HTTPClient