成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

node爬蟲快速入門

simon_chen / 664人閱讀

摘要:爬蟲初入前端,剛剛接觸,對于耳聞已久的爬蟲非常神往,所以有了這篇文章,項(xiàng)目代碼在文章末尾需求抓取天涯論壇重慶地區(qū)板塊的文章列表信息。

node爬蟲
初入前端,剛剛接觸node,對于耳聞已久的node爬蟲非常神往,所以有了這篇文章,項(xiàng)目代碼在文章末尾
需求

抓取天涯論壇重慶地區(qū)板塊的文章列表信息。

使用工具

node.js

superagent(客戶端請求代理模塊)

cheerio(為服務(wù)器特別定制的,快速、靈活、實(shí)施的jQuery核心實(shí)現(xiàn))

安裝并使用cheerio,superagent模塊
安裝
npm install superagent cheerio --save
在項(xiàng)目中引入cheerio,superagent
const superagent = require("superagent")
const cheerio = require("cheerio")
指定需要抓取的域名
const mainUrl = "http://bbs.tianya.cn"  //天涯論壇主域名
let url = "/list-45-1.shtml"    //重慶區(qū)域域名
請求數(shù)據(jù)
superagent.get(mainUrl + url).end(function (err, res) {
        // 拋錯(cuò)攔截
        if (err) {
            return
            throw Error(err)
        }
        console.log(res)
    }
分析頁面結(jié)構(gòu)
對頁面內(nèi)容進(jìn)行分析,提取對我們需要的內(nèi)容

以下圖片是頁面信息

我們需要的列表在class為mt5的div下。

整個(gè)網(wǎng)頁有多個(gè)mt5,繼續(xù)向下找。

每一欄信息在(".mt5 table tbody tr")下。

調(diào)用cheerio選取(".mt5 table tbody tr")

let $ = cheerio.load(res.text)
$(".mt5 table tbody tr").each((index, item)=>{
//這里是每一項(xiàng)的信息
})

找到了信息,下面對找到的信息進(jìn)行解析

解析數(shù)據(jù)
找到需要解析的數(shù)據(jù),對數(shù)據(jù)進(jìn)行解析,保存我們需要的數(shù)據(jù)
        let $ = cheerio.load(res.text)
        let data = []   //存儲抓去到的數(shù)據(jù)
        $(".mt5 table tbody tr").each((index, item) => {
            let _this = $(item)
            //根據(jù)頁面判斷是否是文章
            if ($(_this.children()[0]).hasClass("td-title")) {
                //對數(shù)據(jù)進(jìn)行存儲
                let obj
                let title = $(_this.find(".td-title")).find("span").next().text()
                // let text = $(_this.find("a")[0]).text()  //另一種選擇器
                let type = $(_this.find(".td-title")).find(".face").attr("title")
                let goto = $(_this.find(".td-title")).find("span").next().attr("href")
                let author = $(_this.children()[1]).text()
                let point = $(_this.children()[2]).text()
                let time = $(_this.children()[3]).text()
                obj = {
                    title: title,
                    type: type,
                    url: mainUrl + goto,
                    author: author,
                    point: point,
                    time: time
                }
                if (obj.title != "") {
                    //判斷如果有內(nèi)容,則推送到data中
                    data.push(obj)
                }
            }
        })
存儲數(shù)據(jù)到本地
此時(shí)需要把data中保存的數(shù)據(jù)存到想要保存的文件中需要用到node的fs模塊

1.引入fs模塊

const fs = require("fs")

2.存儲數(shù)據(jù)到本地

在根目錄下創(chuàng)建data文件夾

    fs.writeFile(__dirname + "/data/articleLists.json", JSON.stringify({
                status: 0,
                data: data
            }), function (err) {
                if (err) {
                    console.log(err)
                } else {
                  console.log("寫入文章列表完成")
                }
            })

現(xiàn)在爬蟲會把爬到的數(shù)據(jù)存儲到本地了
ok,到這里我們的爬蟲已經(jīng)完成了,接下來我們需要對它進(jìn)行優(yōu)化

讓爬蟲更聰明
現(xiàn)在我們的爬蟲只能爬取當(dāng)前頁的信息,我們來改一下,讓它也能翻頁

分析翻頁按鈕,天涯論壇的列表也的下一頁按鈕中有一個(gè)a標(biāo)簽,里邊的url加上之前我們記錄的mainUrl就是下一頁的標(biāo)簽。所以,在爬蟲爬取完本頁的數(shù)據(jù)后,讓爬蟲向下一頁的鏈接發(fā)一個(gè)新的請求就可以繼續(xù)爬去了。

//單次讀取后,找到下一頁的鏈接,繼續(xù)抓取下一頁的數(shù)據(jù)
        let nextPage = $(".mt5").next().find(".short-pages-2 .links")
        nextPage.children().each((index, item) => {
            if ($(item).text() === "下一頁") {
                let url = $(item).attr("href")
                getData(url)    //剛才我們請求數(shù)據(jù)的方法,命名為這個(gè)函數(shù)
            }
        })

現(xiàn)在,爬蟲讀取完當(dāng)前頁數(shù)據(jù)后就會繼續(xù)爬取下一頁的數(shù)據(jù)。

完成代碼
最后我還增加了一個(gè)頁碼,每一頁數(shù)據(jù),多帶帶進(jìn)行記錄。下面是完整的代碼
const superagent = require("superagent")
const cheerio = require("cheerio")
const fs = require("fs")

const mainUrl = "http://bbs.tianya.cn"  //天涯論壇主域名
let url = "/list-45-1.shtml"    //重慶區(qū)域域名

let index = 1   //記錄頁碼數(shù)
//發(fā)送請求獲取頁面資源方法
let getData = (url) => {
    // 使用superagent請求頁面數(shù)據(jù)
    superagent.get(mainUrl + url).end(function (err, res) {
        // 拋錯(cuò)攔截
        if (err) {
            return
            throw Error(err)
        }
        // 請求數(shù)據(jù)后使用cheerio解析數(shù)據(jù)
        let $ = cheerio.load(res.text)
        let data = []   //存儲抓去到的數(shù)據(jù)
        $(".mt5 table tbody tr").each((index, item) => {
            let _this = $(item)
            //根據(jù)頁面判斷是否是文章
            if ($(_this.children()[0]).hasClass("td-title")) {
                //對數(shù)據(jù)進(jìn)行存儲
                let obj
                let title = $(_this.find(".td-title")).find("span").next().text()
                // let text = $(_this.find("a")[0]).text()  //另一種選擇器
                let type = $(_this.find(".td-title")).find(".face").attr("title")
                let goto = $(_this.find(".td-title")).find("span").next().attr("href")
                let author = $(_this.children()[1]).text()
                let point = $(_this.children()[2]).text()
                let time = $(_this.children()[3]).text()
                obj = {
                    title: title,
                    type: type,
                    url: mainUrl + goto,
                    author: author,
                    point: point,
                    time: time
                }
                if (obj.title != "") {
                    //判斷如果有內(nèi)容,則推送到data中
                    data.push(obj)
                }
            }
        })
        if (data.length > 0) {  //判斷data中是否有內(nèi)容
            //使用fs模塊對data中的數(shù)據(jù)進(jìn)行儲存,也可以使用數(shù)據(jù)庫進(jìn)行操作
            fs.writeFile(__dirname + "/data/articleLists" + index + ".json", JSON.stringify({
                status: 0,
                data: data
            }), function (err) {
                if (err) {
                    console.log(err)
                } else {
                    console.log("寫入文章列表完成, 當(dāng)前頁碼:", index)
                    index++
                }
            })
        }
        //單次讀取后,找到下一頁的鏈接,繼續(xù)抓取下一頁的數(shù)據(jù)
        let nextPage = $(".mt5").next().find(".short-pages-2 .links")
        nextPage.children().each((index, item) => {
            if ($(item).text() === "下一頁") {
                let url = $(item).attr("href")
                getData(url)
            }
        })
    })
}
//初次執(zhí)行數(shù)據(jù)抓取
getData(url)
好了本次node爬蟲快速入門文章到這里就結(jié)束了,但是這個(gè)爬蟲還有很多地方需要完善,以后我會為大家?guī)砀敿?xì)的爬蟲教程

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92761.html

