1. 程式人生 > >nodejs爬蟲入門

nodejs爬蟲入門

ava child 關註 命名 .json filename body nod 下載圖片

nodejs是服務器端的語言,所以可以像python一樣對網站進行爬取。

準備

1.項目初始化,執行npm init,來初始化package.json
2.npm install request —save
3.npm install async --save
文件中需要引入的包
var request = require(‘request‘);
var fs = require(‘fs‘);
var async = require(‘async‘);

思路

爬蟲分兩種情況,第一種是用cheerio模塊,獲取到html的節點,從節點中拿到數據,比較適合直接用後端語言來渲染的頁面。第二種是通過調用爬取網站的接口請求數據。

首先我們需要在XHR中找到獲取關註列表的API。我們要做的就是通過這個api來獲取大量的用戶數據,再對用戶信息處理。找到我們想得到的數據。

請求api需要在請求的頭部加上登陸之後的authorization信息才能成功。

代碼

// 項目初始化,執行npm init,來初始化package.json
// npm install request--save
// npm install async --save

// 需要引入的包
var request = require(‘request‘);
var fs = require(‘fs‘);
var async = require(‘async‘);

var url = "https://www.zhihu.com/api/v4/members/mu-rong-qi-95/followers?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=0&limit=20"; //request請求的options var options = { url: url, headers: {
"authorization": "Bearer Mi4wQUJCQ0hCNXVDUXNBUU1LUUtCanlDeGNBQUFCaEFsVk5Ca3h4V1FEcS1Vc1VScVY1Qko5SWpuRkFSY3R0bVA2YWZB|1498005254|1140b230de84e46ff818902c8f0da250ac6c6dd2" } } var users=[]; // 獲取大量的用戶數據 function getDataList(url) { options.url = url; request.get(options, function(error, response, body) { if(!error&&response.statusCode == 200) { var response = JSON.parse(response.body); var zhList = response.data; zhList.forEach(function(item) { //item.gender == 0 性別判斷 if(item.gender == 1) { console.log(`正在抓取${item.avatar_url}`) users.push({ "name": item.name, "img": item.avatar_url.replace("_is", ""), "url_token": item.url_token }) } }) //is_end當前用戶的關註用戶是否到最後一頁 if(response.paging.is_end) { //這裏判斷抓取的條數 if(users.length<= 1000) { console.log(`抓取完成`); downLoadContent(JSON.stringify(users)); return; } else { console.log(`第${i+1}個用戶的數據`); getDataList(zurl.replace("demouser", users[i].url_token)) i++; } } else { if(users.length<= 1000) { console.log(`抓取完成`); downLoadContent(JSON.stringify(users)); return; } getDataList(response.paging.next); } } }) } // 把數據下載保存到data.js function downLoadContent(cont) { fs.appendFile(‘./‘ + ‘data.js‘, "module.exports =" + cont, ‘utf-8‘, function(err) { if(err) { console.log(err); } else console.log(‘success‘); startDownLoad(JSON.parse(cont)); }); } // 下載圖片 var eyeUrl = "http://api.eyekey.com/face/Check/checking"; var config = { "app_id": "f89ae61fd63d4a63842277e9144a6bd2", "app_key": "af1cd33549c54b27ae24aeb041865da2", "url": "https://pic4.zhimg.com/43fda2d268bd17c561ab94d3cb8c80eb.jpg" } function face(item) { config.url = item.img; request.post({ url: eyeUrl, form: config }, function(error, response, body) { if(!error&&response.statusCode == 200) { var data = JSON.parse(body); try { if(data.face[0].attribute.gender == ‘Female‘) { console.log(`正在下載${item.img}`); downLoadImg(item) } } catch(e) { console.log(`驗證失敗${item.img}~`); } } }) } // 下載圖片方法 function downLoadImg(image) { request.head(image.img, function(err, res, body) { if(err) { console.log(err); } }); request(image.img).pipe(fs.createWriteStream(‘./beauty_image/‘ + image.name + Date.now() + ‘.‘ + image.img.substring(image.img.lastIndexOf(".") + 1, image.img.length))); } // 開始下載 function startDownLoad(imgdata){ //控制並發量,在5個以內 console.log(imgdata) async.eachLimit(imgdata, 3, function (item, callback) { face(item); callback(); }, function (err) { if(err) { console.log(err); } else { console.log(‘success!‘); } }); } getDataList(url);

