主要參考:
http://www.lxweimin.com/p/486ebec4d3a9
https://www.npmjs.com/package/cheerio
這次打算從句子迷網站爬一些美麗的句子。
打算得到的對象結構為:
{
content: "句子內容",
author: "作者",
source: "來源"
}
先分析網站的搜索鏈接
http://www.juzimi.com/search/node/%E5%A4%B1%E6%81%8B%20type%3Asentence?page=5
這是我搜索“失戀”然后翻到第六頁的結果。
于是可以得知搜索url為(其中page從0開始):
http://www.juzimi.com/search/node/${encodedKeyword}%20type%3Asentence?page=${page}
再分析一下html結構,還是挺清晰的
html分析
然后就可以動手寫了。
主要使用cheerio
來進行操作,它可以用類似JQuery的方式操作html。
encode
一下關鍵字主要是為了處理中文字。
這里用了一個循環來遞增page
,當get
出錯說明page
已經搜完最后一頁,就可以退出了。
最后還用fs來導出,方便導入數據庫。
app.get('/search/:keyword', async (req, res, next) => {
let { keyword } = req.params
console.log('keyword:' + keyword)
let encodedKeyword = encodeURIComponent(keyword)
let sentenceList = []
let page = 0
let goingOn = true
while (goingOn) {
console.log('page:' + page)
let response = await request.get(`http://www.juzimi.com/search/node/${encodedKeyword}%20type%3Asentence?page=${page}`).catch((err) => {
goingOn = false
console.log('done')
})
if (goingOn) {
let html = response.text
let $ = cheerio.load(html)
$('.views-field-phpcode').each(function (index, element) {
let content = $(element).find('.views-field-phpcode-1').find('a').text()
let temp = $(element).find('.xqjulistwafo').find('a')
let author
let source
if (temp.length == 2) {
author = temp.eq(0).text()
source = temp.eq(1).text()
} else {
author = ''
source = temp.eq(0).text()
}
sentenceList.push({
content,
author,
source
})
})
++page
}
}
fs.writeFileSync(`${keyword}.json`, JSON.stringify(sentenceList))
res.json(sentenceList)
})
最后成果如下:
結果