相關(guān)文章

  • 快速上手——我用scrapy寫爬蟲(一)

    摘要:寫在前面用寫爬蟲的人很多,的爬蟲框架也很多,諸如和,筆者還是筆記傾向于,本文就用寫一個(gè)小爬蟲。本文適用于有一定基礎(chǔ)的,并且對爬蟲有一定了解的開發(fā)者。 寫在前面 用python寫爬蟲的人很多,python的爬蟲框架也很多,諸如pyspider 和 scrapy,筆者還是筆記傾向于scrapy,本文就用python寫一個(gè)小爬蟲demo。本文適用于有一定python基礎(chǔ)的,并且對爬蟲有一定了...

    curlyCheng 評論0 收藏0
  • Neo4j入門之中國電影票房排行淺析

    摘要:下面,讓我們進(jìn)入本次的之旅項(xiàng)目展示由于流浪地球的大熱以及筆者對此的欣賞,因此,此次的項(xiàng)目為分析中國電影票房排行。在中國電影票房排行榜的前名中,吳京主演了戰(zhàn)狼與流浪地球,且兩者沒有其他更多的相同主演。 什么是Neo4j? showImg(https://segmentfault.com/img/remote/1460000018262759); ??Neo4j是一個(gè)高性能的NoSQL圖形...

    Atom 評論0 收藏0
  • 前端開發(fā)收集 - 收藏集 - 掘金

    摘要:責(zé)編現(xiàn)代化的方式開發(fā)一個(gè)圖片上傳工具前端掘金對于圖片上傳,大家一定不陌生。之深入事件機(jī)制前端掘金事件綁定的方式原生的事件綁定方式有幾種想必有很多朋友說種目前,在本人目前的研究中,只有兩種半兩種半還有半種的且聽我道來。 Ajax 與數(shù)據(jù)傳輸 - 前端 - 掘金背景 在沒有ajax之前,前端與后臺傳數(shù)據(jù)都是靠表單傳輸,使用表單的方法傳輸數(shù)據(jù)有一個(gè)比較大的問題就是每次提交數(shù)據(jù)都會刷新頁面,用...

    ygyooo 評論0 收藏0
  • scrapy入門

    摘要:快速入門首先,初步要做的就是快速構(gòu)建一個(gè)爬蟲。然后把結(jié)果加入到一個(gè)隊(duì)列中。既然是入門,我們肯定是先關(guān)心我們需要的。 因?yàn)楣卷?xiàng)目需求,需要做一個(gè)爬蟲。所以我一個(gè)python小白就被拉去做了爬蟲?;藘芍軙r(shí)間,拼拼湊湊總算趕出來了。所以寫個(gè)blog做個(gè)記錄。 快速入門 首先,初步要做的就是快速構(gòu)建一個(gè)爬蟲。 配置環(huán)境 Mac下安裝 1) 直接從官網(wǎng)下載 python下載官網(wǎng) 2) 是通過...

    CrazyCodes 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<