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

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

具体功能:

将全部信息保存成矩阵形式,去除无用信息,并在当前目录下生成文件夹并此文件夹下把信息分类保存成.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上高手太多了,希望能得到他们评论指教。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
好的,您想要了解如何使用 Python 爬取智联招聘网站上的工作岗位信息对吗? 首先,我们可以使用 Python 中的 requests 库来向智联招聘网站发送 HTTP 请求,从而获取页面内容。然后,我们可以使用 BeautifulSoup 库来解析页面内容,提取出我们需要的信息。 以下是一个示例代码,用于爬取智联招聘网站上的 Python 工程师工作岗位信息: ```python import requests from bs4 import BeautifulSoup url = 'https://fe-api.zhaopin.com/c/i/sou?pageSize=60&cityId=489&salary=0,0&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=Python&kt=3&_v=0.97530866&x-zp-page-request-id=ad1b5d3b9e3b4d2d9f0f0e6fcb3f8c1d-1626242840263-285644' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299' } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') job_list = soup.find_all('div', {'class': 'job-list'}) for job in job_list: job_name = job.find('a', {'target': '_blank', 'data-jid': True}).text.strip() job_salary = job.find('span', {'class': 'salary'}).text.strip() job_company = job.find('a', {'class': 'company-name'}).text.strip() job_location = job.find('span', {'class': 'job-area'}).text.strip() job_experience = job.find('span', {'class': 'job-exp'}).text.strip() print(job_name, job_salary, job_company, job_location, job_experience) ``` 在这个示例代码中,我们使用了 requests 库向智联招聘网站发送了一个 HTTP 请求,并设置了请求头部信息,以避免被网站识别为爬虫。然后,我们使用 BeautifulSoup 库解析了页面内容,并从中提取出了工作岗位信息。 您可以根据自己的需求修改代码中的参数和条件,以获得您需要的工作岗位信息。注意,爬取网站信息时要遵守相关法律法规和网站规定,不要过度频繁地请求网站,以免对网站造成影响。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值