python3小项目——爬取智联招聘信息(二)
这两天,心血来潮又把前几天的爬取招聘信息程序丰富了一下,是对爬取到的信息再处理以及分类保存。
具体功能:
将全部信息保存成矩阵形式,去除无用信息,并在当前目录下生成文件夹并此文件夹下把信息分类保存成.csv格式
#删除除"公司规模": "20人以下", "20-99人"; "最低学历": "博士","大专"; "经验": "3-5年","5-10年", "10年以上"的情况
根据公司性质分类保存信息。
具体问题及解决方法:
1、筛选数据
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上高手太多了,希望能得到他们评论指教。
上一篇: iOS 设置pch文件的相对路径