使用nodejs爬取拉勾苏州和上海的.NET职位信息

最近开始找工作,本人苏州,面了几家都没有结果很是伤心。在拉勾上按照城市苏州关键字.NET来搜索一共才80来个职位,再用薪水一过滤,基本上没几个能投了。再加上最近苏州的房价蹭蹭的长,房贷压力也是非常大,所以有点想往上海去发展。闲来无聊写了个小爬虫,爬了下苏州跟上海的.NET职位的信息,然后简单对比了一下。

是的小弟擅长.NET,为啥用nodejs?因为前几天有家公司给了个机会可以转nodejs,所以我是用来练手的,不过后来也泡汤了,但是还是花两晚写完了。刚学,代码丑轻喷哈!

一:如何爬取拉勾的数据

这个其实非常简单,本来还以为要用正则去分析html,其实拉勾分页提了ajax的接口,可以直接用http去访问。打开神器Chrome的F12一看便知。

这是用nodejs模拟分页请求的代码:

var getData = function (kd,city,pn) {
    var mongo = require(‘./mongo‘);
    var http = require(‘http‘);
    var queryString = require(‘querystring‘);

    var postData=queryString.stringify({
        ‘pn‘:pn,
        ‘kd‘:kd,
        ‘first‘:false
    });

    var options = {
        hostname:‘www.lagou.com‘,
        method:‘POST‘,
        path:‘/jobs/positionAjax.json?px=default&city=‘+city,
        headers: {
        ‘Content-Type‘: ‘application/x-www-form-urlencoded‘,
        ‘Content-Length‘: postData.length
        }
    };

    var postResult = ‘‘;

    var req = http.request(options,(res)=>{
        console.log(`STATUS:${res.statusCode}`);
        res.setEncoding(‘utf8‘);
        res.on(‘data‘,(chunk)=>{
            postResult+=chunk;
        });
        res.on(‘end‘,()=>{
            console.log(`RESULT:${postResult}`);
            var jsonObj =JSON.parse(postResult);
            //insert into db
            jsonObj.content.result.forEach((item)=>{
                var salary = item.salary;
                //拆分3k-6k,易于统计
                var arr = salary.split(‘-‘);
                var min = arr[0].substring(0,arr[0].indexOf(‘k‘));
                var max = arr.length>1? arr[1].substring(0,arr[1].indexOf(‘k‘)):min;
                item.salaryMin = parseInt(min);
                item.salaryMax = parseInt(max);

                mongo.save(city,item);
            });
            if(jsonObj.content.hasNextPage&&jsonObj.content.totalPageCount>pn){
                getData(kd,city,pn+1);
            }
        });
        req.on(‘error‘,(e)=>{
            console.log(`problem with request:${e.message}`);
        });
    });

    req.write(postData);
    req.end();
    console.log(`start to get data. pn:${pn} city:${city} kd:${kd}`);
};

exports.run = getData;

二:数据存储在哪里

拉勾的分页接口返回的是json对象,那么自然是存mongoDb最简单了。

下面是mongoDb的封装:

var save=function (city,jsonObj) {
    var Db = require(‘mongodb‘).Db;
    var Server = require(‘mongodb‘).Server;

    var db = new Db(‘test‘,new Server(‘localhost‘,27017))

    db.open((err,db)=>{
        var coll = db.collection(city);
        coll.save(jsonObj,(err,r)=>{
            if(!err){
               console.log(‘save to ‘+city);
            }

            db.close();
        });

    });
};

var removeAll = function (city,callback) {
    var Db = require(‘mongodb‘).Db;
    var Server = require(‘mongodb‘).Server;

    var db = new Db(‘test‘,new Server(‘localhost‘,27017))

    db.open((err,db)=>{
        var coll = db.collection(city);
        coll.remove((err,numOfRows)=>{
            if(!err){
                console.log(`${city} collection be removed. ${numOfRows}`);
            }
            db.close();
            callback(err);
        });

    });
};

