Node.js实现简单爬虫

215 阅读2分钟

什么是爬虫

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

在生活中网络爬虫经常出现,搜索引擎就离不开网络爬虫。例如,百度搜索引擎的爬虫名字叫作百度蜘蛛(Baiduspider)。百度蜘蛛,是百度搜索引擎的一个自动程序。它每天都会在海量的互联网信息中进行爬取,收集并整理互联网上的网页、图片视频等信息。当用户在百度搜索引擎中输入对应的关键词时,百度将从收集的网络信息中找出相关的内容,按照一定的顺序将信息展现给用户。

本文将用用Nodejs 来实现一个网页抓取的小程序。

要用到的三个包

const cheerio = require('cheerio')
const request = require('request')
const fs = require('fs')

这三个包的主要功能介绍一下

  • cheerio 读取html元素。
  • request 进行请求
  • fs操作文件(fs是nodejs自带的,无需安装依赖)

爬取的网站

彼岸桌面

知识点

  • request(url).pipe() 返回的是文件流
  • fs.createWriteStream 写入文件流

安装好依赖以后在根目录下新建img文件夹用来存放抓取的网页图片

index.js完整代码

const cheerio = require('cheerio')
const request = require('request')
const fs = require('fs')
const headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36',
}
 
 

const Repier = (options) => {
    for (let i = 1; i <= options.page; i++) {
        let optUrl = i == 1 ? options.url : options.url + `index_${i}.htm`
         request({
            url: optUrl,
            headers
        }, (_, response, body) => {
            console.log(optUrl)
            const $ = cheerio.load(body)
            const list = $('.list ul li a img')
            console.log(list,$)
            list.each(async (index, item) => {
                const url = $(item).attr('src')
                if (url) {
                    try {
                        await request(url).pipe(fs.createWriteStream('./img/' +i+ '-'+index+ '.jpg'))
                        console.log(i, '----', index, url)
                    }
                    catch (e) {
                        console.log(e, 'error')
                    }
                }
            })
        })
    }
}
 
Repier({
    url: 'http://www.netbian.com/meinv/',
    page: 20 
    //页数随意调整
})

package.json代码

{
  "name": "demo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cheerio": "^1.0.0-rc.11",
    "download": "^8.0.0",
    "express": "^4.18.1",
    "request": "^2.88.2"
  }
}

最后在终端中运行node index即可等待图片抓取并保存

成果展示