/node-crawl

nodejs项目--爬虫总结及实战

Primary LanguageHTML

使用nodejs做爬虫已经有一段时间了,利用爬虫技术,期间共做了3个网站
    |-- 361搜索
        |-- 功能: 利用360搜索、爱电影网、百度网盘、虫虫钢琴网、旗米拉网、虾米网等网站现有的功能,
                 帮助用户快速获得下载资源。
        |-- 网址: http://114.215.159.50:7001/
        |-- git库: https://github.com/tsq/361so
    |-- 爱虾米
        |-- 功用: 利用虾米网提供的api,提供搜索并获取艺人档案、评论、歌曲、专辑、图片等信息,
        |-- 网址: http://114.215.159.50:1400/index.html
        |-- git库: https://github.com/tsq/xiami
    |-- 美女图库
        |-- 功能: 看美女,免去原有网站一页只能看一张的纠结!
        |-- 网址: http://114.215.159.50:2014/
        |-- git库:  https://github.com/tsq/girl-gallery

下面是自己的一些总结和心得体会
    |-- 利用爬虫我们能够做什么?
        |-- 获取别的网站现有的api
            |-- 例如自己的361搜索网站中的,当你输入时,跳出的搜索建议,就是来自360搜索的api。
        |-- 对网站功能进行个性化重构
            |-- 例如自己的爱虾米、美女图库。都是对原有网站的重构,即数据来源于你,但是,布局
                我自己来呈现。
    |-- 爬虫需要哪些技术?
        |-- cheerio模块
            |-- 理由: 爬虫最关键的就是网页dom的分析,数据的提取,而cheerio,这个类似服务端版本的
                     jquery可以帮我们快速轻松的完成任务。
            |-- 英文官网: http://matthewmueller.github.io/cheerio/
            |-- api中文翻译: http://cnodejs.org/topic/5203a71844e76d216a727d2e
            |-- git库地址: http://matthewmueller.github.io/cheerio/
        |-- request模块
            |-- 理由: request模块对http的各种请求都做了很好的封装,在做http请求时,可以很容易
                     的获取请求数据,甚至支持cookie的传输。自己之前利用request做过一个restful
                     请求发送的网站: https://github.com/tsq/restful ,可以发现request的功能是
                     多么的强大。
            |-- git库地址: https://github.com/mikeal/request
        |-- 字符串的处理
            |-- 爬来的数据,大多情况下是一大堆字符串,因此如何获得自己想要的那部分字符串就需要熟悉
                js中对字符串的处理,如 substring、indexOf、lastIndexOf、replace等等。
    |-- 前端怎么办?
        |-- 爬虫代码一般放在服务端,因此我们还需要前端技能,在前端把从服务端获得的数据正确的展示。
            至于页面布局展示,如果你不想自己写css可以去:https://wrapbootstrap.com/ 选择一个,
            js框架可以使用jquery、angular等等。
