我是靠谱客的博主 飘逸未来,最近开发中收集的这篇文章主要介绍练习: bs4 简单爬取 + matplotlib 折线图显示 (关键词,职位数量、起薪),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

练习: bs4 简单爬取 + matplotlib 折线图显示 (关键词,职位数量、起薪)

要看一种技术在本地的流行程度,最简单的就是找招聘网站按关键词搜索。

比如今天查到的职位数量是vue 1296个,react 1204个,angular 721个。国际上比较流行的是react,本地市场中vue倒更受欢迎。所以学习的话可以先考虑前两个。

比如我们可以功利化一点:某些语言的薪资中值比较低,或者某些语言职位数比较少,那么我们做做比较,去学点别的吗。

 

 


分为两步,第一步爬取并保存成文本文件;第二步读取和解析文本文件显示折线图。(数据存在本地更好,免得频繁扒着玩,对方网站恨我。所以分为两步)

 

第一个文件:

按关键词,扒取页面 https://sou.zhaopin.com/jobs/searchresult.ashx?jl=北京 

按薪资区间分为几挡:1~6000,  6001~12000,  12001~20000,  20001~30000,  30001~99999

# -*- coding: utf-8 -*-
# coding=utf-8
import requests
import bs4
import urllib
def getPageTxt(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
r = requests.get(url, headers=headers)
soup = bs4.BeautifulSoup(r.content.decode("utf-8"), "lxml")
mylist = soup.select('.search_yx_tj em')
counts = mylist[0].text
return counts
def getUrl(word, moneymin=0, moneymax=99999):
url = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=北京&kw="
url += word + "&p=1&isadv=0&isfilter=1&sf=" + str(moneymin) + "&st=" + str(moneymax)
return url
# 一、查询关键词
word000 = "前端,python" #限最多6个值,中间半角逗号分隔
#word000 = "前端,python,php"
words = word000.split(",")
# 二、工资区间(最小值为0,最大值为99999)
moneys = [0, 6000, 12000, 20000, 30000, 99999]
money_min = list(map(lambda x: x+1, moneys[:-1]))
#[1, 6001, 12001, 20001, 30001]
money_max = list(map(lambda x: x, moneys[1:]))
#[6000, 12000, 20000, 30000, 99999]
print(money_min)
print(money_max)
# 三、url拼串,扒取页面,生成字典文件
'''
字典文件的结构为:(counts是职位数量,startmoney是起薪。这两个list,后面将用于生成折线图)
[
{'key': '前端', 'counts': [1105, 4485, 4394, 1549, 393], 'startmoney': [1, 6001, 12001, 20001, 30001]},
{'key': 'python', 'counts': [700, 2945, 4467, 2454, 984], 'startmoney': [1, 6001, 12001, 20001, 30001]}
]
'''
ulist = []
for word in words:
li = {}
counts = []
for k in money_min:
idx = money_min.index(k)
# 索引
url = getUrl(word, money_min[idx], money_max[idx])
# 拼串
counts.append(int(getPageTxt(url)))
# 扒取
,并转换为数字,存入counts列表
li["key"] = word
li["counts"] = counts
li["startmoney"] = money_min
ulist.append(li)
print(ulist)
f = open("counts000.txt", "w")
f.write(str(ulist))
f.close()

 

 

 

第二个文件:

注意这里有个坑:json载入的字符串,必须是双引号

# -*- coding: utf-8 -*-
# coding=utf-8
import json
f = open('counts000.txt', 'r+')
ulliststring = f.read()
f.close()
ulliststring = ulliststring.replace("'", '"')
# 注意这里有个坑!!
json的标准格式:要求必须 只能使用双引号作为键 或者 值的边界符号,不能使用单引号,而且“键”必须使用边界符(双引号)
ullist = json.loads(ulliststring)
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['font.sans-serif'] = ['SimHei']# 为了能显示中文(而不是显示一个框)
matplotlib.rcParams['font.family']='sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False
# 为了能显示负号(而不是显示一个框)

colornames = ['#ff0000', '#ccee00', '#00aa00','#0000ff', '#9900ff', '#ff0099']
plt.title('bj薪资、职位数量折线表', color='#ff33a0')
plt.xlabel('薪资区间')
# 设置X坐标轴标题
plt.ylabel('职位数量')
# 设置Y坐标轴表
plt.xlim(0, 35000)
# 设置坐标轴的范围
plt.ylim(0, 5000)
# plt.xticks([2,4])#设置x轴的标签间隔
# plt.yticks([4,16])#设置y轴的标签间隔

i = 0
for li in ullist:
x = li["startmoney"]
y = li["counts"]
plt.plot(x, y, colornames[i])
i += 1
plt.show()

 

 

写在后面:

可能会有些小bug,不做处理了:

比如colornames颜色我只设了6个,y轴最大值才设了5000,

折线图的x轴,代表的是起薪点。理想的应该是薪资区间的中值。

 

..

 

posted on 2018-01-12 01:03 bjhhh 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/qq21270/p/8271607.html

最后

以上就是飘逸未来为你收集整理的练习: bs4 简单爬取 + matplotlib 折线图显示 (关键词,职位数量、起薪)的全部内容,希望文章能够帮你解决练习: bs4 简单爬取 + matplotlib 折线图显示 (关键词,职位数量、起薪)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部