練習: bs4 簡單爬取 + matplotlib 折線圖顯示 (關鍵詞,職位數量、起薪)

要看一種技術在本地的流行程度,最簡單的就是找招聘網站按關鍵詞搜索。php

好比今天查到的職位數量是vue 1296個,react 1204個,angular 721個。國際上比較流行的是react,本地市場中vue倒更受歡迎。因此學習的話能夠先考慮前兩個。前端

好比咱們能夠功利化一點:某些語言的薪資中值比較低,或者某些語言職位數比較少,那麼咱們作作比較,去學點別的嗎。vue

 

 


分爲兩步,第一步爬取並保存成文本文件;第二步讀取和解析文本文件顯示折線圖。(數據存在本地更好,省得頻繁扒着玩,對方網站恨我。因此分爲兩步)python

 

第一個文件:react

按關鍵詞,扒取頁面 https://sou.zhaopin.com/jobs/searchresult.ashx?jl=北京 json

按薪資區間分爲幾擋:1~6000,  6001~12000,  12001~20000,  20001~30000,  30001~99999app

# -*- 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


# 1、查詢關鍵詞
word000 = "前端,python" #限最多6個值,中間半角逗號分隔
#word000 = "前端,python,php"
words = word000.split(",")


# 2、工資區間(最小值爲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)


# 3、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()

 

 

寫在後面:url

可能會有些小bug,不作處理了:

好比colornames顏色我只設了6個,y軸最大值才設了5000,

折線圖的x軸,表明的是起薪點。理想的應該是薪資區間的中值。

 

..

相關文章
相關標籤/搜索