阿布云

你所需要的,不仅仅是一个好用的代理。

Java开源爬虫框架WebCollector自定义http请求

阿布云 发表于

WebCollector可以自定义http请求,WebCollector的http请求由Requester完成,BreadthCrawler和RamCrawler本身就实现了Requester接口,默认情况下它们使用自身作为Requester。

自定义http请求只要override它们的getResponse方法即可。

下面例子代码演示了如何在WebCollector中将部分页面的http请求方式改为POST方法:

import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Links;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.net.HttpRequest;
import cn.edu.hfut.dmic.webcollector.net.HttpResponse;
import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;
import java.net.HttpURLConnection;
import java.net.ProtocolException;

import org.json.JSONObject;

/**
 * 本教程演示了如何自定义http请求
 *
 * 有些爬取任务中,可能只有部分URL需要使用POST请求,我们可以利用2.20版本中添 加的MetaData功能,来完成POST请求的定制。
 *
 * 使用MetaData除了可以标记URL是否需要使用POST,还可以存储POST所需的参数信息
 *
 * 教程中还演示了如何定制Cookie、User-Agent等http请求头信息
 *
 * WebCollector中已经包含了org.json的jar包
 *
 * @author hu
 */
public class DemoPostCrawler extends BreadthCrawler {

    public DemoPostCrawler(String crawlPath, boolean autoParse) {
        super(crawlPath, autoParse);
    }

    @Override
    public HttpResponse getResponse(CrawlDatum crawlDatum) throws Exception {
        HttpRequest request = new HttpRequest(crawlDatum.getUrl());

        request.setMethod(crawlDatum.getMetaData("method"));
        String outputData=crawlDatum.getMetaData("outputData");
        if(outputData!=null){
            request.setOutputData(outputData.getBytes("utf-8"));
        }
        return request.getResponse();
        /*
        //通过下面方式可以设置Cookie、User-Agent等http请求头信息
        request.setCookie("xxxxxxxxxxxxxx");
        request.setUserAgent("WebCollector");
        request.addHeader("xxx", "xxxxxxxxx");
        */
    }

    @Override
    public void visit(Page page, CrawlDatums next) {
        String jsonStr = page.getHtml();
        JSONObject json = new JSONObject(jsonStr);
        System.out.println("JSON信息:" + json);
    }


    /**
     * 假设我们要爬取三个链接 1)http://www.A.com/index.php 需要POST,并且需要附带数据id=a
     * 2)http://www.B.com/index.php?id=b 需要POST,不需要附带数据 3)http://www.C.com/
     * 需要GET
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        DemoPostCrawler crawler = new DemoPostCrawler("json_crawler", true);
        crawler.addSeed(new CrawlDatum("http://www.A.com/index.php")
                .putMetaData("method", "POST")
                .putMetaData("outputData", "id=a"));
        crawler.addSeed(new CrawlDatum("http://www.B.com/index.php")
                .putMetaData("method", "POST"));
        crawler.addSeed(new CrawlDatum("http://www.C.com/index.php")
                .putMetaData("method", "GET"));

        crawler.start(1);
    }

}