爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示、直方图展示、词云展示等并根据可视化的数据做进一步的分析,其余分析和展示读者可自行发挥和扩展包括各种分析和不同的存储方式等。。。。。

一、爬取和分析相关依赖包

Python版本: Python3.6

requests: 下载网页

math: 向上取整

time: 暂停进程

pandas:数据分析并保存为csv文件

matplotlib:绘图

pyecharts:绘图

statsmodels:统计建模

wordcloud、scipy、jieba:生成中文词云

pylab:设置画图能显示中文

在以上安装或使用过程中可能读者会遇到安装或导入失败等问题自行百度,选择依赖包的合适版本

二、分析网页结构

通过Chrome搜索'python工程师',然后右键点击检查或者F12,,使用检查功能查看网页源代码,当我们点击下一页观察浏览器的搜索栏的url并没有改变,这是因为拉勾网做了反爬虫机制, 职位信息并不在源代码里,而是保存在JSON的文件里,因此我们直接下载JSON,并使用字典方法直接读取数据.即可拿到我们想要的python职位相关的信息,

待爬取的python工程师职位信息如下:

为了能爬到我们想要的数据,我们要用程序来模拟浏览器来查看网页,所以我们在爬取的过程中会加上头信息,头信息也是我们通过分析网页获取到的,通过网页分析我们知道该请求的头信息,以及请求的信息和请求的方式是POST请求,这样我们就可以该url请求拿到我们想的数据做进一步处理

爬取网页信息代码如下:

importrequests

url= 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'

defget_json(url, num):"""从指定的url中通过requests请求携带请求头和请求体获取网页中的信息,

:return:"""url1= 'https://www.lagou.com/jobs/list_python%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=&fromSearch=true&suginput='headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36','Host': 'www.lagou.com','Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=','X-Anit-Forge-Code': '0','X-Anit-Forge-Token': 'None','X-Requested-With': 'XMLHttpRequest'}

data={'first': 'true','pn': num,'kd': 'python工程师'}

s=requests.Session()print('建立session:', s, '\n\n')

s.get(url=url1, headers=headers, timeout=3)

cookie=s.cookiesprint('获取cookie:', cookie, '\n\n')

res= requests.post(url, headers=headers, data=data, cookies=cookie, timeout=3)

res.raise_for_status()

res.encoding= 'utf-8'page_data=res.json()print('请求响应结果:', page_data, '\n\n')returnpage_dataprint(get_json(url, 1))

通过搜索我们知道每页显示15个职位,最多显示30页,通过分析网页源代码知道,可以通过JSON里读取总职位数,通过总的职位数和每页能显示的职位数.我们可以计算出总共有多少页,然后使用循环按页爬取, 最后将职位信息汇总, 写入到CSV格式的文件中.

程序运行结果如图:

爬取所有python相关职位信息如下:

三、数据清洗后入库

数据清洗其实会占用很大一部分工作,我们在这里只做一些简单的数据分析后入库。在拉勾网输入python相关的职位会有18988个。你可以根据工作中需求选择要入库的字段,并对一些字段做进一步的筛选,比如我们可以去除职位名称中为实习生的岗位,过滤指定的字段区域在我们指定区域的职位,取字段薪资的平均值,以最低值和差值的四分之一为平均值等等根据需求自由发挥

importpandas as pdimportmatplotlib.pyplot as pltimportstatsmodels.api as smfrom wordcloud importWordCloudfrom scipy.misc importimreadfrom imageio importimreadimportjiebafrom pylab importmpl#使用matplotlib能够显示中文

mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体

mpl.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题#读取数据

df = pd.read_csv('Python_development_engineer.csv', encoding='utf-8')#进行数据清洗,过滤掉实习岗位#df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)#print(df.describe())

#由于csv文件中的字符是字符串形式,先用正则表达式将字符串转化为列表,在去区间的均值

pattern = '\d+'

#print(df['工作经验'], '\n\n\n')#print(df['工作经验'].str.findall(pattern))

df['工作年限'] = df['工作经验'].str.findall(pattern)print(type(df['工作年限']), '\n\n\n')

avg_work_year=[]