爬虫实战demo
    |-- demo就是本项目'mm',这个项目是在做美女图库时的测试代码,演示了如何获取想要的数据。
        下面会以suren.js为例,分析如何获取数据。你可以对照着suren.js中的代码看下面的说明。
    |—— demo最后被集成的效果是: http://114.215.159.50:2014/
    |-- suren.js源码分析
        |-- 作用: 获取 ‘http://www.22mm.cc/mm/suren/’页面中所有的图片的src、href、title
        |-- 第一步: 引入request、cheerio、qs模块
        |-- 第二步: var url = 'http://www.22mm.cc/mm/suren/';
                   request(url).pipe((fs.createWriteStream('suren.html')));
                   通过request将这个页面先下载到本地,进行dom分析,分析前,最好用编辑器将这个html
                   代码格式化一下。这样比较方便分析dom结构。
        |-- 第三步: 数据分析
                   |-- 我们想要的src、href、title等数据都是存放在li标签中,li中a便签包含了href和
                       title。li中img标签包含了图片的src。
        |-- 第四步: 数据获取
                   |-- 获取整个html文档,这个html页面都被包装在$对象中了
                                       request(url, function (error, res, body) {
                                       if (!error && res.statusCode == 200) {
                                           var $ = cheerio.load(body);
                                       }}
                   |-- 获取所有的li元素:  var li = $('li');
                   |-- 遍历li数组:    li.each(function (index, ele) {})
                   |-- 获取当前li中的title、src、href数据:
                                         var text = $(this).text();
                                         var src = $('img', this).attr('src');
                                         var href = $('a', this).attr('href');
                   |-- 将数据封装成一个对象,并存在数组中:
                                         var obj = {
                                              src: src,
                                              href: 'http://www.22mm.cc' + href,
                                              text: text
                                          };
                                          arr.push(obj);
        |-- 第五步: 测试结果:
                   |-- 项目根目录下: node suren.js 你将看到:
                        arr: [ { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-4/1/s0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaeaiHdaPPHmdi.html',
                            text: '花样年华' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-18/1/s0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJPeeibJJaCaaPH.html',
                            text: '迷雾 森林' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-8/1/s0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJaeJiPeeaddeHa.html',
                            text: '我喜欢你是安静的' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-9/1/s0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCabiamdaCaaib.html',
                            text: '那年夏天' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-6/1/s0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCaCiaPedaHiiaH.html',
                            text: '公交站台' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-5-29/1/s0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiamdbJmiPmaiPJdd.html',
                            text: '竹边' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-5-23/1/s0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiamdHPeaHCamHJdi.html',
                            text: '秀气清纯妹妹kik...' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-15/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaePmdeCaPammbaJ.html',
                            text: '兔蜜旅行' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-13/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaePHmJPeiaHidiJ.html',
                            text: '夏' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-12/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaePddbePamadid.html',
                            text: '随意乐呵乐呵' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-11/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaePPPJeJiammdmC.html',
                            text: '8月咖啡' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-8/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaeaeHbPbJammbPm.html',
                            text: 'Miya,初秋' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-7/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaeaJHHJbdaiHbPe.html',
                            text: '瞳-微凉的你' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-5/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaeamJdaJJaiHePe.html',
                            text: '夏の逆光' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-8-4/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaeaiHdaPPHmdi.html',
                            text: '花样年华' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-31/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJHPiPeaHammmmb.html',
                            text: '那年青春' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-30/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJHaeJbdmammidm.html',
                            text: '户外街拍校花性感...' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-29/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJdbiibHiamimaC.html',
                            text: '午後微藍' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-24/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJdimCHHbamPdie.html',
                            text: '时尚百变美女吕妍...' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-23/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJdHmiCePaHaHm.html',
                            text: '清纯校花公园迷人...' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-21/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJdPbHPbmamHamJ.html',
                            text: '昙华林贰拾壹号' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-18/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJPeeibJJaCaaPH.html',
                            text: '迷雾 森林' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-16/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJPCibmCPaimiaa.html',
                            text: '樱花树下' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-11/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJPPHmHidaCaadm.html',
                            text: '等待秋天' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-10/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJPaeeCHaamaJdi.html',
                            text: '安静的时光' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-8/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJaeJiPeeaddeHa.html',
                            text: '我喜欢你是安静的' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-8/2/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJaeeJPCdaddeHa.html',
                            text: '浪漫樱花' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-3/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJaHeaeiiaiamPH.html',
                            text: '夏花瘾' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-2/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJaddeiJCamimib.html',
                            text: 'piko' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-7-1/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaJaPPHCdHamiJim.html',
                            text: '一绺青丝' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-30/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCHadJaHdmiH.html',
                            text: '微醺初夏' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-26/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCdCJbdeeaimdid.html',
                            text: '邻家清纯MM沈乔乔...' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-25/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCdmmabHiamHiiH.html',
                            text: 'leisure time' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-23/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCdHeHCdeamPeid.html',
                            text: '瞳-简单' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-19/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCPbCJdmdammmPC.html',
                            text: '秘密花园' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-17/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCPJdHHHHaHPCda.html',
                            text: '马路少女' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-13/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCPHdCJPeadHJHC.html',
                            text: '明若朝曦' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-11/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCPPdaamamdaPb.html',
                            text: '春天里' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-9/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCabiamdaCaaib.html',
                            text: '那年夏天' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-6-6/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiaCaCiaPedaHiiaH.html',
                            text: '公交站台' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-5-30/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiamHaCCPaPaCamiC.html',
                            text: '森林の少女' },
                          { src: 'http://srimg1.meimei22.com/pic/suren/2014-5-29/1/0.jpg',
                            href: 'http://www.22mm.cc/mm/suren/PiamdbJmiPmaiPJdd.html',
                            text: '竹边' } ]
    |-- 集成在服务端中
        |-- 使用你自己喜欢的服务端框架将功能集成到api中,在这里我使用的sails框架,所以最后
            api集成的结果就是:
         https://github.com/tsq/girl-gallery/blob/master/api/controllers/PicController.js
    |-- 本项目其他js的说明:
        |-- suren-detail.js
            |-- 获取http://www.22mm.cc/网站美女大图的src
        |-- umei.js
            |-- 获取http://www.umei.cc/网站首页的图片的src
        |-- umei-detail.js
            |-- 获取http://www.umei.cc/网站美女大图的src
        |-- umei-detail-download.js
            |-- 下载http://www.umei.cc/网站美女大图到本地
            |-- 和http://www.22mm.cc/不同的是http://www.umei.cc/网在请求图片数据的时候会检查
                    http header中的 Referer,所以要特殊处理。而不能直接在浏览器中输入图片的url
        |-- 用node分别执行一下这几个js看看吧。特别是umei-detail-download.js,执行完后你将看到
            一张高清美女图。
    |-- 其它感悟
        |-- 编码的处理:
            |-- 有很多网站并非采用utf-8编码,所以爬来的数据可能是乱码,需要进行一些处理。
                '361搜索'工程中就有很多类似的处理。
        |-- 字符串的处理
            |-- 爬虫过程中经常需要进行对字符串进行处理,需要掌握好js中对字符串的处理,
                例如‘美女图库’项目中大图的获取,获取的图片src中,该网站故意将'pic'换成了'big',
                因此需要自己处理一下。