欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python3小项目——爬取智联招聘信息(二)

程序员文章站 2022-05-09 22:58:57
...

这两天,心血来潮又把前几天的爬取招聘信息程序丰富了一下,是对爬取到的信息再处理以及分类保存。

具体功能:

将全部信息保存成矩阵形式,去除无用信息,并在当前目录下生成文件夹并此文件夹下把信息分类保存成.csv格式

 #删除除"公司规模": "20人以下", "20-99人"; "最低学历": "博士","大专"; "经验": "3-5年","5-10年", "10年以上"的情况

根据公司性质分类保存信息。

具体问题及解决方法:

1、筛选数据

利用Dataframe筛选数据

 df = df[(df.经验 != '3-5年') & (df.经验 !='5-10年') & (df.经验 !='10年以上') & (df.最低学历 !='博士') & (df.最低学历 !='大专') & (df.公司规模 != '20人以下')]

df_pri = df[df.公司性质.isin(['民营'])]:选择公司性质为 '民营' 的对象

2、保存数据

利用os模块,path = os.getcwd()获取当前目录;os.mkdir(r'{}'.format(str(city)+str(job)))  自动生成文件夹并命名

df_com.to_csv()保存成csv格式

具体代码:

# -*- coding: utf-8 -*-
"""
Created on Wed Jun  7 09:21:52 2017

@author: qiu
"""
'''
@智联招聘职位搜索与数据获取
@拉勾网 专注于互联网招聘的网站:https://www.lagou.com/ 
@拉勾网 招聘的公司较少,且大部分需要有经验的公司
@拉勾网 查找限制选择性强
@BOSS直聘 查找限制选择性强 对象大众化 http://www.zhipin.com
@猎聘 更专业的招聘网站 有专门面向学生的招聘通道 https://campus.liepin.com/
@应届生网 页面布局太烂,不建议爬取。不过有专门针对应届生的招聘会论坛等信息,确实不错 http://www.yingjiesheng.com/
@由于拉钩和猎聘职位较少,而且可以满足高精确查找,这里只提供网址,自行搜索。
***********************@智联招聘职位搜索与数据获取***************************
'''

import urllib
from urllib.parse import *
from bs4 import BeautifulSoup
import string
import random
import pandas as pd
import os


headers=["Mozilla/5.0 (Windows NT 6.1; Win64; rv:27.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
         "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:27.0) Gecko/20100101 Firfox/27.0"
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
         "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:10.0) Gecko/20100101 Firfox/10.0"
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/21.0.1180.110 Safari/537.36"
         "Mozilla/5.0 (X11; Ubuntu; Linux i686 rv:10.0) Gecko/20100101 Firfox/27.0"
         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/34.0.1838.2 Safari/537.36"
         "Mozilla/5.0 (X11; Ubuntu; Linux i686 rv:27.0) Gecko/20100101 Firfox/27.0"
         "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
         ]
def get_content(url,headsers):
    '''
    @url:需要登录的网址
    @headers:模拟的登陆的终端
    *********************模拟登陆获取网址********************
    '''
    random_header = random.choice(headers)
    req = urllib.request.Request(url)
    req.add_header("User-Agent",random_header)
    req.add_header("Get",url)
    req.add_header("Host","sou.zhaopin.com")
    req.add_header("refer","http://sou.zhaopin.com/")
    html = urllib.request.urlopen(req)
    contents = html.read()
    #判断输出内容contents是否是字节格式
    if isinstance(contents,bytes):
        #转成字符串格式
        contents=contents.decode('utf-8')
    else:
        print('输出格式正确,可以直接输出')
##输出的是字节格式,需要将字节格式解码转成’utf-8‘
    return (contents)
    
def get_content1(url,headsers):
    '''
    @url:需要登录的网址
    @headers:模拟的登陆的终端
    *********************模拟登陆获取网址********************
    '''
    random_header = random.choice(headers)
    req = urllib.request.Request(url)
    req.add_header("User-Agent",random_header)
    req.add_header("Get",url)
    req.add_header("Host","jobs.zhaopin.com")
    req.add_header("refer","http://sou.zhaopin.com/jobs/searchresult.ashx")
    html = urllib.request.urlopen(req)
    contents = html.read()
    #判断输出内容contents是否是字节格式
    if isinstance(contents,bytes):
        #转成字符串格式
        contents=contents.decode('utf-8')
    else:
        print('输出格式正确,可以直接输出')