啟動

node crawl.js

應用cheerio模塊從dom節點取數據

var http = require(‘http‘);
var fs = require(‘fs‘);
var cheerio = require(‘cheerio‘);
var request = require(‘request‘);
var i = 0;
var url = "http://www.ss.pku.edu.cn/index.php/newscenter/news/2391"; 
//初始url 

function fetchPage(x) {     //封裝了一層函數
    startRequest(x); 
}


function startRequest(x) {
     //采用http模塊向服務器發起一次get請求      
    http.get(x, function (res) {     
        var html = ‘‘;        //用來存儲請求網頁的整個html內容
        var titles = [];        
        res.setEncoding(‘utf-8‘); //防止中文亂碼
     //監聽data事件,每次取一塊數據
        res.on(‘data‘, function (chunk) {   
            html += chunk;
        });
     //監聽end事件,如果整個網頁內容的html都獲取完畢,就執行回調函數
        res.on(‘end‘, function () {

         var $ = cheerio.load(html); //采用cheerio模塊解析html

         var time = $(‘.article-info a:first-child‘).next().text().trim();

         var news_item = {
          //獲取文章的標題
            title: $(‘div.article-title a‘).text().trim(),
         //獲取文章發布的時間
            Time: time,   
         //獲取當前文章的url
            link: "http://www.ss.pku.edu.cn" + $("div.article-title a").attr(‘href‘),
         //獲取供稿單位
            author: $(‘[title=供稿]‘).text().trim(),  
        //i是用來判斷獲取了多少篇文章
            i: i = i + 1,     

            };

  console.log(news_item);     //打印新聞信息
  var news_title = $(‘div.article-title a‘).text().trim();

  savedContent($,news_title);  //存儲每篇文章的內容及文章標題

  savedImg($,news_title);    //存儲每篇文章的圖片及圖片標題


             //下一篇文章的url
  var nextLink="http://www.ss.pku.edu.cn" + $("li.next a").attr(‘href‘);
            str1 = nextLink.split(‘-‘);  //去除掉url後面的中文
            str = encodeURI(str1[0]);  
            //這是亮點之一,通過控制I,可以控制爬取多少篇文章.
            if (i <= 500) {                
                fetchPage(str);
            }

        });

    }).on(‘error‘, function (err) {
        console.log(err);
    });

}
       //該函數的作用:在本地存儲所爬取的新聞內容資源
function savedContent($, news_title) {
    $(‘.article-content p‘).each(function (index, item) {
        var x = $(this).text();       

       var y = x.substring(0, 2).trim();

        if (y == ‘‘) {
        x = x + ‘\n‘;   
//將新聞文本內容一段一段添加到/data文件夾下,並用新聞的標題來命名文件
        fs.appendFile(‘./data/‘ + news_title + ‘.txt‘, x, ‘utf-8‘, function (err) {
            if (err) {
                console.log(err);
            }
        });
    }
    })
}
//該函數的作用:在本地存儲所爬取到的圖片資源
function savedImg($,news_title) {
    $(‘.article-content img‘).each(function (index, item) {
        var img_title = $(this).parent().next().text().trim();  //獲取圖片的標題
        if(img_title.length>35||img_title==""){
         img_title="Null";}
        var img_filename = img_title + ‘.jpg‘;

        var img_src = ‘http://www.ss.pku.edu.cn‘ + $(this).attr(‘src‘); //獲取圖片的url

//采用request模塊,向服務器發起一次請求,獲取圖片資源
        request.head(img_src,function(err,res,body){
            if(err){
                console.log(err);
            }
        });
        request(img_src).pipe(fs.createWriteStream(‘./image/‘+news_title + ‘---‘ + img_filename));     //通過流的方式,把圖片寫到本地/image目錄下,並用新聞的標題和圖片的標題作為圖片的名稱。
    })
}
fetchPage(url);      //主程序開始運行

nodejs爬蟲入門