前言
久闻爬虫,这几天开始学nodejs。我在https://github.com/leichanghun/node-crawler/tree/master/super agent _ chef _ demo上写了一个爬虫,抓取了博客公园主页的标题、用户名、阅读号、推荐号、用户头像。现在我做一个简短的总结。
使用这些要点:
1.节点文件系统的核心模块
2.http请求的第三方模块- superagent
3.解析DOM - cheerio的第三方模块
几个模块的详细说明和API请参考各个链接。演示中只有简单的用法。
准备工作/即将工作
使用npm管理依赖关系,依赖关系信息将存储在package.json中
//用于安装的第三方模块cnpminstall-save superagent chef介绍了所需的功能模块
//引入第三方模块,superagent用于http请求,cheerio用于解析DOM const request=require(' super agent ');const cherio=require(' cherio ');const fs=require(' fs ');请求解决页面
如果你想爬上博客公园主页的内容,你必须首先请求主页地址并获得返回的html。这里,您使用superagent来发出http请求。基本使用方法如下:
请求。获取(网址)。end (error,res) {//do某事}向指定的URL发起get请求。当请求错误时,将返回一个错误(如果没有错误,则错误为null或未定义),RES是返回的数据。
为了在获取html内容后获得我们想要的数据,我们需要用cheerio解析DOM。cheerio需要先加载目标html,然后解析它。API与jquery的API非常相似,所以熟悉jquery非常快。直接看代码示例
//target link blog park主页lettargetur=' https://www . cn blogs.com/';//用于临时保存解析后的内容和图片地址数据让内容=' ';让imgs=[];//发起请求请求。get (targeturl)。end ((error,RES)={ if(error){//请求错误,打印错误,故返回console . log(error)return;}//chef需要加载html let $=chef。首先加载(res.text );//抓取需要的数据。每个cheerio提供的方法用于遍历$ ('# post _ list。post _ item’)。每个((索引,元素)={//分析所需数据的DOM结构。//通过选择器定位目标元素。然后获取数据,让temp={'title' : $(元素)。查找(' H3 a ')。text(),' author' : $(元素)。查找('。post _ item _ foot a’)。文本()。读取数字' : $(元素)。查找('。article _ view a’)。文本()。slice (3,-2),'推荐数量' : $(元素)。查找('。迪格纳穆')。text()}//拼接数据内容//获取图片地址if ($ (element)。find ('img。“PFS”)。长度0) {imgs。push ($(元素)。find ('img。“PFS”)。attr ('src ')也是如此;} });//存储数据mkdir('。/content ',save content);mkdir('。/imgs ',downloadImg);})存储数据
解析完上面的DOM后,所需的信息内容已经拼接好了,图片的URL也已经得到了。现在,将内容存储在指定目录的txt文件中,并将图片下载到指定目录
先创建一个目录,使用nodejs core的文件系统
//创建目录函数mkdir (_ path,回调){if (fs。existsync(_ path)){ console . log(`$ { _ path }目录已经存在`)} else {fs。mkdir (_ path),(错误)={ if(error){ return console . log } console . log(` $ { _ path }目录创建成功`)})}回调();//如果没有生成指定的目录,则不会执行。}指定目录可用后,即可写入数据,txt文件的内容已经存在。直接写,用writeFile()
//将文本内容保存在txt文件中。函数save content () {fs.writefile('。/content/content.txt ',content . tostring());}获得了图片的链接,所以需要使用superagent下载图片,图片在本地存在。Superagent可以直接返回一个响应流,然后配合nodejs管道将图片内容直接写到本地
//下载抓取的图片函数download img(){ imgs . foreach((imgur,index)={//获取图片名称let imgname=imgur.split ('/')。pop();//下载图片并存储在指定的目录中。let stream=fs.createwritestream(`。/imgs/$ { imgname } `);let req=request . get(' https : ' IMgurl);//响应流req . pipe(stream);Console.log(`开始下载图片https : $ {imgur}-。/imgs/$ { imgname } `);})}效果
执行演示,看效果,数据已经正常下滑
一个非常简单的演示可能不那么严谨,但它总是迈出了节点的第一小步。
摘要
以上是边肖推出的nodejs爬虫的第一次测试superagent和cheerio。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!