##输出的是字节格式,需要将字节格式解码转成’utf-8‘
    return (contents)    

def get_links_from(job, city, page):
    '''
    @job:工作名称
    @city:网址中城市名称
    @page:表示第几页信息
    @urls:所有列表的超链接,即子页网址
    
    ****************此网站需要模拟登陆**********************
    返回全部子网页地址
    '''
    urls=[]
    for i in range(page):
        url = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl={}&kw={}&p={}".format(str(city),str(job),i) 
        url = quote(url, safe=string.printable)
        info = get_content(url,headers)
        soup = BeautifulSoup(info,"lxml")#设置解析器为“lxml”
        link_urls = soup.select('td.zwmc a')
        for url in link_urls:      
            urls.append(url.get('href'))
    return (urls)
    

#url = "http://s.yingjiesheng.com/result.jsp?keyword=%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98&city=217&start=0&period=0&sort=score&jobtype=1"    
#get_links_from('南京','数据挖掘', 5)
def get_link_info(url):
    '''
    @爬取的地址
    *****************获取此网站的有用信息并保存成字典形式****************
    '''    
    info = get_content1(url,headers)
    soup = BeautifulSoup(info,"lxml")#设置解析器为“lxml”
    occ_name = soup.select('div.fixed-inner-box h1')[0]
    com_name = soup.select('div.fixed-inner-box h2')[0]
    com_url = soup.select('div.inner-left.fl h2 a')[0]
    welfare = soup.select('div.welfare-tab-box')[0]
    wages = soup.select('div.terminalpage-left strong')[0]
    date = soup.select('div.terminalpage-left strong')[2]
    exper = soup.select('div.terminalpage-left strong')[4]
    num = soup.select('div.terminalpage-left strong')[6]
    area = soup.select('div.terminalpage-left strong')[1]
    nature = soup.select('div.terminalpage-left strong')[3]
    Edu = soup.select('div.terminalpage-left strong')[5]
    cate = soup.select('div.terminalpage-left strong')[7]
    com_scale = soup.select('ul.terminal-ul.clearfix li strong')[8]
    com_nature = soup.select('ul.terminal-ul.clearfix li strong')[9]
    com_cate = soup.select('ul.terminal-ul.clearfix li strong')[10]
    com_address = soup.select('ul.terminal-ul.clearfix li strong')[11]

    data = {
    "拉勾网":'https://www.lagou.com/', 
    "猎聘":"https://campus.liepin.com/",
    "应届生":"http://www.yingjiesheng.com/",
    "网址":url,
    "工作名称":occ_name.text.strip(),
    "公司名称":com_name.text,
    "公司网址":com_url.get('href'),
    "福利":welfare.text.strip(),
    "月工资":wages.text.strip(),
    "发布日期":date.text.strip(),
    "经验":exper.text.strip(),
    "人数":num.text.strip(),
    "工作地点":area.text.strip(),
    "工作性质":nature.text.strip(),
    "最低学历":Edu.text.strip(),
    "职位类别":cate.text.strip(),
    "公司规模":com_scale.text.strip(),
    "公司性质":com_nature.text.strip(),
    "公司行业":com_cate.text.strip(),
    "公司地址":com_address.text.strip()
        }
    return (data)
#url = "http://jobs.zhaopin.com/145913042250065.htm"
#get_link_info(url)
    
def get_links_all_info(job, city, page):
    '''
    @job:工作名称
    @city:网址中城市名称
    @page:表示前几页信息
    将全部信息保存成矩阵形式,去除无用信息,并在当前目录下生成文件夹并此文件夹下把信息分类保存成.csv格式
    '''
    urls = get_links_from(job, city, page)
    df = pd.DataFrame({
                         
    "网址":[],
    "工作名称":[],
    "公司名称":[],
    "公司网址":[],
    "福利":[],
    "月工资":[],
    "发布日期":[],
    "经验":[],
    "人数":[],
    "工作地点":[],
    "工作性质":[],
    "最低学历":[],
    "职位类别":[],
    "公司规模":[],
    "公司性质":[],
    "公司行业":[],
    "公司地址":[],
    "拉勾网":[], 
    "猎聘":[],
    "应届生":[]
                      })
    links = []
    for url in urls:
        if "xiaoyuan" in url:
            links.append(url)
            columns = ['校园招聘地址']
            labeled_df = pd.DataFrame(columns=columns, data=links)
            #labeled_df.to_csv('{}\{}校园招聘{}地址.csv'.format(str(city)+str(job),str(city),str(job)))
        else:
            data = get_link_info(url)        
            #print (data)
            df = df.append(data,ignore_index=True)
    return df
    
