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);
    }

}

通過捐款支持WebCollector

維護WebCollector及教程需要花費較大的時間和精力,如果你喜歡WebCollector的話,歡迎通過捐款的方式,支持開發者的工作,非常感謝!

你可以使用支付寶錢包掃描下方的二維碼進行捐款, 或者通過向支付寶帳號 [email protected]轉帳進行捐款。

發佈了90 篇原創文章 · 獲贊 67 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章