开发者社区> 问答> 正文

一招教你用Go语言爬虫快速精准抓取拉勾职位!!!

假如你正在找工作,那么如何有针对性的找,才可以更容易呢,比如去哪个城市,比如找什么工作等,这里就以找Go语言的工作为例,通过大数据分析下Go开发的岗位,这样才更有针对性,才可以更容易找到工作。

加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 409449315718661054.jpg

展开
收起
钉群小二 2020-01-09 10:46:59 6336 0
2 条回答
写回答
取消 提交回答
  • 不定期更新钉群圈子活动等内容

    拉勾

    这里分析以拉勾网上的数据为准,通过使用Go语言编写一个拉勾网岗位的爬虫,抓取Go语言的所有岗位,来进行分析。正好我们也是找Go语言工作,顺便用Go语言练练手。

    该爬虫比较简单,只需要根据拉勾网的搜索,然后一页页的爬取搜索结果,把结果整理成Excel输出即可。这里我们选取了岗位名称、工作地点、薪水以及招聘公司这几个元素进行爬取,收集这些信息进行分析。

    本次分析,爬取了拉勾网上所有Go语言岗位,一共30页,450个岗位进行分析,所以结果也是很有代表性的。

    工作地点

    微信图片_20200109105450.jpg

    从上图来看,450个Go语言的岗位,北京最多,占了186个,其次是上海83个,深圳52个,杭州31个,所以找Go语言的工作还是去北京、上海、深圳这些一线大城市,尤其是北京,一枝独秀,说明Go语言在北京的发展还是非常好的,学习和分享氛围也不错。

    招聘公司

    微信图片_20200109105457.jpg

    该图表选择了一些招聘Go语言岗位多的公司进行分析,发现其中最多的是瓜子二手车,一个公司发布了19个Go语言开发的岗位,估计整个公司都快转Go语言了。

    其次是滴滴公司,一共有13个在招聘Go语言的岗位,也是非常多了,看来滴滴对Go语言的推动力度很大。

    除此之外,美团、百度、UCloud以及腾讯等公司都有3-5个Go语言的岗位在招聘,说明这些公司也陆陆续续开始用Go语言做一些适合的业务。

    薪水分布

    微信图片_20200109105503.jpg

    薪水分布分析也过滤了分布比较少的区间,保留了主要的薪水区间。

    从图表上看薪水开到15K-30K的Go语言岗位有71个,是岗位最多的薪水分布;其次是15K-25K的占51个;10K-20K的有49个。基本上一个Go语言开发都是上万。

    此外,20K以上的Go语言岗位有89个,占总共450个岗位的近20%;25K以上的有31个,也占了总岗位的7%左右,比例也不算太低。

    所以从这个看,Go语言做好了,20K以上也是非常轻松,最多可以开到50K。

    经验要求

    这个我保留了,没有分析,留给大家试试,看是1-3年的多,还是3-5年的多。

    源代码

    该代码只可用于学习研究之用,不可用于其他用途。

    该爬取拉勾职位的Go语言爬虫,基于pholcus这个爬虫框架编写,是一个pholcus的爬取拉勾职位的规则库,大家使用的时候和正常的pholcus规则库是一样的,import导入引用即可。

    package main
    import(
        "github.com/henrylee2cn/pholcus/exec"
        _ "flysnow.org/hello/lib"
    )
    func main() {
        exec.DefaultRun("web")
    }
    
    

    启动使用Web的方式进行启动。启动后可以看到一个Web网页,也就是浏览器里打开 http://localhost:9090/,选择 单机模式运行,勾选左侧的拉勾规则,然后选择输出Excel格式,记得线程不要开太多,2个即可,暂停时间5000ms,防止被拉勾的反爬虫机制拦截。

    然后等待一会,就会抓取完毕,获得一个包含所有职位的Excel输出,根据这个输出的Excel结果分析即可。

    完整的拉勾爬虫规则如下:

    package lib
    // 基础包
    import (
        "github.com/henrylee2cn/pholcus/app/downloader/request" //必需
        "github.com/henrylee2cn/pholcus/common/goquery"         //DOM解析
        . "github.com/henrylee2cn/pholcus/app/spider" //必需
        "strings"
        "net/http"
    )
    //修改这个为其他岗位的,可以爬取其他岗位的数据
    const positionURL  = "https://www.lagou.com/zhaopin/go/?filterOption=3"
    func init()  {
        header.Add("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
        header.Add("Accept-Encoding","gzip, deflate, br")
        header.Add("Accept-Language","zh-CN,zh;q=0.8,en;q=0.6,fr;q=0.4,tr;q=0.2,zh-TW;q=0.2")
        header.Add("Connection","keep-alive")
        header.Add("Cookie","user_trace_token=20170910220432-f801c133-9630-11e7-8e11-525400f775ce; LGUID=20170910220432-f801c565-9630-11e7-8e11-525400f775ce; index_location_city=%E5%85%A8%E5%9B%BD; JSESSIONID=ABAAABAAADEAAFI27EBBC4DCA6B9DBD97414B0004A32D4F; TG-TRACK-CODE=index_navigation; _gat=1; PRE_UTM=; PRE_HOST=; PRE_SITE=https%3A%2F%2Fwww.lagou.com%2Fzhaopin%2Fgo%2F3%2F%3FfilterOption%3D2; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Fzhaopin%2Fgo%2F4%2F%3FfilterOption%3D3; SEARCH_ID=418a46d847344429b67029bc1470f19c; _gid=GA1.2.1008155537.1505828050; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1505052272,1505828050; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1505830015; _ga=GA1.2.319466696.1505052272; LGSID=20170919220506-8a4a46e3-9d43-11e7-99b2-525400f775ce; LGRID=20170919220655-cb047879-9d43-11e7-99b2-525400f775ce")
        header.Add("DNT","1")
        header.Add("Host","www.lagou.com")
        header.Add("Referer","https://www.lagou.com/")
        header.Add("Upgrade-Insecure-Requests","1")
        header.Add("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 9_3_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3112.113 Safari/535.36\"")
        lagou.Register()
    }
    var lagou = &Spider{
        Name:"拉勾-岗位",
        Description:"拉勾上的全部岗位【https://www.lagou.com】",
        EnableCookie:true,
        NotDefaultField:true,
        RuleTree:lagouRuleTree,
    }
    var header = http.Header{}
    var lagouRuleTree = &RuleTree{
        Root: func(ctx *Context) {
            ctx.AddQueue(&request.Request{
                Url:positionURL,
                TryTimes:10,
                Rule:"requestList",
                Header:header,
            })
        },
        Trunk:map[string]*Rule{
            "requestList":{
                ParseFunc: func(ctx *Context) {
                    header.Set("Referer",ctx.Request.Url)
                    nextSelection:=ctx.GetDom().Find("div.pager_container").Find("a").Last();
                    url,_:=nextSelection.Attr("href")
                    if len(url)!=0 && strings.HasPrefix(url,"http"){
                        ctx.AddQueue(&request.Request{
                            Url:url,
                            TryTimes:10,
                            Rule:"requestList",
                            Priority:1,
                            Header:header,
                        })
                    }
                    ctx.Parse("outputResult")
                },
            },
            "outputResult":{
                ItemFields:[]string{
                    "岗位",
                    "薪水",
                    "工作地点",
                    "公司",
                },
                ParseFunc: func(ctx *Context) {
                    dom:=ctx.GetDom()
                    dom.Find("div.list_item_top").Each(func(i int, selection *goquery.Selection) {
                        jobName:=selection.Find("div.p_top").Find("h3").Text()
                        city:=selection.Find("div.p_top").Find("em").Text()
                        city=strings.Split(city,"·")[0]
                        salay:=selection.Find("div.p_bot").Find("span.money").Text()
                        company:=selection.Find("div.company").Find("a").Text()
                        ctx.Output(map[int]interface{}{
                            0: jobName,
                            1:salay,
                            2:city,
                            3:company,
                        })
                    })
                },
            },
        },
    }
    

    原文链接

    2020-01-09 11:04:41
    赞同 展开评论 打赏
  • 不断奔跑的开发者

    所以怎么用GO呢

    2020-01-09 10:47:56
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Python第五讲——关于爬虫如何做js逆向的思路 立即下载
gohbase :HBase go客户端 立即下载
Go构建日请求千亿级微服务实践 立即下载