count=0for i in df['工作年限']:#print('每个职位对应的工作年限',i)

#如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0

if len(i) ==0:

avg_work_year.append(0)#print('nihao')

count += 1

#如果匹配值为一个数值,那么返回该数值

elif len(i) == 1:#print('hello world')

avg_work_year.append(int(''.join(i)))

count+= 1

#如果匹配为一个区间则取平均值

else:

num_list= [int(j) for j ini]

avg_year= sum(num_list) / 2avg_work_year.append(avg_year)

count+= 1

print(count)

df['avg_work_year'] =avg_work_year#将字符串转化为列表,薪资取最低值加上区间值得25%,比较贴近现实

df['salary'] = df['薪资'].str.findall(pattern)#avg_salary_list =[]for k in df['salary']:

int_list= [int(n) for n ink]

avg_salary= int_list[0] + (int_list[1] - int_list[0]) / 4avg_salary_list.append(avg_salary)

df['月薪'] =avg_salary_list#df.to_csv('python.csv', index=False)

四、数据可视化展示

下面是对数据的可视化展示,仅以部分视图进行一些可视化的展示,如果读者想对其他字段做一些展示以及想使用不同的视图类型进行展示,请自行发挥,注:以下代码中引入的模块见最后的完整代码

1、绘制python薪资的频率直方图并保存

如果我们想看看关于互联网行业python工程师相关的岗位大家普遍薪资的一个分部区间在哪个范围,占据了多达的比例我们就可以借助matplotlib库,来将我们保存在csv文件中的数据进行可视化的展示,然我们能够更直观的看到数据的一个分部趋势

#绘制python薪资的频率直方图并保存

plt.hist(df['月薪'],bins=8,facecolor='#ff6700',edgecolor='blue') #bins是默认的条形数目

plt.xlabel('薪资(单位/千元)')

plt.ylabel('频数/频率')

plt.title('python薪资直方图')

plt.savefig('python薪资分布.jpg')

plt.show()

运行结果如下:

2、绘制python相关职位的地理位置饼状图

通过地理python职位地理位置的分部我们可以大致了解IT行业主要集中分部在哪些城市,这样也更利于我们选择地域进行选择性就业,可以获得更多的面试机会等,参数可自行调试,或根据需要添加。

#绘制饼状图并保存

city = df['城市'].value_counts()print(type(city))#print(len(city))

label =city.keys()print(label)

city_list=[]

count=0

n= 1distance=[]for i incity:

city_list.append(i)print('列表长度', len(city_list))

count+= 1

if count > 5:

n+= 0.1distance.append(n)else:

distance.append(0)

plt.pie(city_list, labels=label, labeldistance=1.2, autopct='%2.1f%%', pctdistance=0.6, shadow=True, explode=distance)

plt.axis('equal') #使饼图为正圆形

plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))

plt.savefig('python地理位置分布图.jpg')

plt.show()

运行结果如下:

3、绘制基于pyechart的城市分布柱状图

pycharts是python中调用百度基于js开发的echarts接口,也可以对数据进行各种可视化操作,更多数据可视化图形展示,可参考echarts官网:https://www.echartsjs.com/,echarts官网提供了各种实例供我们参考,如折线图、柱状图、饼图、路径图、树图等等,基于pyecharts的文档可参考以下官网:https://pyecharts.org/#/,更多用法也可自行百度网络资源

city = df['城市'].value_counts()print(type(city))print(city)#print(len(city))

keys= city.index #等价于keys = city.keys()

values =city.valuesfrom pyecharts importBar

bar= Bar("python职位的城市分布图")

bar.add("城市", keys, values)

bar.print_echarts_options()#该行只为了打印配置项,方便调试时使用

bar.render(path='a.html')

运行结果如下:

4、绘制python福利相关的词云

词云图又叫文字云,是对文本数据中出现频率较高的关键词予以视觉上的突出,形成"关键词的渲染"就类似云一样的彩色图片,从而过滤掉大量的文本信息,,使人一眼就可以领略文本数据的主要表达意思。利用jieba分词和词云生成WorldCloud(可自定义背景),下面就是对python相关职位的福利做了一个词云的展示,可以更直观的看到大多数公司的福利待遇集中在哪些地方

