闲的时候一直在本身研究爬虫相关的东西,看过一两个开源框架,本身照猫画虎的写了一个,目前看来个人爬虫能够用了,但仍是有不少不足,把我目前的经验写出来跟你们分享一下。java
国外爬虫的局限缓存
1.太守规矩(若是有Robot文件就要按着爬)多线程
2.没法自由切换代理,若是切换代理对全部线程都有影响,因为是单HtttpClient(我没有找到办法,crawler4j)框架
3.会把页面都爬下来,我只想要部分文字或者图片而已spa
4.过于完善,因此臃肿庞大线程
我但愿个人爬虫第一阶段具备的功能是代理
1.多线程code
2.多HttpClient爬取,能够自由切换代理(因为单HttpClient爬取全部没法对每一个线程分别单独设置proxy,我目前正在寻找解决办法)blog
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相关的代码删掉。
但愿对你们的工做有所帮助。