var readAll=function (city,callback) {
    var Db = require(‘mongodb‘).Db;
    var Server = require(‘mongodb‘).Server;

    var db = new Db(‘test‘,new Server(‘localhost‘,27017))

    db.open((err,db)=>{
        var coll = db.collection(city);
        var cursor = coll.find();
        cursor.toArray((err,results)=>{
            if(!err){
                callback(results);
                //db.close();
            }
            db.close();
        });
    });
}

exports.save = save;
exports.removeAll = removeAll;
exports.readAll = readAll;
 

三:如何展示数据

使用nodejs自带的httpServer,接受到请求的时候直接读取一个html文件,然后把对比的信息填入html文本里,用一个h5的chart来展示

下面是服务器的代码:

var http = require(‘http‘);
var fs = require(‘fs‘);
var stati = require(‘./statistics‘);
var szStati = {text:‘SuZhou‘};
var shStati = {text:‘ShangHai‘};

var server=new http.Server();
server.on(‘request‘,function(req,res){
    res.writeHead(200,{‘Content-Type‘:‘text/html‘});  

    fs.readFile(‘./index.html‘,‘utf8‘,(err,data)=>{
        if (err) {
            throw err;
        }
        console.log(data);
        // res.write(data);
        // res.end();
        stati.statiSalary(‘苏州‘,(results)=>{
            szStati.values = results;
            stati.statiSalary(‘上海‘,(results)=>{
                shStati.values = results;
                var series =[szStati,shStati];
                var strSeries = JSON.stringify(series);
                console.log(strSeries);

                data = data.replace(‘@series‘,strSeries);
                console.log(data);

                res.write(data);
                res.end();
            });
        });
    });
});  

server.listen(3000);
console.log(‘http server started...port:3000‘);

四:统计结果

统计按照 0-5k,5-10k,10-15k,15-20k,20-25k,>25k这几个区间按照职位的数量进行统计。

0-5k:上海是苏州的4倍

5-10k:上海是苏州的4倍

10-15k:上海是苏州的9倍

15-20k:上海是苏州的12倍

20-25k:上海是苏州的17倍

>25k:上海是苏州的26倍

可以看到从10-15k开始的职位,上海的数量是苏州的10多倍,越是高薪的职位倍数越高。由此可以看出,苏州跟上海的差距还是非常大的。苏州政府一直沾沾自喜,觉得自己在互联网圈子有多牛逼,搞了一堆孵化器,但其实拿的出手的公司有几家呢,一只手都数过来了,跟北上广深一线还是差的很远呢,还是要努力啊。

恐怕我也要背井离乡去上海的寻找未来了。

还没学会用VS Code上传到github上,先直接上传代码吧:lagouSpider.zip

时间: 2024-10-09 14:37:24

使用nodejs爬取拉勾苏州和上海的.NET职位信息的相关文章

爬取拉勾部分求职信息+Bootstrap页面显示

今天在用python实现爬虫的时候,就想看一下用c#实现同样的功能到底会多出来多少code,结果写着写着干脆把页面也简单的写一个出来,方便调试, 大致流程如下: 1.分析拉勾数据 2.查找拉勾做了哪些反爬虫限制 3.抓取数据,show page 过程中用到一个HtmlAgilityPack第三方库,获取热门城市的时候使用XPath表达式抓取数据 解析JSON使用的是JSON.NET,一如既往的好用 github:https://github.com/hxd1230/XD.Job.Spider.g

使用selenium动态渲染爬取拉勾网上450个java职位的信息

开始这个小项目的时候要确保你的电脑中有装上selenium以及相应的浏览器驱动,还有别忘了Mongodb数据库 我们首先打开拉勾网的官网查看下基本的页面元素 当我在搜索框中输入java的时候,url如下,当我想用下面的url进行抓取的时候,我发现事情并不简单. 我点击下一页的时候发现,url并没有变化,所以并不能用最基本的抓取方法了,而改为ajax请求进行抓取 当我查看ajax请求的时候,发现事情又不简单的了,这个分页的请求带的参数时Form data,也就是表单形式的参数, 所以,拉勾网上的a

