nodejs小爬虫

2017-04-01  本文已影响0人  一只大椰子

主要参考:
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结构,还是挺清晰的


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

最后成果如下:

结果
上一篇下一篇

猜你喜欢

热点阅读