zoukankan      html  css  js  c++  java
  • ES6快到碗里来---一个简单的爬虫指南

    学习ES6的时候,没少看ES6入门,到现在也就明白了个大概(惭愧脸)。这里不谈ES6,只谈怎么把ES6的页面爬下来放到一起成为一个离线文档。

    之前居然没注意过作者把这本书开源了。。瞎耽误功夫。。。地址

    通俗易懂_小白friendly_

    node 爬虫入门

    如果你之前没有用node写过一个爬虫,可以从这篇文章开始。Node.JS 妹子图爬虫(1),除了核心模块外,文章中还用到cheerio这个库来分析访问的页面。cheerio是一个类似于jquery的库,但是运行在node上。而这里主要用到:
    node的

    • http模块
    • fs模块
    • ES6promise的一些知识。

    show time!

    分析要抓的页面路径

    这里就放在浏览器上了,当然也可以用http放在后端,F12可以发现,所有链接在一个ol元素里,如图:

    所以把所有链接地址存到数组里的代码如下:(在控制台输入)

    var links=[];
    
    Array.from($("[start='0'] a")).forEach(function(e){links.push(e.getAttribute("href"))});
    
    JSON.stringfy(links)//便于复制数组
    

    服务端

    新建一个js文件。接下来就是陪links玩了。首先我们写出了以下的渣代码,不过还好可以跑

    
    var fs = require('fs'),http = require('http');
    var links = ["#README", "#docs/intro", "#docs/let", "#docs/destructuring", "#docs/string", "#docs/regex", "#docs/number", "#docs/array", "#docs/function", "#docs/object", "#docs/symbol", "#docs/set-map", "#docs/proxy", "#docs/reflect", "#docs/promise", "#docs/iterator", "#docs/generator", "#docs/generator-async", "#docs/async", "#docs/class", "#docs/decorator", "#docs/module", "#docs/module-loader", "#docs/style", "#docs/spec", "#docs/arraybuffer", "#docs/simd", "#docs/reference"];
    var allInOne = "",  
        host = "http://es6.ruanyifeng.com/";
    var realLinks = links.map(function(link) { return link.slice(1) + '.md' });//迷之reallinks
    console.log(links.length);
    
    

    现在你就可以先在命令行里node getES6了,除了得到数组长度外并没有什么用。

    请求

    有了原料之后,开始下锅了,我们的构想是,写一个循环来依次请求这些页面,然后把得到的html字符串写到一起:

    var allInOne = "",
        n = 0;//数数用
    
    for(let link of links) {
        n++;
        allInOne += getHTML(host + link, n);
    
    }
    
    }
    
    

    接下来实现getHtml这个函数:

    function getHTML(url, n, id = "body") {
        var promise = new Promise(function(resolve, reject) {//不清楚的看http://es6.ruanyifeng.com/#docs/promise
            var pageStr = '';//用于放html或md文件
            var req = http.get(url, function(res) {//发起请求
                res.setEncoding('utf8');
                var status = res.statusCode;
                if(status == '200') {
                    res.on('data', function(chunk) {
                        pageStr += chunk;
                    });
    
                    res.on('end', function(data) {
                        allInOne += pageStr;
                        fs.appendFile(`./page/${n}.md`, pageStr, 'utf8', function(e) {//将文件保存到本地的page文件夹下,后缀是md?
                            console.log(e);
                        });
                        console.log(`finish load ${url}`);
                        resolve();
                    });
                }
            });
        });
        return promise;
    
    }
    
    

    将上面两个个代码片段拼到一起,可以先node ES6跑跑看了,是不是与期望不符?下回再说。

  • 相关阅读:
    直接用ISO文件在linux上安装新系统
    vsftpd config备忘
    失恋那回事~~~
    Java之深入JVM(0) 序
    No.6 ThreadLocal类及应用技巧
    Java之多线程(1) Race Condition引起的性能问题
    NO.10 Callable与Future的应用
    NO.5 线程范围内共享变量的概念与作用(二)
    NO.5 线程范围内共享变量的概念与作用(一)
    NO.7多个线程之间共享数据的方式探讨
  • 原文地址:https://www.cnblogs.com/imgss/p/6562174.html
Copyright © 2011-2022 走看看