zoukankan      html  css  js  c++  java
  • node实现爬虫

    node实现获取到豆瓣电影排行榜页面。

    准备工作:

    1.新建一个文件夹node 在当前文件夹中打开cmd

    下载 npm install

    初始化 npm init(注意一下:如果你的npm init没有作用可以使用npm init -y)

    2.下载模块

    • superagent可以发起http请求
    • cheerio解析http返回的html内容,可以理解为一个Node.js版的 jquery,使用方式跟jquery相同
    •  
    • fs设置文件,在获取到图片的路径之后,可以实现将图片保存在本地
    •  
    • request采用这个模块,向服务器发起请求,获取图片资源
    • eventproxy:利用事件机制解决回调函数深度嵌套的问题
    • async:多线程并发控制

    3.在node中新建两个文件夹

    data放置得到的数据的内容 image获取得到的图片

    开始编写代码。

    var superagent=require('superagent');
    var cheerio=require('cheerio');
    var url=require('url');
    var fs=require("fs");
    var request=require('request');
    var targeturl='https://movie.douban.com/chart';
    
    var eventproxy=require('eventproxy');
    var ep=new eventproxy()
    
    var async=require('async')
    
    superagent.get(targeturl).end(function(err,res){
        if(err){
            return console.error(err)
        }
        console.log('爬虫开始')
        var $=cheerio.load(res.text);//利用cheerio开始解析页面
        var repoUrls=[];//保存url
        var titleArray=[];
        console.log($('.item .pl2').length)
        $(".item .pl2").each(function(index,element){
            var $element=$(element);
            var href=url.resolve('https://movie.douban.com',$element.find("a").attr('href'))
         
            repoUrls.push(href)
    
            //获取每个仓库名字
            var $title=$element.find("a").contents()
    
            $title=$title[0].data.substr(0,$title.length-1)
            titleArray.push($title)
    
            var news={
                //名字
                title:$title,
                //路径
                url:href
            }
            console.log($)
            saveImage($,news)
        })
        repoUrls=repoUrls.slice(0,2)
    
        concurrencyCount=0;//当前并发记录
        var fetchUrl=function(repoUrl,callback){
            concurrencyCount++
            console.log('现在的并发数是',concurrencyCount,',正在抓取的是',repoUrl)
            superagent.get(repoUrl).end(function(err,res){
                var $=cheerio.load(res.text);
                //对也面内容进行解析
                var httpGitUrl=$('.item').attr('value')
    
                return ({
                    url:repoUrl,
                    httpGitUrl:httpGitUrl
                })
                concurrencyCount--;
                callback(null,repoUrl)
            });
        }
    
        async.mapLimit(repoUrls,5,function(repoUrl,callback){
            //对每个url进行相关处理
            fetchUrl(repoUrl,callback)
        },function(err,result){
            console.log('final');
    
        }
        )
    })
    //保留图片资源
    function saveImage($,news){
        $(".item .nbg img").each(function(index,item){
            var img_title=$(this).attr("alt");//获取图片名字
            console.log(img_title)
            var img_filename=img_title+'.jpg';
            var img_src=$(this).attr("src");//获取图片的路径
            //采用request模块,向服务器发起一次请求,获取图片资源
            request.head(img_src,function(err,res,body){
                if(err){
                    console.log(err)
                }
            });
            request(img_src).pipe(fs.createWriteStream('./image/'+news+'---'+img_filename))
        })
    }

    这样代码就完成了

    开始执行代码:

    然后再cmd中node index.js就可以了

    git地址:https://github.com/GainLoss/MyNode/tree/master/Node%20crawler

    参考:

    https://byronlun.github.io/posts/2017-01-20-NodeJS爬虫摸索教程.html

    http://blog.csdn.net/yezhenxu1992/article/details/50820629

     

     

     

  • 相关阅读:
    十分钟-Nginx 入门到上线
    83.面向忙碌开发者的 Android 知识点收录 (转)
    技术人,为什么需要构建知识图谱 (转载)
    C# 4.0四大新特性代码示例与解读
    .NET 项目代码风格要求
    .NET 推荐博客
    C# 五、谈扩展方法的理解
    ASP.NET 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
    ASP.NET 你必须知道的EF知识和经验
    Linq表达式、Lambda表达式你更喜欢哪个?
  • 原文地址:https://www.cnblogs.com/GainLoss/p/7229192.html
Copyright © 2011-2022 走看看