#绘制福利待遇的词云

text = ''

for line in df['公司福利']:if len(eval(line)) ==0:continue

else:for word ineval(line):#print(word)

text +=word

cut_word= ','.join(jieba.cut(text))

word_background= imread('公主.jpg')

cloud=WordCloud(

font_path=r'C:\Windows\Fonts\simfang.ttf',

background_color='black',

mask=word_background,

max_words=500,

max_font_size=100,

width=400,

height=800)

word_cloud=cloud.generate(cut_word)

word_cloud.to_file('福利待遇词云.png')

plt.imshow(word_cloud)

plt.axis('off')

plt.show()

运行结果如下:

五、爬虫及可视化完整代码

完整代码在下面,代码均测试可正常运行,感兴趣的小伙伴可去尝试和了解其中的使用方法,如运行或者模块安装等失败可以在评论区进行留言,让我们一同解决吧

如果你觉得对你有帮助可以点个赞哦,原创内容转载需说明出处!!!

1、爬虫完整代码

为了防止我们频繁请求一个网站被限制ip,我们在爬取每一页后选择睡一段时间,当然你也可以使用代理等其他方式自行实现

importrequestsimportmathimporttimeimportpandas as pddefget_json(url, num):"""从指定的url中通过requests请求携带请求头和请求体获取网页中的信息,

:return:"""url1= 'https://www.lagou.com/jobs/list_python%E5%BC%80%E5%8F%91%E5%B7%A5%E7%A8%8B%E5%B8%88?labelWords=&fromSearch=true&suginput='headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36','Host': 'www.lagou.com','Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=','X-Anit-Forge-Code': '0','X-Anit-Forge-Token': 'None','X-Requested-With': 'XMLHttpRequest'}

data={'first': 'true','pn': num,'kd': 'python工程师'}

s=requests.Session()print('建立session:', s, '\n\n')

s.get(url=url1, headers=headers, timeout=3)

cookie=s.cookiesprint('获取cookie:', cookie, '\n\n')

res= requests.post(url, headers=headers, data=data, cookies=cookie, timeout=3)

res.raise_for_status()

res.encoding= 'utf-8'page_data=res.json()print('请求响应结果:', page_data, '\n\n')returnpage_datadefget_page_num(count):"""计算要抓取的页数,通过在拉勾网输入关键字信息,可以发现最多显示30页信息,每页最多显示15个职位信息

:return:"""page_num= math.ceil(count / 15)if page_num > 30:return 30

else:returnpage_numdefget_page_info(jobs_list):"""获取职位

:param jobs_list:

:return:"""page_info_list=[]for i in jobs_list: #循环每一页所有职位信息

job_info =[]

job_info.append(i['companyFullName'])

job_info.append(i['companyShortName'])

job_info.append(i['companySize'])

job_info.append(i['financeStage'])

job_info.append(i['district'])

job_info.append(i['positionName'])

job_info.append(i['workYear'])

job_info.append(i['education'])

job_info.append(i['salary'])

job_info.append(i['positionAdvantage'])

job_info.append(i['industryField'])

job_info.append(i['firstType'])

job_info.append(i['companyLabelList'])

job_info.append(i['secondType'])

job_info.append(i['city'])

page_info_list.append(job_info)returnpage_info_listdefmain():

url= 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'first_page= get_json(url, 1)

total_page_count= first_page['content']['positionResult']['totalCount']

num=get_page_num(total_page_count)

total_info=[]

time.sleep(10)print("python开发相关职位总数:{},总页数为:{}".format(total_page_count, num))for num in range(1, num + 1):#获取每一页的职位相关的信息

page_data = get_json(url, num) #获取响应json

jobs_list = page_data['content']['positionResult']['result'] #获取每页的所有python相关的职位信息

page_info =get_page_info(jobs_list)print("每一页python相关的职位信息:%s" % page_info, '\n\n')

total_info+=page_infoprint('已经爬取到第{}页,职位总数为{}'.format(num, len(total_info)))

time.sleep(20)#将总数据转化为data frame再输出,然后在写入到csv各式的文件中

