你所需要的,不仅仅是一个好用的代理。
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);
}
}