当前位置:   article > 正文

Python爬虫实战 - 抓取BOSS直聘职位描述 和 数据清洗_boss直聘爬虫

boss直聘爬虫

一、抓取详细的职位描述信息

详情页分析

在这里插入图片描述

在详情页中,比较重要的就是职位描述工作地址这两个

由于在页面代码中岗位职责任职要求是在一个 div 中的,所以在抓的时候就不太好分,后续需要把这个连体婴儿,分开分析。

爬虫用到的库

使用的库有:

requests  
BeautifulSoup4  
pymongo  
  • 1
  • 2
  • 3

Python 代码

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time
from pymongo import MongoClient
headers = {
    'x-devtools-emulate-network-conditions-client-id': 5f2fc4da-c727-43c0-aad4-37fce8e3ff39,
    'upgrade-insecure-requests': 1,
    'user-agent': Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36,
    'accept': text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,
    'dnt': 1,
    'accept-encoding': gzip, deflate,
    'accept-language': zh-CN,zh;q=0.8,en;q=0.6,
    'cookie': __c=1501326829; lastCity=101020100; __g=-; __l=r=https%3A%2F%2Fwww.google.com.hk%2F&l=%2F; __a=38940428.1501326829..1501326829.20.1.20.20; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1501326839; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1502948718; __c=1501326829; lastCity=101020100; __g=-; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1501326839; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1502954829; __l=r=https%3A%2F%2Fwww.google.com.hk%2F&l=%2F; __a=38940428.1501326829..1501326829.21.1.21.21,
    'cache-control': no-cache,
    'postman-token': 76554687-c4df-0c17-7cc0-5bf3845c9831
}
conn = MongoClient('127.0.0.1', 27017)
db = conn.iApp  # 连接mydb数据库,没有则自动创建
def init():
    items = db.jobs_php.find().sort('pid')
    for item in items:
        if 'detail' in item.keys(): # 在爬虫挂掉再此爬取时,跳过已爬取的行
            continue
        detail_url = https://www.zhipin.com/job_detail/%s.html?ka=search_list_1 % item['pid']
        print(detail_url)
        html = requests.get(detail_url, headers=headers)
        if html.status_code != 200: # 爬的太快网站返回403,这时等待解封吧
            print('status_code is %d' % html.status_code)
            break
        soup = BeautifulSoup(html.text, html.parser)
        job = soup.select(.job-sec .text)
        if len(job) < 1:
            continue
        item['detail'] = job[0].text.strip()  # 职位描述
        location = soup.select(.job-sec .job-location)
        item['location'] = location[0].text.strip()  # 工作地点
        item['updated_at'] = time.strftime(%Y-%m-%d %H:%M:%S, time.localtime())  # 实时爬取时间
        res = save(item) # 保存数据
        print(res)
        time.sleep(40) # 停停停
# 保存数据到 MongoDB 中
def save(item):
    return db.jobs_php.update_one({_id: item['_id']}, {$set: item})
if __name__ == __main__:
    init()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

代码 easy,初学者都能看懂。

二、数据清洗

2.1 校正发布日期

time : 发布于03月31日,  
time : 发布于昨天,  
time : 发布于11:31,  
  • 1
  • 2
  • 3

这里拿到的都是这种格式的,所以简单处理下

import datetime
from pymongo import MongoClient
db = MongoClient('127.0.0.1', 27017).iApp
def update(data):
    return db.jobs_php.update_one({_id: data['_id']}, {$set: data})
# 把时间校正过来
def clear_time():
    items = db.jobs_php.find({})
    for item in items:
        if not item['time'].find('布于'):
            continue
        item['time'] = item['time'].replace(发布于, 2017-)
        item['time'] = item['time'].replace(月, -)
        item['time'] = item['time'].replace(日, )
        if item['time'].find(昨天) > 0:
            item['time'] = str(datetime.date.today() - datetime.timedelta(days=1))
        elif item['time'].find(:) > 0:
            item['time'] = str(datetime.date.today())
        update(item)
    print('ok')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2.2 校正薪水以数字保存

'''
salary : 5K-12K,
#处理成下面的格式
salary : {
    low : 5000,
    high : 12000,
    avg : 8500.0
},
'''
# 薪水处理成数字,符合 xk-yk 的数据处理,不符合的跳过
def clear_salary():
    items = db.jobs_lagou_php.find({})
    for item in items:
        if type(item['salary']) == type({}):
            continue
        salary_list = item['salary'].lower().replace(k, 000).split(-)
        if len(salary_list) != 2:
            print(salary_list)
            continue
        try:
            salary_list = [int(x) for x in salary_list]
        except:
            print(salary_list)
            continue
        item['salary'] = {
            'low': salary_list[0],
            'high': salary_list[1],
            'avg': (salary_list[0] + salary_list[1]) / 2
        }
        update(item)
    print('ok')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

这里在处理 Boss 直聘的数据时,比较简单正常,但是后续抓到拉勾网的数据,拉勾网的数据有些不太规范。比如有‘20k以上’这种描述

2.3 根据 工作经验年限 划分招聘等级

# 校正拉勾网工作年限描述,以 Boss直聘描述为准
def update_lagou_workyear():
    items = db.jobs_lagou_php.find({})
    for item in items:
        if item['workYear'] == '应届毕业生':
            item['workYear'] = '应届生'
        elif item['workYear'] == '1年以下':
            item['workYear'] = '1年以内'
        elif item['workYear'] == '不限':
            item['workYear'] = '经验不限'
        update_lagou(item)
    print('ok')
# 设置招聘的水平,分两次执行
def set_level():
    items = db.jobs_zhipin_php.find({})
    # items = db.jobs_lagou_php.find({})
    for item in items:
        if item['workYear'] == '应届生':
            item['level'] = 1
        elif item['workYear'] == '1年以内':
            item['level'] = 2
        elif item['workYear'] == '1-3年':
            item['level'] = 3
        elif item['workYear'] == '3-5年':
            item['level'] = 4
        elif item['workYear'] == '5-10年':
            item['level'] = 5
        elif item['workYear'] == '10年以上':
            item['level'] = 6
        elif item['workYear'] == '经验不限':
            item['level'] = 10
        update(item)
    print('ok')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

这里有点坑的就是,一般要求经验不限的岗位,需求基本都写在任职要求里了,所以为了统计的准确性,这个等级的数据,后面会被舍弃掉。

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/517004
推荐阅读
相关标签
  

闽ICP备14008679号