懒人了解BOSS直聘职位信息

爬虫功能介绍

此项目主要用于爬取BOSS直聘网的职位,薪资,学历,任职要求,爬取的内容用myql存储
可以输入爬取职位,爬取页数,爬取一页的时间大概需要2秒
利用了多个useraget和cookie做测试,测试反扒策略

1、分析页面url

https://www.zhipin.com/c100010000/?query=Java&page=2

请求的url= https://www.zhipin.com/c100010000/
请求的参数=query=Java&page=2
页面跳转为 page+1
单页最大page = 10 //未登录的情况下

2、根据你要获取的信息发送请求

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "github.com/garyburd/redigo/redis"
     _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
    "io/ioutil"
    "log"
    "math/rand"
    "net/http"
    "os"
    "strconv"
    "time"
)
// 公司介绍
type CompanyStruct struct{
    JobLind string `db:"招聘者"`
    CompanyInfo string `db:"公司信息"`
    JobType string `db:"工作类型"`
    ForCompany string `db:"招聘公司"`
    InLand string `db:"在何地招聘"`
    Mania string `db:"薪资范畴"`
}

var (

    //__zp_stoken__="9a3dBF3MCmyPZ4Zs9eRYGXGUR-Ugs3h8Pz03%2FrBtAtNgB67REb52tBBbLpjxcmw7ZppohumsjJF79M4BFI5NcaRf4uw%3D%3D";
    //__zp_stoken__="9a3dBF3MCmyPZ4Zs9eRYGXGUR-Qbi93bx3nbc%2Beassyi2tITP4L7hUXliwMp6lk%2BvoQ%2FvUQqVi9TOpzj7WVQNCviT1g%3D%3D"
    Url = `https://www.zhipin.com/c100010000/?query=web&page=1`
    Cookies = `Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a="1571451828";Hm_lvt_194df3105ad7148dcf2b98a91b5e727a="1571459326,1571405292";__zp_stoken__="9a3dBF3MCmyPZ4Zs9eRYGXGURUgs3h8Pz03%2FrBtAtNgB67REb52tBBbLpjxcmw7ZppohumsjJF79M4BFI5NcaRf4uw%3D%3D";__a="87719411.1571405292.1571405292.1571451826.31.2.13.31";__l="l=%2Fwww.zhipin.com%2Fweb%2Fcommon%2Fsecurity-check.html%3Fseed%3Dhh1Zsbm2A%252F%252BeXJf4gqJS9CbEi5ue7LIi93osZZEXcbQ%253D%26name%3D9205702c%26ts%3D1571451825250%26callbackUrl%3D%252Fc101010100%252F%253Fquery%253Dweb%2525E5%252589%25258D%2525E7%2525AB%2525AF%2526industry%253D%2526position%253D%2526ka%253Dhot-position-4%26srcReferer%3D&r=&friend_source=0&friend_source=0";__c="1571451826";__g="-";lastCity="101010100";`
    PyCookie = `__a=87719411.1571405292.1571571431.1571573191.78.4.13.78;__c=1571573191;__g=-;__l=l=%2Fwww.zhipin.com%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0;__zp_stoken__=ab17gAKyCiVPXoKZouYVWxVmXuy2kQJQJ%2F6uuhUOaDa%2BRZ9ZvxqNAl4vkQlWuQeuD8AI2%2BFzigw0Rn8u8aG0SRQwTQ%3D%3D;Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1571573763;Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1571400558,1571451828,1571571431,1571573191;lastCity=101010100;`
    WebCookie = `__a=87719411.1571405292.1571571431.1571573191.96.4.31.96;__c=1571573191;__g=-;__l=l=%2Fwww.zhipin.com%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0;__zp_stoken__=ab17gAKyCiVPXoKZouYVWxVmXs0qmerbaXOj2SvOTZ3F0nykSLMt6yXjKQvmT6cRx9D0lX6rj9G1mFFcm7bmxmRuzA%3D%3D;Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1571581244;Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1571400558,1571451828,1571571431,1571573191;lastCity=101010100;`
    Dir = "C:/Users/12161/Desktop/env_m/go/src/apiserver/GOspider/BossZhiPin/"
    UserAgentList = []string{"Mozilla/5.0 (compatible, MSIE 10.0, Windows NT, DigExt)",
        "Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, 360SE)",
        "Mozilla/4.0 (compatible, MSIE 8.0, Windows NT 6.0, Trident/4.0)",
        "Mozilla/5.0 (compatible, MSIE 9.0, Windows NT 6.1, Trident/5.0,",
        "Opera/9.80 (Windows NT 6.1, U, en) Presto/2.8.131 Version/11.11",
        "Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, TencentTraveler 4.0)",
        "Mozilla/5.0 (Windows, U, Windows NT 6.1, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
        "Mozilla/5.0 (Macintosh, Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
        "Mozilla/5.0 (Macintosh, U, Intel Mac OS X 10_6_8, en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
        "Mozilla/5.0 (Linux, U, Android 3.0, en-us, Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
        "Mozilla/5.0 (iPad, U, CPU OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
        "Mozilla/4.0 (compatible, MSIE 7.0, Windows NT 5.1, Trident/4.0, SE 2.X MetaSr 1.0, SE 2.X MetaSr 1.0, .NET CLR 2.0.50727, SE 2.X MetaSr 1.0)",
        "Mozilla/5.0 (iPhone, U, CPU iPhone OS 4_3_3 like Mac OS X, en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
        "MQQBrowser/26 Mozilla/5.0 (Linux, U, Android 2.3.7, zh-cn, MB200 Build/GRJ22, CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"}

    )

