現在這個社會是資訊爆炸的社會,各個網站、app上鋪天蓋地的都是各種新聞和資訊, 為了獲取資訊,我們每天都要進行各種麻煩的操作,打開各種網站或者手機app,操作顯得低效,后來發現了一個神器,那就是RSS,
什么是RSS
RSS中文名是簡易資訊聚合,就是讓網站一個按照一定周期更新網站的文章概要內容(有些是全文)到一個xml中,RSS訂閱工具一定時間抓取這個RSS訂閱源生成資料供訂閱者讀取網站內容,
有了RSS,你只要去訂閱工具上就可以瀏覽你自己訂閱的新的更新內容,非常簡單高效,這里推薦一個RSS訂閱神器inoreader,支持中文,這個我認為是目前最好的RSS訂閱器, 知乎專欄是一個知乎開給個人寫的博客,有些專欄上面具有有價值的資訊,但是很遺憾知乎專欄不提供RSS訂閱,當然作為開發者來說,我們可以自己動手做一個知乎專欄RSS抓取程式,
制作爬蟲
很多網站提供了RSS,但是更多網站其實沒有提供RSS訂閱源,我們可以使用爬蟲抓取網站更新內容制作個人的RSS訂閱源,我作為一個前端er可以使用nodejs來進行RSS的制作,
什么是nodejs
Node.js是一個基于Chrome JavaScript運行時建立的平臺, 用于方便地搭建回應速度快、易于擴展的網路應用,Node.js 使用事件驅動, 非阻塞I/O 模型而得以輕量和高效,非常適合在分布式設備上運行資料密集型的實時應用,
簡單的說 Node.js 就是運行在服務端的 JavaScript,使用nodejs的可以讓你一個只會用JavaScript也能寫后端服務代碼,當然也能用它進行爬蟲抓取的作業,
先安裝爬蟲所需依賴
進行爬取作業的話先要安裝所要用到的依賴, superagent是最常用的一個依賴庫,利用它可以輕松發送各種請求, cheerio就是一個nodejs版本的jquery,利用它可以獲取網頁中的各種dom結構, data2xml就是一個json轉化成xml的一個庫, 其他還有node-schedule和fs就是進行定時操作和檔案操作,
新建一個檔案夾rssmaker,并且執行npm init創建package.json,
用npm install node_modules_name --save來進行安裝各種依賴,
分析知乎專欄結構獲取要爬取的入口
我這次舉例爬取一個專欄前端學習指南,像這種適配手機端的網頁,一般都有采用發送API請求來獲得資料進行前端渲染頁面,我們可以用chrome的network的查看可疑的請求,打開chrome的開發者工具,我們很快就發現了一個目標,一個可疑請求https://zhuanlan.zhihu.com/api/columns/study-fe/posts?limit=20
我們得到了一個json,我們現在使用一個json的查看工具chrome的插件JSON Editor可視化這個json資料方便我們進行分析,
我們可視化后資料如下:
前面我們發現的請求發送里面有一個引數是limit,它的值是20,從上圖我們知道了我們得到了20組資料,這個引數其實就是限制獲取的資料條目數,我們現在分析20組里面的一條資料,
{ "isTitleImageFullScreen": false, "rating": "none", "sourceUrl": "", "publishedTime": "2016-12-28T15:01:44+08:00", "links": { "comments": "/api/posts/24606606/comments"
}, "author": { "profileUrl": "https://www.zhihu.com/people/jirengu-ruo-yu", "bio": "饑人谷的挑山工 jirengu.com", "hash": "3dd61d987210ce6b0ba24746803e04bb", "uid": 33284922802176, "isOrg": false, "description": "饑人谷的挑山工 jirengu.com ", "isOrgWhiteList": false, "slug": "jirengu-ruo-yu", "avatar": { "id": "31a3446681c9040f3643472db505a6ef", "template": "https://pic4.zhimg.com/{id}_{size}.jpg"
}, "name": "若愚"
}, "url": "/p/24606606", "title": "前端筆試面試題庫", "titleImage": "", "summary": "", "content": "<h2>做了什么?</h2><p>我們在建了 GitHub 前端筆試面試題庫 <a href=https://www.cnblogs.com/"https://github.com/jirengu/frontend-interview/issues\" data-editable=\"true\" data-title=\"前端筆試面試題庫\" class=\"\">前端筆試面試題庫</a>, 歡迎走訪</p><br><br><h2>為什么建前端筆試面試題庫?</h2><p><a href=https://www.cnblogs.com/"https://zhuanlan.zhihu.com/study-fe\" data-editable=\"true\" data-title=\"前端學習指南專欄\" class=\"\">前端學習指南專欄</a> 專欄創建3個月有很多前端愛好者特別是入門者關注,很多小伙伴一直期待我們能做一份筆試面試題集錦分享給大家,我和方方也一直想把這個事情做好,但兩個人的力量太微弱,于是想到在 github 上建立公共專案,匯集更多前端愛好者的力量一起收集前端常見筆試面試題,作為送給前端入門的小伙伴、需要找作業的小伙伴一份新年禮物??</p><br><br><h2>如何貢獻題目?</h2><p>大家可以在 【[Issue](<a href=https://www.cnblogs.com/"https://github.com/jirengu/frontend-interview/issues\" data-editable=\"true\" data-title=\"jirengu/frontend-interview\" class=\"\">jirengu/frontend-interview</a>)】上通過提交Issue的形式提交日常遇到的筆試面試題,無論是多\"高端\"或者多\"低級\",</p><img src=https://www.cnblogs.com/"v2-7321f409275270493625137ca12521b0.png\" data-rawwidth=\"1972\" data-rawheight=\"878\"><br><p><b>注意: </b></p><ol><li>提交 Issue 的時候需要在問題里加上問題來源,比如:`來自百度校招筆試題`,或者來自`某公司面試題`<br></li><li> 在提交Issue 的時候需要選擇合適的標簽以便分類整理,目前的標簽有 `HTML&CSS`、`JavaScript`、`前端框架`、`HTTP`、`未歸類`,如果你不知道該選擇什么標簽,就選擇`未歸類`吧,或者可以在題目的描述里加上自己覺得應該添加的標簽,專案管理者會定期更新添加新標簽<br></li><li>當前專案的主題是 <b>前端筆試面試題</b>,不要把自己平時學習中的疑問放進去,要的是貨真價實的筆試面試題,否則變味了就沒人喜歡了<br></li></ol><br><h2><br>如何貢獻答案?</h2><p>不要吝嗇自己的答案,在腦子里的答案不叫答案,只有寫下來后才知道答案沒那么簡單,面試官真問起的時候才能對答如流</p><p>勇敢的回復自己的答案吧</p><br><p>覺得不錯?</p><p>Star 這個專案, Watch 這個專案,分享給其他小伙伴吧</p>", "state": "published", "href": "/api/posts/24606606", "meta": { "previous": null, "next": null
}, "commentPermission": "anyone", "snapshotUrl": "", "canComment": false, "slug": 24606606, "commentsCount": 20, "likesCount": 135
}
我們可以通過《XML那些事...》 實作簡單的RSS可知RSS幾個關鍵的值,跟上圖截圖的對應,
我們現在知道爬取的入口,那么我們現在開始coding吧,
用superagent抓取資料組成陣列
新建一個檔案studyfe.js,在檔案中用require引入各種依賴,然后我們用superagent獲取資料后進行陣列的拼裝,
而在得到這個陣列的時候,我們已經相當于得到了所有要采集的資料了,那下面要做的東西就很簡單了,那就是json陣列轉化成xml格式,而轉化我們我們要用到data2xml這個庫,在開頭我們已經require進來了, data2xml的使用檔案可以查看data2xml-npmjs.com
最后就是把資料輸出到檔案中去
輸出到檔案之后,然后要把這個檔案放到服務器上,這樣才能被rss服務器抓取到,如何放在服務器上這本文就不討論了,還有一個問題就是RSS需要實時更新的,所以還有使用定時抓取,這次用到的是node-schedule,里面的定時寫法其實跟linux中的crontab定時任務寫法是很相似的,下面的代碼其實代表著每3分鐘定時執行一次,
定時執行任務還會有一個問題就是在nodejs在執行例外的時候退出,這樣就會導致不會實時抓取,這個要用到一個nodejs中能自動重啟任務的,我用的是pm2,
為此,為了學好前端,創建了一個學習交流裙,能夠與大家一起學習、交流,大家免費領取面試題,電子書籍,特效專案原始碼等干貨,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/83662.html
標籤:JavaScript
上一篇:Ajax的步驟
下一篇:深入淺出Nodejs讀書筆記
