作者: 刘一奇
本文将会讲解如何使用 superagent+cheerio 写爬虫。阅读本文,你会学习到这些知识点:
如何使用 superagent 获取页面内容如何使用 superagent 获取 JS 文件的内容如何使用 superagent 下载文件如何使用 cheerio 操作页面 DOM如何正确设置字符编码来避免乱码如何使用正则表达式去除字符串中的多余信息使用 superagent 获取页面内容
superagent+cheerio 是 Node 爬虫的经典组合。superagent 是一个发起 Ajax 请求的工具。我们使用它来请求各种网络资源。比如,我们想批量爬取一些文件,我们就必须先找到文件的 URl,想找到 URL 就必须先获取记录这些 URL 的页面,想获取页面内容,那么首先就应该使用 superagent 把页面给请求下来。基本的请求代码如下:
request.get('http://example.com/search').end(function(err, res){// 将会打印页面的 HTML 字符串console.log(res.text);});
拿到了 HTMl 字符串,就可以使用 cheerio 进行解析了。关于 cheerio 我们等会介绍~
使用 superagent 获取 JS 文件的内容
使用 superagent 获取页面内容非常简单,但是当我请求完页面后发现,音频和字幕的 URL 不在页面上,而是通过 JS 动态渲染到页面上的,我的爬虫无法和 JS 通信,这该怎么办呢?其实非常简单,既然 URL 信息在 JS 文件中,那么我们直接获取 JS 文件,并使用 eval 方法解析不就行了?所以,我们来使用 superagent 获取 JS 文件的内容。与获取页面内容的方法不同,获取 JS 文件,需要加个 .buffer(true) :
request.get('https://raw.githubusercontent.com/sindresorhus/negative-zero/master/index.js').buffer(true).end(function (err, res) {...}
为何要如此?具体原因可以看这个 Issue:
https://github.com/visionmedia/superagent/issues/523
使用 superagent 下载文件
前面两节介绍了使用 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);}
非常简单,不再赘述!
使用 cheerio 操作页面 DOM
在第一节,我们介绍了使用 superagent 获取页面内容,但是页面内容太多,我们想高效提取有用信息,该如何做呢?在浏览器中,我们通常使用 jQuery 来高效操作 DOM,在 Node 爬虫中,我们可以使用 cheerio 来模拟 jQuery 的操作方法。cheerio 的基本用法如下:
var cheerio = require('cheerio')var $ = cheerio.load('<h2 content="text/html; charset=gb2312">
使用正则表达式去除字符串中的多余信息
最后,我们来讲一下如何使用使用正则表达式去除字符串中的多余信息。在下载文件时,可能需要处理一些中文名称作为将来的文件名或目录名。页面中的中文名称往往不是我们想要的,那么如何处理名称中的多余信息呢?使用正则表达式就可以做到!比如:
如果你想将 ‘听电影学英语之海上钢琴师’变为’海上钢琴师’,那么你可以这么做:
// str 就是'海上钢琴师'var str = '听电影学英语之海上钢琴师'.replace(/听电影学英语之/g, '');
如果你想将 ‘听电影MP3学英语之海上钢琴师’ 或 ‘听电影学英语之海上钢琴师’变为’海上钢琴师’,那么你可以这么做:
// str 就是'海上钢琴师'var str = '听电影学英语之海上钢琴师'.replace(/听电影(MP3)?学英语之/g, '');
注:小括号代表子表达式,问号代表前面的字符出现 0 或 1 次。
如果你想将以下字符串:
‘听电影学英语之海上钢琴师’‘听电影MP3学英语之海上钢琴师’‘听电影MP3学英语之海上钢琴师中英双语MP3+LRC’‘听电影MP3学英语之海上钢琴师 中英双语MP3+LRC’‘听电影MP3学英语之海上钢琴师 中英双语MP3+LRC+文本’‘听电影MP3学英语之海上钢琴师 中英双语MP3+LRC+文本 ‘都变为 ‘海上钢琴师’,那么正则表达式应该这么写:
/(听电影(MP3)?学英语之)|(\s?中英双语MP3\+LRC(\+文本)?)|(\s?$)/g
把各种情况都考虑进去,然后用 | 隔开。其中,\s 匹配任何空白字符,包括空格、制表符、换页符等等。
总结
上面介绍了 superagent+cheerio 写爬虫需要用到的各种技术,本文不打算对业务进行过多叙述。只要掌握了上述方法,就可以轻松读懂爬虫代码,如果你没写过爬虫,就赶快试试吧!
- 蜜度索骥:以跨模态检索技术助力“企宣”向上生长
- openEuler开源五年树立新里程碑,累计装机量突破1000万
- 创想 华彩新程!2024柯尼卡美能达媒体沟通会焕新增长之道
- 操作系统大会2024即将在京召开,见证openEuler发展新里程
- Gartner:AI引领欧洲IT支出激增,2025年将支出1.28万亿美元
- IDC:中国数字化转型支出五年复合增长率约为15.6% 高于全球整体增速
- 2028年中国数字化转型总体市场规模将超7300亿美元
- 诺基亚源代码疑遭黑客IntelBroker盗窃,公司确认已展开调查
- 携手SUSE,共驭变革之风:踏上共创数字未来之旅
- Gartner:预计2025年全球IT支出达到5.74万亿美元 同比增长9.3%
- 被联想海外起诉专利侵权 中兴通讯回应
免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。