//从上面列表中获取一个User-Agent
func GetRandomUserAgent() string {
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    return UserAgentList[r.Intn(len(UserAgentList))]
}

// 下载基础的html
func GetBaseHtml(url string, dir string ,cookies string) (err error) {
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Add("Cookie", cookies)
    req.Header.Add("User-Agent", GetRandomUserAgent())
    req.Header.Add("Accept", "*/*")
    req.Header.Add("Cache-Control", "no-cache")
    req.Header.Add("Postman-Token", "6de4691b-9ff1-49f1-b702-e1af878a8941,33aac300-f20d-4e5c-b3f2-99977fc88286")
    req.Header.Add("Host", "www.zhipin.com")
    req.Header.Add("Accept-Encoding", "text/html")
    req.Header.Add("Connection", "keep-alive")
    req.Header.Add("cache-control", "no-cache")
    res, _ := http.DefaultClient.Do(req)
    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)
    err = ioutil.WriteFile(dir, body, 0644)
    <-time.After(time.Second*2)
    return err
}
// 得到一批html文件
func mainGetBaseHtml(n int ,cookies string){
    for i:=1;i<n+1; i++{
        url := Url + strconv.Itoa(i)
        dir_info := Dir + strconv.Itoa(1000+i)+".html"
        err := GetBaseHtml(url, dir_info,cookies)
        if err !=nil{
            log.Fatal(err)
        }
        fmt.Println("di --- " ,i)
    }
}

3、根据返回的数据进行数据处理

...

// 获取页面信息切片 这里分析页面了html结构,根据标签class选择关键字
func GetHtmlSlice(Dir string) (Ctt []CompanyStruct) {
    f, err := os.Open(Dir)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()
    doc, err := goquery.NewDocumentFromReader(f)
    if err != nil {
        log.Fatal(err)
    }
    // use the goquery document...
    doc.Find(".job-primary").Each(func(i int, cs *goquery.Selection) {
        companyStruct := CompanyStruct{}
        cs.Find(".info-primary").Each(func(i1 int, cs1 *goquery.Selection){
            text := cs1.Find(".job-title").Text()
            companyStruct.JobType=text
            s := cs1.Find(".red").Text()
            companyStruct.Mania=s
            i2 := cs1.Find("p").Text()
            companyStruct.InLand=i2
        })
        cs.Find(".info-company").Each(func(i1 int, cs1 *goquery.Selection){
            company1 := cs1.Find("h3 a").Text()
            i2 := cs1.Find("p").Text()
            companyStruct.ForCompany=company1
            companyStruct.CompanyInfo=i2
        })
        cs.Find(".info-publis").Each(func(i1 int, cs1 *goquery.Selection){
            text := cs1.Find("h3").Text()
            companyStruct.JobLind=text
        })
        structs := append(Ctt, companyStruct)
        Ctt = structs
    })
    return Ctt
}

4、数据处理后存储

...

//解析切片数据存入redis 省略

