以前寫了個小爬蟲,用來爬噹噹的圖書信息用的,挺好玩,分享一下吧。整個爬蟲很是簡單,主要是使用request庫+cheerio解析,實現很是粗糙,今天正好理一下思路。html
首先,準備工做,就是各類庫的安裝以及其餘前置工做的準備,好比頁面分析。數據庫
整個流程實際上比較簡單,適合像我這樣的菜鳥觀看。npm
npm install request
npm install cheerio
npm install iconv-lite複製代碼
request是用來請求頁面的庫,也是本次爬蟲最核心的庫;cheerio是用於解析的庫,將頁面轉化成DOM來簡化數據的解析;iconv-lite是解碼庫,由於噹噹網用的不是utf8編碼,這點卻是讓我吃了很多苦頭。api
下載完須要的庫就能夠開始擼了,不過擼以前須要先分析頁面結構,我列一下分析清單:bash
分析完須要分析的東西就能夠接着往下了服務器
request({
encoding:null,
url:'http://book.dangdang.com/list/newRelease_C01.54.htm'
},function(err,response,body){
if(err){console.log(err)}
else{
//處理數據
console.log(body)
}
})複製代碼
這裏解釋一下,encoding:null
是取消編碼,由於默認會按照utf8編碼,但頁面自己是gb2312的,因此解析了也沒用。不寫會出問題,由於以gb2312解碼的時候數據都被utf8編碼過,簡直是災難。ide
response
是服務器端的響應,好比各類頭信息啊之類的,這裏用不到它。body
是頁面主體,也就是整個html,是咱們須要處理的主角。wordpress
但以前也提到了,頁面編碼是gb2312,所以在解析數據以前先要解碼。函數
var decodeBuffer=iconv.decode(body,"gb2312");//將body以gb2312解析轉化成buffer(unicode)
var html=decodeBuffer.toString();
var $=cheerio.load(html);複製代碼
這時候html是原gb2312解碼後又被編碼成utf8的字符串,若是打印出來就能發現,裏邊的中文再也不是亂碼了。這時候就輪到cheerio登場了:cheerio提供的api和JQuery基本相同,在這裏能夠直接當成JQuery,所以爲了更加靠近JQuery,咱們將解析後的數據保存到$
這個變量中。測試
var $=cheerio.load(html);
$(".tushu").each(function(index,ele){
var bookName=$(ele).find(".name").text();
console.log(bookName);
})複製代碼
這時候書名就被打印出來了,是否是很方便。圖片咱們就用src吧,固然,若是想把圖片保存下來也是能夠的,用上fs模塊就好了
var fs = require("fs");
var path=require("path");
$(".tushu").each(function(index,ele){
var src=$(ele).find(".cover img").attr("src");
var srcParse=path.parse(src);
var srcStore="img/"+srcParse.base;
request(src).pipe(fs.createWriteStream(srcStore));
})複製代碼
至此,整個爬蟲差很少了,由於噹噹把下一頁的連接寫在了a標籤裏,所以一樣可使用選擇器這種方式去獲取href,以此得知下一頁的路徑。所以封裝一下:
var request=require("request");
var cheerio=require("cheerio");
var iconv=require("iconv-lite");
var path=require("path");
var fs=require("fs");
var main="http://book.dangdang.com";
function spider(url){
request({
encoding:null,
url:url
},function (err, res, body) {
var decodeBuffer=iconv.decode(body,"gb2312");
var result=decodeBuffer.toString();
var $=cheerio.load(result);
$('.tushu').each(function(index,ele){
var src=$(ele).find(".cover img").attr("src");
var srcpath=path.parse(src);
var srcStore="img/"+srcpath.base;
request(src).pipe(fs.createWriteStream(srcStore));
});
var next=$('.fanye_bottom > span:nth-child(1) > a:last-child').attr("href");
var nextUrl=main+next;
spider(nextUrl);
})
}複製代碼
這時候再調用一下spider函數,就能夠一頁一頁往下了。同時我也把詳細文章寫在了本身博客上,防止下次寫的時候忘了怎麼用,能夠點擊訪問
固然,這個爬蟲很簡單,基本上糊弄一下沒有任何限制的網站還行。以後要寫一個同城租房的畢設項目,準備爬58租房信息。58對ip做了限制,所以訪問量太大會出驗證碼或者封ip,因此須要加上代理等進一步假裝一下。代理的確很是頭疼,由於可用率很是低,還記得當初隨便找了一個網站,爬了1w多條ip,結果前幾個還能用,後面的測試一下基本不可用,最後在篩選的時候就篩選出7-8條,真的心累。後來找到了快代理,可用率還不錯,基本能達到12%左右,能夠說是很是高的可用率了,畢竟免費。固然有更好的免費代理能夠和我說說呀。
第一次寫文章,有什麼不對的地方歡迎看官指正。