df = pd.DataFrame(data=total_info,

columns=['公司全名', '公司简称', '公司规模', '融资阶段', '区域', '职位名称', '工作经验', '学历要求', '薪资', '职位福利', '经营范围','职位类型', '公司福利', '第二职位类型', '城市'])#df.to_csv('Python_development_engineer.csv', index=False)

print('python相关职位信息已保存')if __name__ == '__main__':

main()

2、可视化完整代码

数据可视化涉及到matplotlib、jieba、wordcloud、pyecharts、pylab、scipy等等模块的使用,读者可以自行了解各个模块的使用方法,和其中涉及的各种参数

importpandas as pdimportmatplotlib.pyplot as pltimportstatsmodels.api as smfrom wordcloud importWordCloudfrom scipy.misc importimread#from imageio import imread

importjiebafrom pylab importmpl#使用matplotlib能够显示中文

mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体

mpl.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题#读取数据

df = pd.read_csv('Python_development_engineer.csv', encoding='utf-8')#进行数据清洗,过滤掉实习岗位#df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)#print(df.describe())

#由于csv文件中的字符是字符串形式,先用正则表达式将字符串转化为列表,在去区间的均值

pattern = '\d+'

#print(df['工作经验'], '\n\n\n')#print(df['工作经验'].str.findall(pattern))

df['工作年限'] = df['工作经验'].str.findall(pattern)print(type(df['工作年限']), '\n\n\n')

avg_work_year=[]

count=0for i in df['工作年限']:#print('每个职位对应的工作年限',i)

#如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0

if len(i) ==0:

avg_work_year.append(0)#print('nihao')

count += 1

#如果匹配值为一个数值,那么返回该数值

elif len(i) == 1:#print('hello world')

avg_work_year.append(int(''.join(i)))

count+= 1

#如果匹配为一个区间则取平均值

else:

num_list= [int(j) for j ini]

avg_year= sum(num_list) / 2avg_work_year.append(avg_year)

count+= 1

print(count)

df['avg_work_year'] =avg_work_year#将字符串转化为列表,薪资取最低值加上区间值得25%,比较贴近现实

df['salary'] = df['薪资'].str.findall(pattern)#avg_salary_list =[]for k in df['salary']:

int_list= [int(n) for n ink]

avg_salary= int_list[0] + (int_list[1] - int_list[0]) / 4avg_salary_list.append(avg_salary)

df['月薪'] =avg_salary_list#df.to_csv('python.csv', index=False)

"""1、绘制python薪资的频率直方图并保存"""plt.hist(df['月薪'], bins=8, facecolor='#ff6700', edgecolor='blue') #bins是默认的条形数目

plt.xlabel('薪资(单位/千元)')

plt.ylabel('频数/频率')

plt.title('python薪资直方图')

plt.savefig('python薪资分布.jpg')

plt.show()"""2、绘制饼状图并保存"""city= df['城市'].value_counts()print(type(city))#print(len(city))

label =city.keys()print(label)

city_list=[]

count=0

n= 1distance=[]for i incity:

city_list.append(i)print('列表长度', len(city_list))

count+= 1

if count > 5:

n+= 0.1distance.append(n)else:

distance.append(0)

plt.pie(city_list, labels=label, labeldistance=1.2, autopct='%2.1f%%', pctdistance=0.6, shadow=True, explode=distance)

plt.axis('equal') #使饼图为正圆形

plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))

plt.savefig('python地理位置分布图.jpg')

plt.show()"""3、绘制福利待遇的词云"""text= ''

for line in df['公司福利']:if len(eval(line)) ==0:continue

else:for word ineval(line):#print(word)

text +=word

cut_word= ','.join(jieba.cut(text))

word_background= imread('公主.jpg')

cloud=WordCloud(

font_path=r'C:\Windows\Fonts\simfang.ttf',

background_color='black',

mask=word_background,

max_words=500,

max_font_size=100,

width=400,

height=800)

word_cloud=cloud.generate(cut_word)

word_cloud.to_file('福利待遇词云.png')

plt.imshow(word_cloud)

plt.axis('off')

plt.show()"""4、基于pyechart的柱状图"""city= df['城市'].value_counts()print(type(city))print(city)#print(len(city))

