NodeJs实现简单的爬虫

更新日期: 2018-12-05阅读量: 1889标签: node

1.爬虫:爬虫,是一种按照一定的规则,自动地抓取网页信息的程序或者脚本;利用Nodejs实现一个简单的爬虫案例,爬取Boss直聘网站的web前端相关的招聘信息,以广州地区为例;


2.脚本所用到的nodejs模块

    express     用来搭建一个服务,将结果渲染到页面

    swig          模板引擎

    cheerio      用来抓取页面的数据

    requests    用来发送请求数据(具体可查:https://www.npmjs.com/package/requests)

    async        用来处理异步操作,解决请求嵌套的问题,脚本中只使用了async.whilst(test,iteratee,callback),具体可见:https://caolan.github.io/async/

 

3.实现流程:

   首先先获取到所爬取页面的URL,打开boss直聘网站,搜索web前端既可以获取到。然后通过Chrome浏览器打开F12,获取到信息中多对应的dom节点,即可知道想要获取信息;


4.代码实现

      目录结构:



app.js  

var cheerio = require('cheerio');
var requests = require('requests');
var async = require('async');
var express = require('express');
var swig = require('swig');

var app = express();

swig.setDefaults({cache:false});
app.set('views','./views/');
app.set('view engine','html');
app.engine('html',swig.renderFile);


app.get('/',function(req,res,next){
    var page = 1;  //当前页数
    var list = []; //保存记录

    async.whilst(
        function(){
            return page < 11;
        },
        function(callback){
            requests(`https://www.zhipin.com/c101280100-p100901/?page=${page}&ka=page-next`)
            .on('data',function(chunk){
            var $ = cheerio.load(chunk.toString());
            $('.job-primary').each(function(){
                var company = $(this).find('.info-company .company-text .name').text();
                var job_title = $(this).find('.info-primary .name .job-title').text();
                var salary = $(this).find('.info-primary .name .red').text();
                var description = $(this).find('.info-company .company-text p').text();
                var area = $(this).find('.info-primary p').text();
                var item = {
                    company:company,
                    job_title:job_title,
                    salary:salary,
                    description:description,
                    area:area
                };
                list.push(item);
            });
            page++;
            callback();
           }).on('end',function(err){
                   if(err){
                       console.log(err);
                   }
                   if(page==10){
                    res.render('index',{
                        lists:list
                    });
                }
           });
        },
        function(err){
            console.log(err);
        }
    );
});

//监听
app.listen(8080);


view/index.html页面  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<style>
    table{
        width:1300px;
        border:1px solid #ccc;
        border-collapse: collapse;
        text-align: center;
        margin:0 auto;
    }
    td,tr,th{
        border:1px solid #ccc;
        border-collapse: collapse;
    }
    tr{
        height:30px;
        line-height: 30px;
    }
</style>
<body>
    <table>
        <thead>
            <tr>
                <th>公司名称</th>
                <th>公司地址</th>
                <th>薪资</th>
                <th>公司描述</th>
                <th>岗位名称</th>
            </tr>
        </thead>
        <tbody>
            {% for list in lists %}
                <tr>
                    <td>{{list.company}}</td>
                    <td>{{list.area}}</td>
                    <td>{{list.salary}}</td>
                    <td>{{list.description}}</td>
                    <td>{{list.job_title}}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    
</body>
</html>


5.启动

  直接通过 node app.js启动即可;


6.运行结果(http://localhost:8080)

来源:https://www.cnblogs.com/Adver/archive/2018/12/04/10068411.html


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: https://www.fly63.com/article/detial/1499

Node.js 中的流

Node.js 中的流(Stream)是出了名的难用甚至是难以理解。用 Dominic Tarr 的话来说:“流是 Node 中最好的,也是最容易被误解的想法。”即使是 Redux 的创建者和 React.js 的核心团队成员 Dan Abramov 也害怕 Node 流。

NodeJS沙盒逃逸研究

在这篇文章中,我们将探讨如何使用解释器的内部结构来逃离NodeJS沙箱。Node.js不是一个JavaScript框架,不同于CakePHP、Django、Rails。Node.js更不是浏览器端的库,不能与jQuery、ExtJS相提并论。

Node 引入 ESM 新方案

Node 对 ES6 Module 的支持又有新进展。一个新的 PR 更新了当前 --experimental-modules 的实现方案。type 动态判断模块加载模式:更新后的方案将根据 package.json 文件中指定的 type 值来判断 js 文件是使用 ESM 还是 commonjs

Node.js特点和适用场景

Node是由Ryan Dahl创造出来的,Ryan Dahl是一名资深的C/C++程序员,在创造出Node之前,他的主要工作都是围绕高性能web服务器来展开的,他找到了设计高性能web服务器的几个要点

关于post请求无法在node端解析body的问题

如果你自定义创建了一个node端的脚本,并且在watch.json中配置了自定义路由且type类型为post或者put,那么此时你如果在脚本文件中希望可以通过req.body或者req.params 获取

怎么彻底删除nodejs?

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

Nodejs ORM框架Sequelize快速入门

什么是ORM?简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全、可维护的SQL代码。什么是Sequelize?Sequelize是一款基于Nodejs功能强大的异步ORM框架。

angular为什么依赖nodejs?

angular用nodejs主要是用它的npm工具包,npm里面有很多很方便的工具可以用在前端开发,Angular是一个开源框架的,以 JavaScript 编写的库,一个客户端的JavaScript MVC框架,用于开发动态Web应用程序。

在node中使用jwt签发与验证token

token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。token是在服务端产生的。如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那么在服务端会返回token给前端。

node初步学习

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。Node.js 几乎每一个 API 都是支持回调函数的

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!