今天一觉醒来突发奇想打算敲一波代码,因为最近在学node,一时兴起决定写一个爬虫来爬去豆瓣的电影排行。说一下大致的思路吧。
- 我引入了axios cheerio两个包
//这个是网络请求
> const axios = require('axios')
> //这个可以将页面的html源码结构通过jq的方式选中
> const cheerio = require('cheerio')
- 之后就是编写了一个getLink的函数对网页进行请求获取当前页面全部的链接,为下一步打开详情页面做准备。
async function getLink(){
let res = await axios.get('https://movie.douban.com/chart')
let $ = cheerio.load(res.data)
let link = $('div.pl2 a')
link.each(async( i,ele)=>{
console.log($(ele).attr('href'))
}
}
- 接下来我编写一个openLink的函数,接收一个url参数对详情页进行跳转。然后将页面的标题进行返回。
async function openLink(url){
let res = await axios.get(url)
let $ = cheerio.load(res.data)
let title = $('h1').text().replace(/(\r\n|\n|\r)/gm,'').trim()
// console.log(title)
return title
}
- 然后就是完善我的getLink函数了,我使用一个空数组进行储存每次返回的title
var array = []
async function getLink(){
let res = await axios.get('https://movie.douban.com/chart')
let $ = cheerio.load(res.data)
let link = $('div.pl2 a')
link.each(async( i,ele)=>{
let newData = await openLink($(ele).attr('href'))
array.push(newData)
})
return array
}
- 最后,很遗憾的失败了由于短时间内发送大量请求导致我ip无法请求页面,但是接下来的思路也很清晰,我简单说一下,可以根据详情的dom结构对数据进行抓取然后处理成需要的格式,可以通过node 自带的fs 模块对文件进行保存,或者使用数据库对其进行储存 例如:mysql 这样以来我们需要导入mysql/mysql2等包。
小记:有些事情很难很不好下手,正式因为这样才会让自己明白自己的付出是值得的,人们只能看到自己想看到的,当所有人都在向后退,都在抱怨时,总有人会默默努力,传来不一样的声音,在不断的努力中看到希望,正如那句话,危难之中总有人要站出来。----来自于一个默默无闻的前端开发者