def remove_useless_info(df): 
    '''
    #删除除"公司规模": "20人以下", "20-99人"; "最低学历": "博士","大专"; "经验": "3-5年","5-10年", "10年以上"的情况
    
    @Dataframe筛选数据 http://jingyan.baidu.com/article/0eb457e508b6d303f0a90572.html
    @df: 以矩阵形式存储爬取到的数据
    定义一个列表,存储指定列类型,
    删除需要删除的类型,
    利用isin()函数保留剩下的数据 
    '''
    '''
    **************公司规模问题**************

    **************最低学历问题**************

    **************经验问题**************
    '''
    df = df[(df.经验 != '3-5年') & (df.经验 !='5-10年') & (df.经验 !='10年以上') & (df.最低学历 !='博士') & (df.最低学历 !='大专') & (df.公司规模 != '20人以下')]
    return df
def save_info(job, city, page,df):
    '''
    **************公司性质问题**************
    '''
    #print (list(df.公司性质))
    '''
    @df_pri = df[df.公司性质.isin('民营')]
    @error:
    only list-like objects are allowed to be passed to isin(), you passed a [str]
    '''
    df_pri = df[df.公司性质.isin(['民营'])]
    df_com = df[df.公司性质.isin(['上市公司'])]
    df_sta = df[df.公司性质.isin(['国企'])]
    df_fore = df[df.公司性质.isin(['外商独资'])]
    df_joint = df[df.公司性质.isin(['合资'])]
    df_Gov = df[df.公司性质.isin(['事业单位'])]
    df_stock = df[df.公司性质.isin(['股份制企业'])]
    
    #    path = "E:\研究生阶段学习\编程语言\python\python爬虫\python源\招聘资料\智联招聘\job"
    #获取当前路径
    path = os.getcwd()
    #自动生成文件夹并命名
    os.mkdir(r'{}'.format(str(city)+str(job)))
    df_pri.to_csv('{}\{}{}——民营.csv'.format(str(city)+str(job),str(city),str(job)))
    df_com.to_csv('{}\{}{}——上市公司.csv'.format(str(city)+str(job),str(city),str(job)))
    df_sta.to_csv('{}\{}{}——国企.csv'.format(str(city)+str(job),str(city),str(job)))
    df_fore.to_csv('{}\{}{}——外商独资.csv'.format(str(city)+str(job),str(city),str(job)))
    df_joint.to_csv('{}\{}{}——合资.csv'.format(str(city)+str(job),str(city),str(job)))
    df_Gov.to_csv('{}\{}{}——事业单位.csv'.format(str(city)+str(job),str(city),str(job)))
    df_stock.to_csv('{}\{}{}——股份制企业.csv'.format(str(city)+str(job),str(city),str(job)))
    
def get_recuite_info(job, city, page):
    '''
    获取招聘信息
    '''
    df = get_links_all_info(job, city, page)
    df_cleaned = remove_useless_info(df)
    save_info(job, city, page, df_cleaned)
'''
*********************获取招聘信息***************************
'''
get_recuite_info('嵌入式开发', '南京', 1)

总结:

1、这次主要是对爬取到的数据进行处理,这一块在机器学习问题中是数据预处理的内容。具体可以自行查找之一方面内容,还包括matplotlib的画图内容,可以实现数据可视化,很方便获取有用信息。

2、这一块应该还会再丰富,比如根据工资情况画图等等。但这一块只是为了学习python,为学习机器学习打基础用的。

3、有啥问题可以留言,写博客的目的,记录学习内容,更多的是供他人参考以及相互交流学习,CSDN上高手太多了,希望能得到他们评论指教。