爬取拉钩全站的职位信息

爬虫学习到今天也告一段落了,利用一个项目把自己这几个月的所学的知识来做一次总结 项目所需要的知识比较全面,很适合练手, 一 程序目的 爬取拉钩全站的职位信息存入mysql和mongodb中 二 所用到的方法 一 利用selenium登录拉钩取得cookies 二 利用redis保存selenium登录拉钩取得cookies信息,维护一个cookie池 三 爬取西刺等免费IP网站,并用redis维护一个IP池 四 利用flask把cookies和ip分别映射到网页中,用requsets得到. 五

selelinum+PhantomJS 爬取拉钩网职位

使用selenium+PhantomJS爬取拉钩网职位信息,保存在csv文件至本地磁盘 拉钩网的职位页面,点击下一页,职位信息加载,但是浏览器的url的不变,说明数据不是发送get请求得到的. 我们不去寻找它的API.这里使用另一种方式:使用PhantomJS模拟浏览,通过单击页面获取下一页. 这里的PhantomJS是一个没有界面的浏览器. 1 from selenium import webdriver 2 import time 3 import random 4 5 from selen

【爬虫问题】爬取tv.sohu.com的页面, 提取视频相关信息

尝试解决下面的问题 问题: 爬取tv.sohu.com的页面, 提取视频相关信息,不可用爬虫框架完成 何为视频i关信息?属性有哪些? 需求: 做到最大可能的页面覆盖率 *使用httpClient 模拟获取页面HtmlText源码信息,正则出源码视频URL解析类HtmlText2URLlist.ashx. 正则式:href=\"(.*?)\" 选择重要的信息进行存储 选择合适的数据存储方式,便于后续使用 数据库字段 ID.URL.IsSuccess.Title.Isdelete.Vide

爬取赶集网二手物品下所有物品的信息

四周爬虫课第二周的练习,爬取赶集网二手物品下所有物品的信息.大致思路:1.爬取频道页url:2.爬取商品详情页url,写入mongodb,url_list表:3.从url_list表读取url,爬取商品信息,写入mongodb,p_info表 分成3个py文件:1.channel_url.py,获取频道页url:2.page_parse.py,主要是2个爬虫函数,分别完成2个数据表的写入:3.main.py,主程序文件,也就是本文件,开启多进程,完成整个工作 最后顺利完成任务,感觉现在赶集真不行

nodejs爬取博客园的博文

其实写这篇文章,我是很忐忑的,因为爬取的内容就是博客园的,万一哪个顽皮的小伙伴拿去干坏事,我岂不成共犯了? 好了,进入主题. 首先,爬虫需要用到的模块有: express ejs superagent (nodejs里一个非常方便的客户端请求代理模块) cheerio (nodejs版的jQuery) 前台布局使用bootstrap 分页插件使用 twbsPagination.js 完整的爬虫代码,在我的github中可以下载.主要的逻辑代码在 router.js 中. 1. 爬取某个栏目第1页

使用nodejs爬取和讯网高管增减持数据

为了抓取和讯网高管增减持的数据,首先得分析一下数据的来源: 网址: http://stockdata.stock.hexun.com/ggzjc/history.shtml 使用chrome开发者工具,可以发现在切换到第二页时,浏览器向下述地址发起了网络访问请求: http://stockdata.stock.hexun.com/ggzjc/data/ChangeHistory.aspx?count=30&page=2&callback=hxbase_json5 分析一下上述链接, cou

21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)

6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time class LagouSpider(object): def __init__(self): self.driver = webdriver.Chrome() #python职位 self.url = 'https://www.lagou.com/jobs/list_python?labelWords