nodejs爬蟲入門

來源:互聯網
上載者:User

標籤:badge   back   .post   json   filename   tps   tca   header   require   

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

準備
1.項目初始化,執行npm init,來初始化package.json2.npm install request —save3.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請求的optionsvar 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.jsfunction 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爬蟲入門

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.