导航

如何把Volley改成一个爬虫--HttpClient设置

Posted on 2014-08-22 09:27  Sharp陈响  阅读(1495)  评论(2编辑  收藏  举报

  闲的时候一直在自己研究爬虫相关的东西,看过一两个开源框架,自己照猫画虎的写了一个,目前看来我的爬虫可以用了,但还是有很多不足,把我目前的经验写出来跟大家分享一下。

  国外爬虫的局限

    1.太守规矩(如果有Robot文件就要按着爬)

    2.无法自由切换代理,如果切换代理对所有线程都有影响,由于是单HtttpClient(我没有找到办法,crawler4j)

    3.会把页面都爬下来,我只想要部分文字或者图片而已

    4.过于完善,所以臃肿庞大

  我希望我的爬虫第一阶段具有的功能是

    1.多线程

    2.多HttpClient爬取,可以自由切换代理(由于单HttpClient爬取所有无法对每个线程分别单独设置proxy,我目前正在寻找解决办法)

    3.可以记录爬过的页面,或者所爬取内容的ID

    4.只针对文字和图片

  由于技术能力确实有限,所以我没有从头开始重新写一个,选择了把我比较熟悉的Volley改成爬虫。Google的Volley真的不错,足够我把它扩展成一个爬虫。

  Volley采用的是生产者消费者模式,将连接放入生产队列,然后Request从队列中取内容获得Response,最后通过Listener通知等待线程。

  首先是关于HttpClient即Volley的newRequestQueue

 1        HttpParams params = new BasicHttpParams();
 2             
 3             params.setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES);
 4             params.setParameter(CoreProtocolPNames.USER_AGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
 5             params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 1000);
 6             params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000);
 7 
 8             params.setBooleanParameter("http.protocol.handle-redirects", false);
 9 
10             SchemeRegistry schemeRegistry = new SchemeRegistry();
11             schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
12 
13             PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(schemeRegistry);
14             connectionManager.setMaxTotal(10);
15             connectionManager.setDefaultMaxPerRoute(10);
16             DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager, params);
17 
18             stack = new HttpClientStack(httpClient);

  由于爬虫的特点是加入队列前都会对是否爬过进行判断所以不需要做缓存 ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES 由于其特殊性,爬虫一般自己处理302和301跳转 params.setBooleanParameter("http.protocol.handle-redirects", false); 由于从安卓中抽离Volley所以删掉了Httpclient以外的其他Stack实现。

  注意

Cache noCache=new NoCache();

  同样由于爬虫不需要缓存。

  或者可以把与Cache相关的代码删掉。

  希望对大家的工作有所帮助。