利用nodejs简易爬虫(url,正则,cheerio)

本文介绍如何使用Node.js进行简易网络爬虫的搭建,包括解析URL、抓取网页内容、匹配特定数据及资源下载。利用request库获取网页,cheerio库解析HTML,实现类型筛选、电影信息抓取及表情包图片、音乐资源的自动化下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

url

首先是两个url上的东西

let url = require("url")
let request = require("request")

let tarUrl = "https://www.bilibili.com/video/av88369894?p=9"

// 查询url上的信息,包括query,端口,协议等等
let objUrl = url.parse(tarUrl)

// 对url进行合并
// 结果https://www.bilibili.com/video/aa/bb/cc?a=1&b=2
let souUrl = "aa/bb/cc?a=1&b=2"
let objUrl2 = url.resolve(tarUrl,souUrl)

然后简易爬虫

let httpUrl = "https://www.1905.com/vod/list/n_1_t_1/o3.html?fr=vodhome_js_lx"
async function getClassUrl() {
  let {res,body} = await req(httpUrl)
  let reg = /<span class="search-index-L">类型(.*?)<\/div>/igs
  // 下面取 1 是因为使用 exec方法获取到的是一个数组
  // 并且如果匹配到多个结果,这个方法也只是返回第一个结果,但是执行多次可以把后面的结果一一拿出来
  // 数组里面第0个参数是匹配的内容,第1给参数是括号()内匹配到的内容
  // 然后通过这种方法获取到匹配到的信息
  let result = reg.exec(body)[1]

  // 再次匹配适合的内容
  // let reg1 = /<a href="(.*?)".*?>(.*?)<\/a>/igs
  let reg1 = /<a href="javascript\:void\(0\);" onclick="location\.href='(.*?)';return false;".*?>(.*?)<\/a>/igs
  let result1;
  let arr=[]
  // 把exec方法匹配到的后面的结果一一拿出来
  while ( result1 = reg1.exec(result) ) {
    let obj = {
      name:result1[2],
      url:result1[1]
    } 
    arr.push(obj)
    if (result1[2] == "喜剧") {
      getMovie(result1[1])
    }
  }
} 

async function getMovie( url ) {
  let {res,body} = await req(url)
  
  // 进行匹配电影名字与链接
  let reg2 = /<a class="pic-pack-outer" target="\_blank" href="(.*?)" title="(.*?)"><img /igs 
  let result2
  let arr1 = []
  while (result2 = reg2.exec(body)) {
    let obj1 = {
      name:result2[2],
      url:result2[1]
    }
    arr1.push(obj1)
  }
  console.log(arr1);
}
// 封装发送请求的方法
getClassUrl()
function req(url) {
  return new Promise(function (resolve, reject) {
    request.get(url,function (err, res, body){
      if (err) {
        reject()
      }else{
        resolve({res,body})
      }
    })
  })
}


结合cheerio写爬虫

cheerio是一个类似jQuery的库,使用也是跟jQuery一样使用
注意,当使用async定义函数,并且有返回值的时候,也必须再async函数中使用await执行函数才能拿到值

let cheerio  = require("cheerio")   // 安装导入
let axios = require("axios")
let fs = require("fs")
let path = require("path")

let httpUrl = "https://www.fabiaoqing.com/search/search/keyword/%E5%8D%B0%E5%B0%BC%E5%B0%8F%E8%83%96+TATAN/type/bqb.html" 

aa(httpUrl)
async function getPage(){        // 此处为cheerio基本用法
    let res =  await axios.get(httpUrl)   // 第一步,通过axios获取到网址信息
    let $ =cheerio.load(res.data)         // 第二步,使用cherio解析
    let pagelength =  $(".ui.pagination.menu a").length  //第三步,就可以使用$ 去使用网址上的选择器来获取数据
    let pagenum = $(".ui.pagination.menu a").eq(pagelength-2).text().trim()    // 这里是获取数据页数
    return pagenum
}

(async function getindex(){
  let num =  await getPage()
  for (let i = 0; i < num; i++) {          //这里根据页数获取页数数据
    let pageUrl = "https://www.fabiaoqing.com/search/search/keyword/%E5%8D%B0%E5%B0%BC%E5%B0%8F%E8%83%96+TATAN/type/bqb/page/"+i+".html"
    aa(pageUrl)
  }
})()

async function aa(url){                  // 下面就写爬虫基本流程
  let res = await axios.get(url)  
  let $ = cheerio.load(res.data)
    $('#bqb .ui.segment.imghover>a').each((i,ele)=>{        // 获取选择器里面的内容
    let title = $(ele).attr("title")       
    fs.mkdir("./img/"+title,function(err){ if (err) {}else{}})  // 使用fs把内容写入目录
    let imgurl = $(ele).find(".bqppdiv img").each((i,ele)=>{
      let imgurl = $(ele).attr("data-original")
      let imga = path.extname(imgurl)                             // 获取文件后缀名
      let imgpath = `./img/${title}/${title}-${i}${imga}`         // 设置写入文件路径与名字
      let w1= fs.createWriteStream(imgpath)                       // 创建写入流
      axios.get(imgurl,{responseType:"stream"}).then( res=>{      // 使用获取到的url进行下载
        // 因为结果是一个流形式的东西,必须使用res.data进行读取
        res.data.pipe(w1)                                          // 读写
        console.log(title);
        res.data.on("close",function(){                            // 最后关掉
          w1.close()
        })
      })
     } )
  })
}

音乐爬取

let axios = require('axios')
let fs = require('fs')

getUrl()
async function getUrl(){
    let httpUrl = "http://www.app-echo.com/api/recommend/sound-day?page=1"
    let res = await axios.get(httpUrl)
    res.data.list.forEach( (item,i) => {
      if (i !== 7) {
        let title = item.sound.name
        let singUrl =  item.sound.source
        getMusic(title,singUrl)
      }
    });
}

async function getMusic(title,url){
  let urlPath = `./music/aa${title}aa.mp3`
  let ws = fs.createWriteStream(urlPath)
  let res = await axios.get(url,{responseType:'stream'})
  // 因为结果是一个流形式的东西,需要拿到data里面的数据
  res.data.pipe(ws)
  console.log(title);
  res.data.on("close",function () {
    ws.close()
  })
}

延时函数

// 封装一个延时函数,放到获取数据写爬虫用
function wait(timeout) {
  return new Promise( function(resolve,reject){
    setTimeout(() => {
      resolve("成功执行",timeout)
    }, timeout);
  } )
}
// 放到获取页面数的函数里面
wait(1000 * i).then(res =>{
  console.log(res);
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值