全文简介

本文是先采集拉勾网上面的数据,采集的是Python岗位的数据,然后用Python进行可视化。主要涉及的是爬虫&数据可视化的知识。

爬虫部分

先用Python来抓取拉勾网上面的数据,采用的是简单好用的requests模块。主要注意的地方是,拉勾网属于动态网页,所以会用到浏览器的F12开发者工具进行抓包。抓包以后会发现,其实网页是一个POST的形式,所以要提交数据,提交的数据如下图:

Python拉钩数据  让数据可视化_数据

真实网址是:​​https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false&isSchoolJob=0​

在上图也可以轻松发现:kd是查询关键词,pn是页数,可以实现翻页。

代码实现

# encoding: utf-8
# @author: erlang
# @file: 123456.py
# @time: 2018/7/5 21:33
# @software: PyCharm
# @version: python3.5




import requests
from bs4 import BeautifulSoup
import lxml
import json
import pandas as pd

class Lg(object):
def __init__(self):
self.url = 'https://www.lagou.com/jobs/positionAjax.json'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
'Cookie': '_ga=GA1.2.433005709.1524829433; user_trace_token=20180427194355-440b2629-4a10-11e8-a6de-525400f775ce; LGUID=20180427194355-440b2987-4a10-11e8-a6de-525400f775ce; JSESSIONID=ABAAABAAAGGABCBA409DB9CA604BFDADE54CEE282E62C07; _gid=GA1.2.929572367.1530838333; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1530838336; LGSID=20180706085218-d573503f-80b6-11e8-bee6-525400f775ce; PRE_UTM=; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3Dg7TjXc0bNzzrGff-tzOi5-KTElrDHkj_kpt2eg5geLS%26wd%3D%26eqid%3D8ba06ae900042291000000035b3ebd3c; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; index_location_city=%E5%8C%97%E4%BA%AC; TG-TRACK-CODE=search_code; _gat=1; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1530838406; LGRID=20180706085328-ff4617dd-80b6-11e8-bee6-525400f775ce; SEARCH_ID=36e7d6c0efc1476095a24fa2c0e52fdd',
'Host': 'www.lagou.com',
'Referer': 'https://www.lagou.com/jobs/list_python?px=default&city=%E5%85%A8%E5%9B%BD',
}
self.title = []
self.workYear = []
self.education = []
self.financeStage = []
self.city = []
self.salary = []
self.positionAdvantage = []
self.companyShortName = []
def get_html(self,i):
try:
params = {
'first': 'true',
'pn':str(i),
'kd': 'python',
}
response = requests.post(url=self.url,headers=self.headers,data=params)
if response.status_code == 200:
return response.text
return None
except:
print('请求错误')

def parse_html(self,html):
if html:
html_dict = json.loads(html)
data_list = html_dict['content']['positionResult']['result']

for data in data_list:
self.title.append(data.get('positionName','空'))
self.workYear.append(data.get('workYear','空'))
self.education.append(data.get('education','空'))
self.financeStage.append(data.get('financeStage','空'))
self.city.append(data.get('city','空'))
self.salary.append(data.get('salary','空'))
self.positionAdvantage.append(data.get('positionAdvantage','空'))
self.companyShortName.append(data.get('companyShortName','空'))

def write_to_csv(self):
data_form = pd.DataFrame(
{'岗位职称':self.title,
'工作经验':self.workYear,
'学历要求':self.education,
'公司发展':self.financeStage,
'工作地点':self.city,
'工资':self.salary,
'工作福利':self.positionAdvantage,
'公司名称':self.companyShortName,
})
data_form.to_csv('./heihei.csv', header=True,)



def main():
lg = Lg()
for i in range(1,30):
html = lg.get_html(i)
lg.parse_html(html)
lg.write_to_csv()
if __name__ == '__main__':
main()

 

注意:抓取数据的时候不要爬取太快,除非你有其他的反爬措施,比如更换IP等,另外不需登录,我在代码加入了time模块,用于限制爬取速度。

数据可视化

下载下来的数据长成这个样子:

Python拉钩数据  让数据可视化_数据_02

 

注意标题(也就是列明)是我自己添加的。

导入模块并配置绘图风格

import pandas as pd # 数据框操作
import numpy as np
import matplotlib.pyplot as plt # 绘图
import jieba # 分词
from wordcloud import WordCloud # 词云可视化
import matplotlib as mpl # 配置字体
from pyecharts import Geo # 地理图

mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 配置绘图风格
plt.rcParams["axes.labelsize"] = 16.
plt.rcParams["xtick.labelsize"] = 14.
plt.rcParams["ytick.labelsize"] = 14.
plt.rcParams["legend.fontsize"] = 12.
plt.rcParams["figure.figsize"] = [15., 15.]

 

注意:导入模块的时候其他都容易解决,除了wordcloud这个模块,这个模块我建议大家手动安装,如果pip安装的话,会提示你缺少C++14.0之类的错误,导致安装不上。手动下载whl文件就可以顺利安装了。

数据预览

# 导入数据
data = pd.read_csv('./heihei.csv',encoding='utf-8') #导入数据
print(data.head())
print(data.tail())

read_csv路径不要带有中文

Python拉钩数据  让数据可视化_数据_03

 

Python拉钩数据  让数据可视化_html_04

 

学历要求

data['学历要求'].value_counts().plot(kind='barh',rot=0)
plt.show()

 

Python拉钩数据  让数据可视化_数据_05

工作经验

data['工作经验'].value_counts().plot(kind='bar',rot=0,color='b')
plt.show()

  

Python拉钩数据  让数据可视化_数据_06

Python热门岗位

final = ''
stopwords = ['PYTHON','python','Python','工程师','(',')',',','/']
for n in range(data.shape[0]):
seg_list = list(jieba.cut(data['岗位职称'][n]))
for seg in seg_list:
if seg not in stopwords:
final = final + seg + ''
font = r'C:\Windows\Fonts\simfang.ttf'
# 生成词云图
my_wordcloud =WordCloud(collocations=False, font_path=font, width=1400, height=1400, margin=2,).generate(final)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()

 

Python拉钩数据  让数据可视化_html_07

工作地点

data['工作地点'].value_counts().plot(kind='pie',autopct='%1.2f%%')
plt.show()

 

Python拉钩数据  让数据可视化_python_08

工作地理图

# 提取数据框
data2 = list(map(lambda x:(data['工作地点'][x],eval(re.split('k|K',data['工资'][x])[0])*1000),range(len(data))))
# 提取价格信息
data3 = pd.DataFrame(data2)
# 转化成Geo需要的格式
data4 = list(map(lambda x:(data3.groupby(0).mean()[1].index[x],data3.groupby(0).mean()[1].values[x]),range(len(data3.groupby(0)))))
# 地理位置展示
geo = Geo("全国Python工资布局", "制作人:挖掘机小王子", title_color="#fff", title_pos="left", width=1200, height=600,
background_color='#404a59')
attr, value = geo.cast(data4)
geo.add("", attr, value, type="heatmap", is_visualmap=True, visual_range=[0, 300], visual_text_color='#fff')
# 中国地图Python工资,此分布是最低薪资
geo

Python拉钩数据  让数据可视化_数据_09