keys= city.index #等价于keys = city.keys()

values =city.valuesfrom pyecharts importBar

bar= Bar("python职位的城市分布图")

bar.add("城市", keys, values)

bar.print_echarts_options()#该行只为了打印配置项,方便调试时使用

bar.render(path='a.html')

python爬取拉勾网职位信息_python——拉勾网信息爬取相关推荐

  1. python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息

    Python Python开发 Python语言 Python爬虫实战-抓取boss直聘招聘信息 实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Pyth ...

  2. python爬取豆瓣电影信息_Python爬虫入门 | 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

  3. python爬虫电影信息_Python爬虫入门 | 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

  4. 北京python爬虫招聘信息_Python爬虫:抓取智联招聘岗位信息和要求(基础版)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:王强 ( 想要学习Python?Python学习交流群 ...

  5. python爬取链家新房_Python爬虫项目--爬取链家热门城市新房

    本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确 ...

  6. 如何用python爬取公众号文章_Python+fiddler:爬取微信公众号的文章

    这几天师父有个小项目,挺有意思,如何使用python爬微信公众号中的新闻信息.大体流程如下.图1:流程 其实我们看到,这里并没有想象中的"智能"--依然需要手动刷公众号文章,然后才 ...

  7. python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页

    目标分析: 目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL: ...

  8. python爬取京东手机参数_python爬虫——分页爬取京东商城商品信息(手机为例)...

    1.最近刚开始学习python   写了个爬虫练习,感觉主要是得会用F12查询网站结构代码.还涉及到反爬虫,每个网站都不一样,拿到的解析出的json数据格式也不同.得有些Web知识的基础才行. htt ...

  9. python不登陆爬取淘宝数据_python登录并爬取淘宝信息代码示例

    本文主要分享关于python登录并爬取淘宝信息的相关代码,还是挺不错的,大家可以了解下. #!/usr/bin/env python # -*- coding:utf-8 -*- from selen ...

  10. python爬取电商订单_Python探索之爬取电商售卖信息代码示例

    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 下面有一个示例代码,分享给大家: #! /usr/bi ...

最新文章

  1. 中国研制量子计算机成功,中国宣布研发量子计算机,这次很可能真的要领先世界!速度太快!...
  2. 每日记载内容总结44
  3. leetcode55 跳跃游戏 秒杀所有答案
  4. LeetCode 1000. 合并石头的最低成本(区间DP)
  5. 2018年最佳深度学习书单
  6. 使用runnable创建线程
  7. linux 中网卡配置命令 ifconfig简介
  8. 编写歌唱比赛评分_甦醒丨歌唱大赛作品评分
  9. spark在集群上运行
  10. 利用SQL语言修正与撤销数据库
  11. html网页做一个打字小游戏,原生js实现的金山打字小游戏(实例代码详解)
  12. 微信小程序数据拼接_微信小程序数据处理
  13. 百度网盘目录搜索引擎
  14. 三键蓝牙音箱方案-DLT8M04S-杰力科创
  15. 【表面缺陷检测】基于yolov5的布匹表面缺陷检测(附代码和数据集)
  16. Ubuntu 4.10 (Warty Warthog,长疣的疣猪)
  17. Spring注解驱动开发学习总结8:自动装配注解@Autowire、@Resource、@Inject
  18. 偏微分方程的MATLAB解法
  19. 数据分析必备|你不得不知道的11款数据分析工具
  20. NSComboBox 使用方法

热门文章

  1. IAT HOOK、EAT HOOK和Inline Hook
  2. IOS开发之HomeKit(一)
  3. 关于我用iVX沉浸式体验了一把0代码创建电影院购票小程序这件事
  4. 二十一世纪的计算研讨会及启示
  5. Ubuntu大于2T硬盘,分区并挂载
  6. 超实用的自我规划模型 | 进击
  7. 轻松升级各路硬件,简约时尚的大容量机箱,TT挑战者H6上手
  8. 【代码重构(Refectoring)系列教程】基本型别偏执(Primitive Obsession)
  9. 多系统引导启动项详解和更改启动内核的方法
  10. 低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar...