爬虫
爬虫的实质
- 就是发送一个网络请求去获取数据,把这个数据下载下来。
如何去发请求呢
- 发请求的方式很多,例如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()