nodejs小爬蟲

主要參考:
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)
})

最后成果如下:

結果
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容