日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Node.js实现简易爬虫

發(fā)布時間:2025/6/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node.js实现简易爬虫 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為什么選擇利用node來寫爬蟲呢?就是因為cheerio這個庫,全兼容jQuery語法,熟悉的話用起來真真是爽

依賴選擇

  • cheerio: Node.js 版的jQuery

  • http:封裝了一個HTPP服務器和一個簡易的HTTP客戶端

  • iconv-lite:解決爬取gb2312網(wǎng)頁出現(xiàn)亂碼

初步實現(xiàn)

既然是要爬取網(wǎng)站內(nèi)容,那我們就應該先去看看網(wǎng)站的基本構成
選取的是電影天堂作為目標網(wǎng)站,想要去爬取所有最新電影的下載鏈接

分析頁面

頁面結構如下:

我們可以看到每個電影的標題都在一個class為ulink的a標簽下,再往上定位,我們可以看到最外部的盒子class為co_content8

ok,可以開工了

獲取一頁電影標題

首先引入依賴,并設定需要爬取的url

var cheerio = require('cheerio'); var http = require('http'); var iconv = require('iconv-lite');var url = 'http://www.ygdy8.net/html/gndy/dyzz/index.html';

核心代碼 index.js

http.get(url, function(sres) {var chunks = [];sres.on('data', function(chunk) {chunks.push(chunk);});// chunks里面存儲著網(wǎng)頁的 html 內(nèi)容,將它zhuan ma傳給 cheerio.load 之后// 就可以得到一個實現(xiàn)了 jQuery 接口的變量,將它命名為 `$`// 剩下就都是 jQuery 的內(nèi)容了sres.on('end', function() {var titles = [];//由于咱們發(fā)現(xiàn)此網(wǎng)頁的編碼格式為gb2312,所以需要對其進行轉碼,否則亂碼//依據(jù):“<meta http-equiv="Content-Type" content="text/html; charset=gb2312">”var html = iconv.decode(Buffer.concat(chunks), 'gb2312');var $ = cheerio.load(html, {decodeEntities: false});$('.co_content8 .ulink').each(function (idx, element) {var $element = $(element);titles.push({title: $element.text()})}) console.log(titles); }); });

運行node index

結果如下

成功獲取電影title,那如果我想獲取多個頁面的title呢,總不可能一個一個url去改吧。這當然有辦法,請往下看!

獲取多頁電影標題

我們只要將之前的代碼封裝成一個函數(shù)并遞歸執(zhí)行就完成了

核心代碼 index.js

var index = 1; //頁面數(shù)控制 var url = 'http://www.ygdy8.net/html/gndy/dyzz/list_23_'; var titles = []; //用于保存titlefunction getTitle(url, i) {console.log("正在獲取第" + i + "頁的內(nèi)容"); http.get(url + i + '.html', function(sres) {var chunks = [];sres.on('data', function(chunk) {chunks.push(chunk);});sres.on('end', function() {var html = iconv.decode(Buffer.concat(chunks), 'gb2312');var $ = cheerio.load(html, {decodeEntities: false});$('.co_content8 .ulink').each(function (idx, element) {var $element = $(element);titles.push({title: $element.text()})}) if(i < 2) { //為了方便只爬了兩頁getTitle(url, ++index); //遞歸執(zhí)行,頁數(shù)+1} else {console.log(titles); console.log("Title獲取完畢!"); }});}); }function main() {console.log("開始爬取");getTitle(url, index); }main(); //運行主函數(shù)

結果如下

獲取電影下載連接

如果是人工操作,我們需要一次操作,通過點擊進入電影詳情頁才能找到下載地址
那我們通過node如何來實現(xiàn)呢

常規(guī)先來分析頁面布局

我們?nèi)绻胍獪蚀_定位到下載鏈接,需要先找到id為Zoom的div,下載鏈接就在這個div下的tr下的a標簽內(nèi)。

那我們就再定義一個函數(shù),用于獲取下載鏈接

getBtLink()

function getBtLink(urls, n) { //urls里面包含著所有詳情頁的地址console.log("正在獲取第" + n + "個url的內(nèi)容");http.get('http://www.ygdy8.net' + urls[n].title, function(sres) {var chunks = [];sres.on('data', function(chunk) {chunks.push(chunk);});sres.on('end', function() {var html = iconv.decode(Buffer.concat(chunks), 'gb2312'); //進行轉碼var $ = cheerio.load(html, {decodeEntities: false});$('#Zoom td').children('a').each(function (idx, element) {var $element = $(element);btLink.push({bt: $element.attr('href')})})if(n < urls.length - 1) {getBtLink(urls, ++count); //遞歸} else {console.log("btlink獲取完畢!");console.log(btLink); }});}); }

再次運行 node index

就這樣我們將3個頁面內(nèi)所有電影的下載鏈接獲取完畢,是不是很簡單?

保存數(shù)據(jù)

我們講這些數(shù)據(jù)爬取出來當然是要進行保存的啊,在這里我選用了MongoDB來對其進行保存處理

數(shù)據(jù)保存函數(shù) save()

function save() {var MongoClient = require('mongodb').MongoClient; //導入依賴MongoClient.connect(mongo_url, function (err, db) {if (err) {console.error(err);return;} else {console.log("成功連接數(shù)據(jù)庫");var collection = db.collection('node-reptitle');collection.insertMany(btLink, function (err,result) { //插入數(shù)據(jù)if (err) {console.error(err);} else {console.log("保存數(shù)據(jù)成功");}})db.close();}}); }

這里的操作很簡單,就沒必要上mongoose啦
再次運行 node index

這個Node.js實現(xiàn)的爬蟲就是這樣了,祝大家能爬到自己想要的數(shù)據(jù);)

最后附上源碼地址:https://github.com/HuangXiZho...

總結

以上是生活随笔為你收集整理的Node.js实现简易爬虫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。