美文网首页
nodejs小爬虫

nodejs小爬虫

作者: 一只大椰子 | 来源:发表于2017-04-01 00:23 被阅读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)
    })
    

    最后成果如下:

    结果

    相关文章

      网友评论

          本文标题:nodejs小爬虫

          本文链接:https://www.haomeiwen.com/subject/luvbottx.html