爬虫下载到本地

373 阅读2分钟

爬虫

爬虫的实质

  • 就是发送一个网络请求去获取数据,把这个数据下载下来。

如何去发请求呢

  • 发请求的方式很多,例如Axios,request,http等;
    • 其中一个比较顺手的,代码量比较少的是node-fetch;
    • node-fetch的好处就是跟浏览器里面的fetch是对应的;
    • 如果不会用就去npm里面搜索一下node-fetch;

安装node-fetch

  • npm里面有说明;

    • 如果采用require方式引入的话就用:
npm install node-fetch@2
  • 如果采用ESM,import的方式的话,就不用加版本号,哪个都可以;
import fetch from 'node-fetch';

项目实战

  • 在index.js里面输入
const fetch = require('node-fetch')
  • 在终端引入
npm install node-fetch@2

寻找需要爬的url

  • 找到一个你需要的网页,然后在index.js填写下方代码:
const fetch = require('node-fetch')

fetch('https://www.nowcoder.com/search?type=post&subType=2&tagId=0&order=create&query=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4+%E5%89%8D%E7%AB%AF')
.then(res=>res.text())
.then(text=>{
    console.log(text)
})
  • 在终端里输入,终端里就会出现爬到的内容;
node index.js
  • 或者将index.js里面的代码换成这个函数,效果也是一样;
const fetch = require('node-fetch')

async function start(){

let res= await fetch('https://www.nowcoder.com/search?type=post&subType=2&tagId=0&order=create&query=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4+%E5%89%8D%E7%AB%AF')
let body = await res.text()
console.log(body)
}

start()
  • 接着node index.js效果是一样。

更换URL里面的内容,

const fetch = require('node-fetch')

**let job='前端'**
**let company = '腾讯'**

async function start(){
**let url = `https://www.nowcoder.com/search?type=post&subType=2&tagId=0&order=create&query=${company}+${job}`**
let res= await fetch(url)
let body = await res.text()
console.log(body)
}

start()

如何把爬虫的文件下载到本地?

  • 写到本地文件的代码:fs.writeFileSync(filename, data, [options]);
  • 使用之前,需要引入const fs = require ('fs')
  • 接收参数:
    • filename (String)  文件名称;
    • data (String | Buffer) 将要写入的内容,可以使字符串或 buffer数据;
    • options (Object)  option数组对象,包含:
      • · encoding  (string)可选值,默认 ‘utf8′,当data使buffer时,该值应该为 ignored。
      • · mode (Number) 文件读写权限,默认值 438;
      • · flag  (String)   默认值 ‘w'
  • process.cwd(),执行当前文件的路径,在fs.writeFileSync的文件的路径,就是下载的文件内容,到这个当前的文件夹下 process.cwd()。
fs.writeFileSync(
path.join(process.cwd(),
`${job}_${company}_1.html`),
body,'utf-8')

完整的内容

#!/usr/bin/env node

//放在开头的意思是使用node来执行index.js

const fetch = require('node-fetch')
const fs = require('fs')
const path = require('path')

let job='前端'
let company = '腾讯'

async function start(){
let url = `https://www.nowcoder.com/search?type=post&subType=2&tagId=0&order=create&query=${company}+${job}`
let res= await fetch(url)
let body = await res.text()

fs.writeFileSync(path.join(process.cwd(),`${job}_${company}_1.html`),body,'utf-8')

}

start()