使用nodejs爬取前程無(wú)憂前端技能排行
最近準(zhǔn)備換工作,需要更新一下技能樹(shù)。為做到有的放矢,想對(duì)招聘方的要求做個(gè)統(tǒng)計(jì)。正好之前了解過(guò)nodejs,所以做了個(gè)爬蟲(chóng)搜索數(shù)據(jù)。
具體步驟:
1. 先用fiddler分析請(qǐng)求需要的header和body。
2. 再用superagent構(gòu)建上述數(shù)據(jù)發(fā)送客戶端請(qǐng)求。
3. 最后對(duì)返回的數(shù)據(jù)使用cheerio整理。
折騰了幾個(gè)晚上,只搞出了個(gè)架子,剩余工作等有時(shí)間再繼續(xù)開(kāi)發(fā)。
/*使用fiddler抓包,需要配置lan代理,且設(shè)置如下參數(shù)*/ process.env.https_proxy = "http://127.0.0.1:8888"; process.env.http_proxy = "http://127.0.0.1:8888"; process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; /*使用到的模塊*/ var request = require('superagent'); //發(fā)送客戶端請(qǐng)求 require('superagent-proxy')(request); //使用代理發(fā)送請(qǐng)求 var cheerio = require('cheerio'); //以jq類似的方法操作返回的字符,不需要用正則 require('superagent-charset')(request);//node不支持gbk,gb2312,this will add request.Request.prototype.charset. var async = require('async'); //異步流控制模塊 var fs = require('fs'); /*相關(guān)參數(shù),通過(guò)fiddler抓包后復(fù)制過(guò)來(lái)*/ var ws = fs.createWriteStream('res.html',{flags:'w+'}); //a+追加的讀寫(xiě)模式,w+覆蓋 var loginUrl = "https://login.51job.com/login.php"; var searchUrl = "http://search.51job.com/jobsearch/search_result.php"; var queryStrings = "fromJs=1&jobarea=020000&keyword=%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91&keywordtype=2&lang=c&stype=2&postchannel=0000&fromType=1&confirmdate=9"; var loginForms = { lang: 'c', action: 'save', from_domain: 'i', loginname: '***', //自己的用戶名和密碼 password: '***', verifycode: '', isread: 'on' }; var searchForms = { lang: 'c', stype: '2', postchannel: '0000', fromType: '1', line: '', confirmdate: '9', from: '', keywordtype: '2', keyword: '%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91', jobarea: '020000', industrytype: '', funtype: '' }; var searchFormsString='lang=c&stype=2&postchannel=0000&fromType=1&line=&confirmdate=9&from=&keywordtype=2&keyword=%C7%B0%B6%CB%BF%AA%B7%A2&jobarea=020000&industrytype=&funtype='; var proxy0 = process.env.https_proxy; var proxy = process.env.http_proxy; const agent = request.agent(); //agent()方法產(chǎn)生的實(shí)例會(huì)保存cookie供后續(xù)使用 request.post(loginUrl).proxy(proxy0).send(loginForms).end(function (err,res0) { agent.post(searchUrl) .proxy(proxy) //proxy()方法需緊跟在method方法之后調(diào)用,否則fiddler抓不到數(shù)據(jù)包 .type('application/x-www-form-urlencoded') .query(queryStrings) //使用字符串格式 .send(searchFormsString) .charset('gbk') //通過(guò)charset可知編碼字符格式,不設(shè)置會(huì)有亂碼 .end(function (err, res) { /* 以下是處理返回?cái)?shù)據(jù)的邏輯代碼*/ var $ = cheerio.load(res.text); //res.text是返回的報(bào)文主體 async.each($('.el.title').nextAll('.el'), function(v, callback) { //將多余的內(nèi)容刪除,保留崗位、公司鏈接 $(v).prepend($(v).find('.t1 a')); $(v).find('.t1').remove(); ws.write($.html(v), 'utf8'); }, function(err) { console.log(err); }); console.log('successful'); }) }); //jquery內(nèi)置document元素為root,cheerio需要通過(guò)load方法傳入,然后用選擇器查找指定元素,再執(zhí)行相應(yīng)操作。 // $.html(el);靜態(tài)方法,返回el元素的outerHtml //TODO // 1.當(dāng)前只請(qǐng)求到一頁(yè)數(shù)據(jù),還需構(gòu)建所有頁(yè)數(shù)的請(qǐng)求列表 // 2.向每條數(shù)據(jù)的崗位鏈接發(fā)送請(qǐng)求,獲取技能關(guān)鍵字,存入文件中 // 3.node中io操作是異步的,且沒(méi)有鎖的概念,如何并發(fā)地向同一個(gè)文件正確地寫(xiě)入數(shù)據(jù)
結(jié)果顯示如下:
以上所述是小編給大家介紹的使用nodejs爬前程無(wú)憂前端技能排行,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
- node+experss實(shí)現(xiàn)爬取電影天堂爬蟲(chóng)
- 利用node.js寫(xiě)一個(gè)爬取知乎妹紙圖的小爬蟲(chóng)
- 利用Node.js制作爬取大眾點(diǎn)評(píng)的爬蟲(chóng)
- nodejs實(shí)現(xiàn)爬取網(wǎng)站圖片功能
- node爬取微博的數(shù)據(jù)的簡(jiǎn)單封裝庫(kù)nodeweibo使用指南
- Node.js環(huán)境下編寫(xiě)爬蟲(chóng)爬取維基百科內(nèi)容的實(shí)例分享
- node.js爬蟲(chóng)爬取拉勾網(wǎng)職位信息
- 手把手教你用Node.js爬蟲(chóng)爬取網(wǎng)站數(shù)據(jù)的方法
- 利用node.js爬取指定排名網(wǎng)站的JS引用庫(kù)詳解
- node.js爬取中關(guān)村的在線電瓶車(chē)信息
相關(guān)文章
Node.js成為Web應(yīng)用開(kāi)發(fā)最佳選擇的原因
本篇文章給大家詳細(xì)分析了Node.js 成為 Web 應(yīng)用開(kāi)發(fā)最佳選擇的十個(gè)原因,對(duì)此有需要的朋友參考下。2018-02-02在Node.js應(yīng)用中使用Redis的方法簡(jiǎn)介
這篇文章主要介紹了在Node.js應(yīng)用中使用Redis的方法,最簡(jiǎn)單的數(shù)據(jù)讀寫(xiě)操作相關(guān),需要的朋友可以參考下2015-06-06node.js express捕獲全局異常的三種方法實(shí)例分析
這篇文章主要介紹了node.js express捕獲全局異常的三種方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了node.js express捕獲全局異常的常見(jiàn)操作方法與使用注意事項(xiàng),需要的朋友可以參考下2019-12-12node封裝一個(gè)控制臺(tái)進(jìn)度條插件???????詳情
這篇文章主要介紹了node封裝一個(gè)控制臺(tái)進(jìn)度條插件???????詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08NodeJS http模塊用法示例【創(chuàng)建web服務(wù)器/客戶端】
這篇文章主要介紹了NodeJS http模塊用法,結(jié)合實(shí)例形式分析了node.js創(chuàng)建web服務(wù)器與客戶端,進(jìn)行HTTP通信的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11