標籤: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爬蟲入門