node+express制作爬蟲(chóng)教程
最近開(kāi)始重新學(xué)習(xí)node.js,之前學(xué)的都忘了。所以準(zhǔn)備重新學(xué)一下,那么,先從一個(gè)簡(jiǎn)單的爬蟲(chóng)開(kāi)始吧。
什么是爬蟲(chóng)
百度百科的解釋?zhuān)?/p>
爬蟲(chóng)即網(wǎng)絡(luò)爬蟲(chóng),是一種自動(dòng)獲取網(wǎng)頁(yè)內(nèi)容的程序。是搜索引擎的重要組成部分,因此搜索引擎優(yōu)化很大程度上就是針對(duì)爬蟲(chóng)而做出的優(yōu)化。
通俗一點(diǎn)講:
把別人網(wǎng)站的信息給弄下來(lái),弄到自己的電腦上。然后再做一些過(guò)濾,比如篩選啊,排序啊,提取圖片啊,鏈接什么的。獲取你需要的信息。
如果數(shù)據(jù)量很大,而且你的算法又比較叼,并且可以給別人檢索服務(wù)的話(huà),那么你的爬蟲(chóng)就是一個(gè)小百度或者小谷歌了
什么是robots協(xié)議
了解完什么是爬蟲(chóng)之后,我們?cè)賮?lái)了解一下爬蟲(chóng)的協(xié)議了,也就是哪些東西才已去爬。
Robots協(xié)議(也稱(chēng)為爬蟲(chóng)協(xié)議、機(jī)器人協(xié)議等)的全稱(chēng)是“網(wǎng)絡(luò)爬蟲(chóng)排除標(biāo)準(zhǔn)”(Robots Exclusion Protocol),網(wǎng)站通過(guò)Robots協(xié)議告訴搜索引擎哪些頁(yè)面可以抓取,哪些頁(yè)面不能抓取?!?/p>
robots.txt文件是一個(gè)文本文件,它是一個(gè)協(xié)議,而不是一個(gè)命令。它是搜索引擎中訪(fǎng)問(wèn)網(wǎng)站的時(shí)候要查看的第一個(gè)文件。robots.txt文件告訴蜘蛛程序在服務(wù)器上什么文件是可以被查看的。
當(dāng)一個(gè)搜索蜘蛛訪(fǎng)問(wèn)一個(gè)站點(diǎn)時(shí),它會(huì)首先檢查該站點(diǎn)根目錄下是否存在robots.txt,如果存在,搜索機(jī)器人就會(huì)按照該文件中的內(nèi)容來(lái)確定訪(fǎng)問(wèn)的范圍;
如果該文件不存在,所有的搜索蜘蛛將能夠訪(fǎng)問(wèn)網(wǎng)站上所有沒(méi)有被口令保護(hù)的頁(yè)面。百度官方建議,僅當(dāng)您的網(wǎng)站包含不希望被搜索引擎收錄的內(nèi)容時(shí),才需要使用robots.txt文件。如果您希望搜索引擎收錄網(wǎng)站上所有內(nèi)容,請(qǐng)勿建立robots.txt文件。
如果將網(wǎng)站視為酒店里的一個(gè)房間,robots.txt就是主人在房間門(mén)口懸掛的“請(qǐng)勿打擾”或“歡迎打掃”的提示牌。這個(gè)文件告訴來(lái)訪(fǎng)的搜索引擎哪些房間可以進(jìn)入和參觀,哪些房間因?yàn)榇娣刨F重物品,或可能涉及住戶(hù)及訪(fǎng)客的隱私而不對(duì)搜索引擎開(kāi)放。但robots.txt不是命令,也不是防火墻,如同守門(mén)人無(wú)法阻止竊賊等惡意闖入者。
環(huán)境搭建
需要的環(huán)境:node環(huán)境
需要安裝的東西: express、require、cherrio
可以在這里找到模塊的用法:https://www.npmjs.com,直接輸入模塊名字即可,比如:require
1、express這里就不做介紹了,中文網(wǎng)址在這里,可以查看:http://www.expressjs.com.cn/
2、request模塊讓http請(qǐng)求變的更加簡(jiǎn)單。最簡(jiǎn)單的一個(gè)示例:
var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); app.listen(3000);
安裝:npm install request
3、cherrio 是為服務(wù)器特別定制的,快速、靈活、實(shí)施的jQuery核心實(shí)現(xiàn)。
通過(guò)cherrio,我們就可以將抓取到的內(nèi)容,像使用jquery的方式來(lái)使用了。可以點(diǎn)擊這里查看:https://cnodejs.org/topic/5203a71844e76d216a727d2e
var cheerio = require('cheerio'), $ = cheerio.load('<h2 class="title">Hello world</h2>'); $('h2.title').text('Hello there!');
安裝:npm install cherrio
爬蟲(chóng)實(shí)戰(zhàn)
假設(shè)你的電腦里已經(jīng)安裝好了node和express。那么我們現(xiàn)在開(kāi)始進(jìn)行我們的爬蟲(chóng)小程序:
1、首先隨便進(jìn)入一個(gè)硬盤(pán),假如是F盤(pán),cmd環(huán)境下執(zhí)行: express mySpider
然后你發(fā)覺(jué)你的F盤(pán)上多了一個(gè) mySpider的文件夾和一些文件,進(jìn)入文件,cmd下執(zhí)行 npm install
2、然后安裝我們的require ==》npm installrequire --save
、再安裝我們的cherrio==》npm install cherrio --save
3、安裝好后,執(zhí)行npm start,如果想監(jiān)聽(tīng)窗口的變化,可以執(zhí)行:supervisor start app.js,然后在瀏覽器輸入:localhost:3000,這樣我們就可以在瀏覽器看到express的一些歡迎語(yǔ)啊什么的
4、打開(kāi)app.js文件,你會(huì)發(fā)覺(jué)里面有一大堆東西,因?yàn)槭桥老x(chóng)小程序嘛,所以都是不需要滴,刪,在express的API里有這段代碼,粘貼在app.js里面
app.js
var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); app.listen(3000);
5、我們的require登場(chǎng)了。繼續(xù)修改一下app.js改為:
var express = require('express'); var app = express(); var request = require('request'); app.get('/', function(req, res){ request('http://www.cnblogs.com', function (error, response, body) { if (!error && response.statusCode == 200) { res.send('hello world'); } }) }); app.listen(3000);
其中request的鏈接就是我們要爬的網(wǎng)址,加入我們要爬的是博客園的網(wǎng)站,所以輸入的是博客園的網(wǎng)址
6、引入cherrio,來(lái)讓我們可以操做爬到的網(wǎng)站的內(nèi)容,繼續(xù)修改一下app.js
var express = require('express'); var app = express(); var request = require('request'); var cheerio = require('cheerio'); app.get('/', function(req, res){ request('http://www.cnblogs.com', function (error, response, body) { if (!error && response.statusCode == 200) { //返回的body為抓到的網(wǎng)頁(yè)的html內(nèi)容 var $ = cheerio.load(body); //當(dāng)前的$符相當(dāng)于拿到了所有的body里面的選擇器 var navText=$('.post_nav_block').html(); //拿到導(dǎo)航欄的內(nèi)容 res.send(navText); } }) }); app.listen(3000);
我們抓到的內(nèi)容都返回到了request的body里面。cherrio可以獲取所有的dom選擇器。假如我們要獲取導(dǎo)航的內(nèi)容:ul的class為:post_nav_block
然后我們就可以將里面的內(nèi)容顯示出來(lái)了:
這個(gè)說(shuō)明,我們的爬蟲(chóng)小程序就成功了。當(dāng)然,這是一個(gè)簡(jiǎn)單的不能再簡(jiǎn)單的爬蟲(chóng)了。不過(guò)今天的文章就暫時(shí)介紹到這里,只是大概了解一下爬蟲(chóng)的過(guò)程而已。
接下來(lái)的第二篇文章會(huì)對(duì)這個(gè)爬蟲(chóng)進(jìn)行升級(jí),改版。比如異步啦,并發(fā)啦,定時(shí)去爬啦等等。
代碼地址:https://github.com/xianyulaodi/mySpider
- NodeJS制作爬蟲(chóng)全過(guò)程
- 詳解Node使用Puppeteer完成一次復(fù)雜的爬蟲(chóng)
- 簡(jiǎn)單好用的nodejs 爬蟲(chóng)框架分享
- Node.js編寫(xiě)爬蟲(chóng)的基本思路及抓取百度圖片的實(shí)例分享
- 詳解nodejs爬蟲(chóng)程序解決gbk等中文編碼問(wèn)題
- 基于Node.js的強(qiáng)大爬蟲(chóng) 能直接發(fā)布抓取的文章哦
- nodejs爬蟲(chóng)抓取數(shù)據(jù)亂碼問(wèn)題總結(jié)
- NodeJS制作爬蟲(chóng)全過(guò)程(續(xù))
- nodeJs爬蟲(chóng)獲取數(shù)據(jù)簡(jiǎn)單實(shí)現(xiàn)代碼
- Node.js爬蟲(chóng)如何獲取天氣和每日問(wèn)候詳解
相關(guān)文章
Nodejs Post請(qǐng)求報(bào)socket hang up錯(cuò)誤的解決辦法
這篇文章主要介紹了Nodejs Post請(qǐng)求報(bào)socket hang up錯(cuò)誤的解決辦法,本文因少加了headers字段信息導(dǎo)致出現(xiàn)這個(gè)錯(cuò)誤,本文給出了一個(gè)完整的實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-09-09如何自動(dòng)化部署項(xiàng)目?折騰服務(wù)器之旅~
這篇文章主要介紹了自動(dòng)化部署項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Node.js中使用mongoose操作mongodb數(shù)據(jù)庫(kù)的方法
如何利用mongoose將數(shù)據(jù)寫(xiě)入mongodb數(shù)據(jù)庫(kù)呢?操作方法很簡(jiǎn)單,下面小編給大家分享Node.js中使用mongoose操作mongodb數(shù)據(jù)庫(kù)的方法,感興趣的朋友一起看看吧2017-09-09window系統(tǒng) nodejs安裝opencv環(huán)境配置圖文詳解
這篇文章主要介紹了window系統(tǒng) nodejs安裝opencv環(huán)境配置,結(jié)合圖文形式詳細(xì)分析了window環(huán)境下 nodejs安裝opencv的具體步驟、注意事項(xiàng)2023-04-04淺談express 中間件機(jī)制及實(shí)現(xiàn)原理
本篇文章主要介紹了淺談express 中間件機(jī)制及實(shí)現(xiàn)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08