社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python拉勾网数据采集与可视化

Python中文社区 • 7 年前 • 794 次点击  

Python中文社区

Python中文开发者的

精神部落


全文简介

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

爬虫部分

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

真实网址是:

https://www.lagou.com/jobs/positionAjax.jsonneedAddtionalResult=false&isSchoolJob=0

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

代码实现

  1. import requests # 网络请求

  2. import re

  3. import time

  4. import random

  5. # post的网址

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

  7. # 反爬措施

  8. header = {'Host': 'www.lagou.com',

  9. 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',

  10. 'Accept': 'application/json, text/javascript, */*; q=0.01',

  11. 'Accept-Language': 'zh-CN,en-US;q=0.7,en;q=0.3',

  12. 'Accept-Encoding': 'gzip, deflate, br',

  13. 'Referer': 'https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput=',

  14. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',

  15. 'X-Requested-With': 'XMLHttpRequest',

  16. 'X-Anit-Forge-Token': 'None',

  17. 'X-Anit-Forge-Code': '0',

  18. 'Content-Length': '26',

  19. 'Cookie': 'user_trace_token=20171103191801-9206e24f-9ca2-40ab-95a3-23947c0b972a; _ga=GA1.2.545192972.1509707889; LGUID=20171103191805-a9838dac-c088-11e7-9704-5254005c3644; JSESSIONID=ABAAABAACDBABJB2EE720304E451B2CEFA1723CE83F19CC; _gat=1; LGSID=20171228225143-9edb51dd-ebde-11e7-b670-525400f775ce; PRE_UTM=; PRE_HOST=www.baidu.com; PRE_SITE=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DKkJPgBHAnny1nUKaLpx2oDfUXv9ItIF3kBAWM2-fDNu%26ck%3D3065.1.126.376.140.374.139.129%26shh%3Dwww.baidu.com%26sht%3Dmonline_3_dg%26wd%3D%26eqid%3Db0ec59d100013c7f000000055a4504f6; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; LGRID=20171228225224-b6cc7abd-ebde-11e7-9f67-5254005c3644; index_location_city=%E5%85%A8%E5%9B%BD; TG-TRACK-CODE=index_search; SEARCH_ID=3ec21cea985a4a5fa2ab279d868560c8',

  20. 'Connection': 'keep-alive',

  21. 'Pragma': 'no-cache',

  22. 'Cache-Control': 'no-cache'}

  23. for n in range(30):

  24.    # 要提交的数据

  25.    form = {'first':'false',

  26.            'kd':'Python',

  27.            'pn':str(n)}

  28.    time.sleep(random.randint(2,5))

  29.    # 提交数据

  30.    html = requests.post(url,data=form,headers = header)

  31.    # 提取数据

  32.    data = re.findall('{"companyId":.*?,"positionName":"(.*?)","workYear":"(.*?)","education":"(.*?)","jobNature":"(.*?)","financeStage":"(.*?)","companyLogo":".*?","industryField":".*?","city":"(.*?)","salary":"(.*?)","positionId":.*?,"positionAdvantage":"(.*?)","companyShortName":"(.*?)","district"',html.text)

  33.    # 转换成数据框

  34.    data = pd.DataFrame(data)

  35.    # 保存在本地

  36.    data.to_csv(r'D:\Windows 7 Documents\Desktop\My\LaGouDataMatlab.csv',header = False, index = False, mode = 'a+')

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

数据可视化

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

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

导入模块并配置绘图风格

  1. import pandas as pd # 数据框操作

  2. import numpy as np

  3. import matplotlib.pyplot as plt # 绘图

  4. import jieba # 分词

  5. from wordcloud import WordCloud # 词云可视化

  6. import matplotlib as mpl  # 配置字体

  7. from pyecharts import Geo # 地理图

  8. mpl.rcParams["font.sans-serif"] = ["Microsoft YaHei"]

  9. # 配置绘图风格

  10. plt.rcParams["axes.labelsize"] = 16.  

  11. plt.rcParams["xtick.labelsize"] = 14.

  12. plt.rcParams["ytick.labelsize"] = 14.

  13. plt.rcParams["legend.fontsize"] = 12.

  14. plt.rcParams["figure.figsize"] = [15., 15.]

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

数据预览

  1. # 导入数据

  2. data = pd.read_csv('D:\\Windows 7 Documents\\Desktop\\My\\LaGouDataPython.csv',encoding='gbk')  # 导入数据

  3. data.head()

read_csv路径不要带有中文

  1. data.tail()

学历要求

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

  2. plt.show()

工作经验

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

  2. plt.show()

Python热门岗位

  1. final = ''  

  2. stopwords = ['PYTHON','python','Python','工程师','(',')','/'] # 停止词

  3. for n in range(data.shape[0]):

  4.    seg_list = list(jieba.cut(data['岗位职称'][n]))

  5.    for seg in seg_list:  

  6.        if seg not in stopwords:  

  7.                final = final + seg + ' '

  8. # final 得到的词汇

工作地点

  1. data['工作地点'].value_counts().plot(kind='pie',autopct='%1.2f%%',explode = np.linspace(0,1.5,25))

  2. plt.show()

工作地理图

  1. # 提取数据框

  2. data2 = list(map(lambda x:(data['工作地点'][x], eval(re.split('k|K',data['工资'][x])[0])*1000),range(len(data))))

  3. # 提取价格信息

  4. data3 = pd.DataFrame(data2)

  5. # 转化成Geo需要的格式

  6. data4 = list(map(lambda x:(data3.groupby(0).mean()[1].index[x],data3.groupby(0).mean()[1].values[x]),range(len(data3.groupby(0)))))

  7. # 地理位置展示

  8. geo = Geo("全国Python工资布局", "制作人:挖掘机小王子", title_color="#fff", title_pos="left", width=1200, height=600,

  9. background_color='#404a59')

  10. attr, value = geo.cast(data4)

  11. geo.add("", attr, value, type="heatmap", is_visualmap=True, visual_range=[0, 300], visual_text_color='#fff')

  12. # 中国地图Python工资,此分布是最低薪资

  13. geo

本文作者

挖掘机小王子,数据分析爱好者。

博客:zhihu.com/people/WaJueJiPrince

跳槽季来临,点击下方阅读原文,参加


求职备战全攻略——从简历到面试


课程中包含腾讯、阿里、京东、大疆等大厂大牛经验分享。

讲师:Lee,毕业于香港中文大学,曾在农业银行、腾讯等公司工作,多次创业经验,为30万人提供全面求职资讯与服务,帮助小白实习生相继进入腾讯、阿里、网易、大疆、顺丰等知名企业工作。


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/1ZIGSa07QF
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/8206
 
794 次点击