主要参考:
http://www.jianshu.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结构,还是挺清晰的
然后就可以动手写了。
主要使用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)
})
最后成果如下: