作者:?劉一奇
本文將會(huì)講解如何使用 superagent+cheerio 寫爬蟲。閱讀本文,你會(huì)學(xué)習(xí)到這些知識(shí)點(diǎn):
如何使用 superagent 獲取頁面內(nèi)容如何使用 superagent 獲取 JS 文件的內(nèi)容如何使用 superagent 下載文件如何使用 cheerio 操作頁面 DOM如何正確設(shè)置字符編碼來避免亂碼如何使用正則表達(dá)式去除字符串中的多余信息使用 superagent 獲取頁面內(nèi)容
superagent+cheerio 是 Node 爬蟲的經(jīng)典組合。superagent 是一個(gè)發(fā)起 Ajax 請(qǐng)求的工具。我們使用它來請(qǐng)求各種網(wǎng)絡(luò)資源。比如,我們想批量爬取一些文件,我們就必須先找到文件的 URl,想找到 URL 就必須先獲取記錄這些 URL 的頁面,想獲取頁面內(nèi)容,那么首先就應(yīng)該使用 superagent 把頁面給請(qǐng)求下來?;镜恼?qǐng)求代碼如下:
request.get('http://example.com/search').end(function(err, res){// 將會(huì)打印頁面的 HTML 字符串console.log(res.text);});
拿到了 HTMl 字符串,就可以使用 cheerio 進(jìn)行解析了。關(guān)于 cheerio 我們等會(huì)介紹~
使用 superagent 獲取 JS 文件的內(nèi)容
使用 superagent 獲取頁面內(nèi)容非常簡(jiǎn)單,但是當(dāng)我請(qǐng)求完頁面后發(fā)現(xiàn),音頻和字幕的 URL 不在頁面上,而是通過 JS 動(dòng)態(tài)渲染到頁面上的,我的爬蟲無法和 JS 通信,這該怎么辦呢?其實(shí)非常簡(jiǎn)單,既然 URL 信息在 JS 文件中,那么我們直接獲取 JS 文件,并使用 eval 方法解析不就行了?所以,我們來使用 superagent 獲取 JS 文件的內(nèi)容。與獲取頁面內(nèi)容的方法不同,獲取 JS 文件,需要加個(gè)?.buffer(true)?:
request.get('https://raw.githubusercontent.com/sindresorhus/negative-zero/master/index.js').buffer(true).end(function (err, res) {...}
為何要如此?具體原因可以看這個(gè) Issue:
https://github.com/visionmedia/superagent/issues/523
使用 superagent 下載文件
前面兩節(jié)介紹了使用 superagent 獲取頁面和 JS 文件,那么如何使用 superagent 下載保存文件到硬盤上呢?這里需要配合使用 Node 的?fs.createWriteStream?方法,代碼如下:
function download(url, localPath, cb) {var stream = fs.createWriteStream(localPath);stream.on('finish', function () {console.log('The download of ' + localPath + ' is complete!');cb();});request.get(url).pipe(stream);}
非常簡(jiǎn)單,不再贅述!
使用 cheerio 操作頁面 DOM
在第一節(jié),我們介紹了使用 superagent 獲取頁面內(nèi)容,但是頁面內(nèi)容太多,我們想高效提取有用信息,該如何做呢?在瀏覽器中,我們通常使用 jQuery 來高效操作 DOM,在 Node 爬蟲中,我們可以使用 cheerio 來模擬 jQuery 的操作方法。cheerio 的基本用法如下:
var cheerio = require('cheerio')var $ = cheerio.load('<h2 content="text/html; charset=gb2312">
使用正則表達(dá)式去除字符串中的多余信息
最后,我們來講一下如何使用使用正則表達(dá)式去除字符串中的多余信息。在下載文件時(shí),可能需要處理一些中文名稱作為將來的文件名或目錄名。頁面中的中文名稱往往不是我們想要的,那么如何處理名稱中的多余信息呢?使用正則表達(dá)式就可以做到!比如:
如果你想將?‘聽電影學(xué)英語之海上鋼琴師’變?yōu)?#8217;海上鋼琴師’,那么你可以這么做:
// str 就是'海上鋼琴師'var str = '聽電影學(xué)英語之海上鋼琴師'.replace(/聽電影學(xué)英語之/g, '');
如果你想將?‘聽電影MP3學(xué)英語之海上鋼琴師’?或?‘聽電影學(xué)英語之海上鋼琴師’變?yōu)?#8217;海上鋼琴師’,那么你可以這么做:
// str 就是'海上鋼琴師'var str = '聽電影學(xué)英語之海上鋼琴師'.replace(/聽電影(MP3)?學(xué)英語之/g, '');
注:小括號(hào)代表子表達(dá)式,問號(hào)代表前面的字符出現(xiàn) 0 或 1 次。
如果你想將以下字符串:
‘聽電影學(xué)英語之海上鋼琴師’‘聽電影MP3學(xué)英語之海上鋼琴師’‘聽電影MP3學(xué)英語之海上鋼琴師中英雙語MP3+LRC’‘聽電影MP3學(xué)英語之海上鋼琴師 中英雙語MP3+LRC’‘聽電影MP3學(xué)英語之海上鋼琴師 中英雙語MP3+LRC+文本’‘聽電影MP3學(xué)英語之海上鋼琴師 中英雙語MP3+LRC+文本 ‘都變?yōu)?‘海上鋼琴師’,那么正則表達(dá)式應(yīng)該這么寫:
/(聽電影(MP3)?學(xué)英語之)|(\s?中英雙語MP3\+LRC(\+文本)?)|(\s?$)/g
把各種情況都考慮進(jìn)去,然后用?|?隔開。其中,\s?匹配任何空白字符,包括空格、制表符、換頁符等等。
總結(jié)
上面介紹了 superagent+cheerio 寫爬蟲需要用到的各種技術(shù),本文不打算對(duì)業(yè)務(wù)進(jìn)行過多敘述。只要掌握了上述方法,就可以輕松讀懂爬蟲代碼,如果你沒寫過爬蟲,就趕快試試吧!
- 蜜度索驥:以跨模態(tài)檢索技術(shù)助力“企宣”向上生長(zhǎng)
- Commvault持續(xù)業(yè)務(wù)策略:應(yīng)對(duì)現(xiàn)代數(shù)據(jù)保護(hù)挑戰(zhàn)的新范式
- 2025年網(wǎng)絡(luò)安全主要趨勢(shì)
- 2025年值得關(guān)注的數(shù)據(jù)中心可持續(xù)發(fā)展趨勢(shì)
- 量子計(jì)算火熱,投資者又在大舉尋找“量子概念股”
- 從量子威脅到人工智能防御:2025年網(wǎng)絡(luò)安全將如何發(fā)展
- 后人工智能時(shí)代:2025年,在紛擾中重塑數(shù)據(jù)、洞察和行動(dòng)
- 2025年展望:人工智能推動(dòng)IT整合
- 量子計(jì)算:商業(yè)世界的新前沿與設(shè)計(jì)思維的融合
- IDC:三季度全球以太網(wǎng)交換機(jī)收入同比下降7.9%、環(huán)比增長(zhǎng)6.6%
- Fortinet李宏凱:2025年在中國大陸啟動(dòng)SASE PoP節(jié)點(diǎn)部署 助力企業(yè)出海
免責(zé)聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。