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);
})