标题抓取豆瓣读书中的书籍信息
//思路:
//先爬取网页html
//将网页html进行分析,获取每个数据详情信息(在这里比较好找到作者,书名...等信息)
//将每本书籍的详情信息进行抓取,转换为自己想要的格式
//抓取豆瓣读书中的书籍信息
//cnpm i axios cheerio
const axios = require('axios').default
const cheerio = require('cheerio')
//抓取豆瓣读书源代码
async function getBooksHTML() {
const resp = await axios.get('https://book.douban.com/tag/%E6%BC%AB%E7%94%BB')//要爬取的地址
return resp.data
}
//将源代码转换为所有书籍页链接地址(这里是20个)
async function getBooksLnks() {
const html = await getBooksHTML()
const $ = cheerio.load(html) //传入一个html,cheerio会返回一个类似jq的库,可以用jq方法读取操作
const aElements = $("#subject_list .subject-list li a.nbg")
console.log(aElements.length)
const links = aElements.map((i, ele) => {
const href = ele.attribs['href']
return href
}).get()
return links
}
//根据书记详情页地址,得到该书籍的详细信息
async function getBookDetael(url) {
const resp = await axios.get(url)
const $ = cheerio.load(resp.data)
const name = $("h1").text().trim()
const imgUrl = $("#content #mainpic .nbg img").attr('src')
const spans = $("#info span.pl")
//作者
const authorSpan = spans.filter((i, ele) => {
return $(ele).text().includes("作者")
})
const author = authorSpan.next("a").text()
//出版年
const publishSpan = spans.filter((i, ele) => {
return $(ele).text().includes("出版年")
})
const publishDate = publishSpan[0].nextSibling.nodeValue.trim()
return {
name, imgUrl, author, publishDate
}
// consolesd.log(name, imgUrl, author,publishDate)
}
//获取所有的书籍信息
async function fetchAll() {
const links = await getBooksLnks() //得到所有书籍详情页地址
const proms = links.map((ele) => {
return getBookDetael(ele)
})
return Promise.all(proms)
}
fetchAll().then(res => {
console.log(res) //最终得到想要爬取的结果
})
爬取成功!