//解析切片存入mysql
func mainSetMysql(n int){
    db, err := sqlx.Open("mysql", "root:123123@tcp(192.168.1.196:3306)/Spider")
    if err !=nil{
        db.Close()
        log.Fatal(`sqlx.Open("mysql", "root:123123@tcp(192.168.1.196:3306)/Spider")`)}

    for i:=1;i<n+1; i++ {
        dir_info := Dir + strconv.Itoa(1000+i) + ".html"
        Ctt := GetHtmlSlice(dir_info)
        for _,v:= range Ctt{
            var(joblind = v.JobLind
                cominfo = v.CompanyInfo
                jobtype=v.JobType
                forcompany=v.ForCompany
                inland=v.InLand
                mania=v.Mania)
            result, err := db.Exec("insert into Spider.boosszhipin(招聘者, 公司信息, 工作类型, 招聘公司, 在何地招聘, 薪资范畴) values (?,?,?,?,?,?)", joblind, cominfo, jobtype, forcompany, inland, mania)
            if err!=nil{ log.Fatal(`"db.Exec("insert into Spider.boosszhipin(招聘者, 公司信息, 工作类型, 招聘公司, 在何地..."`,err)}
            fmt.Println(result.LastInsertId())
        }
    }

}

func main(){
    //mainGetBaseHtml(10,WebCookie)
    //mainSetRidsData(5)
    mainSetMysql(12)
    
}

5、数据展示

...
*************************** 206. row ***************************
             id: 206
      招聘者: 任先生招聘者
   公司信息: 计算机服务不需要融资0-20人
   工作类型: web前端
   招聘公司: 驰宇科技
在何地招聘: 石家庄  经验不限大专
   薪资范畴: 2-5K
*************************** 207. row ***************************
             id: 207
      招聘者: 林先生招聘者
   公司信息: 互联网已上市10000人以上
   工作类型: web 前端开发工程师
   招聘公司: 好未来
在何地招聘: 深圳 南山区 科技园3-5年本科
   薪资范畴: 15-30K
*************************** 208. row ***************************
             id: 208
      招聘者: 梁先生人事
   公司信息: 互联网天使轮20-99人
   工作类型: Web前端
   招聘公司: 安徽九广全景科技
在何地招聘: 合肥  1-3年大专
   薪资范畴: 7-8K
*************************** 209. row ***************************
             id: 209
      招聘者: 刘先生IT技术架构
   公司信息: 通信/网络设备已上市10000人以上
   工作类型: Web前端工程师
   招聘公司: 中兴通讯股份有限公司
在何地招聘: 长沙 岳麓区 麓谷西3-5年本科
   薪资范畴: 9-14K·14薪
209 rows in set (0.00 sec)

MariaDB [Spider]> 
MariaDB [Spider]> select 招聘者,在何地招聘,工作类型,薪资范畴 from boosszhipin;
+---------------------------------------------+----------------------------------------------------+-----------------------------------------+---------------+
| 招聘者                                      | 在何地招聘                                         | 工作类型                                | 薪资范畴      |
+---------------------------------------------+----------------------------------------------------+-----------------------------------------+---------------+
| 常先生高级软件工程师                        | 西安  3-5年本科                                    | Python                                  | 15-30K        |
| 郭女士招聘者                                | 东莞  1-3年本科                                    | Python                                  | 8-13K         |
| 谢先生招聘专员                              | 东莞  经验不限本科                                 | Python                                  | 9-13K         |
| 付女士人事                                  | 长沙 岳麓区 麓谷3-5年大专                          | python                                  | 10-15K        |
| 高女士HR                                    | 杭州 滨江区 长河1-3年本科                          | Python                                  | 10-15K        |
| 李女士HR                                    | 西安 长安区 王寺3-5年本科                          | Python                                  | 9-14K         |
| 杨先生招聘者                                | 成都 金牛区 中海国际3-5年大专                      | Python导师                              | 15-30K        |
| 李女士招聘主管                              | 北京 东城区 磁器口5-10年本科                       | Python讲师                              | 15-30K        |
| 侯女士招聘  经理                            | 天津 东丽区 军粮城5-10年本科                       | python                                  | 10-15K        |
| 开发                                        | 武汉 江夏区 光谷东3-5年本科                        | Python                                  | 15-30K·14薪   |
| 巩先生运维经理                              | 南京 雨花台区 宁南3-5年本科                        | Python                                  | 15-30K        |

总结

反扒策略不止于此,不解决反扒策略考虑多协程也没用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345