閒的時候一直在本身研究爬蟲相關的東西,看過一兩個開源框架,本身照貓畫虎的寫了一個,目前看來個人爬蟲能夠用了,但仍是有不少不足,把我目前的經驗寫出來跟你們分享一下。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相關的代碼刪掉。
但願對你們的工做有所幫助。