Python
データサイエンス

indeed.comから指定条件の求人の平均給与を取得する

More than 1 year has passed since last update.

indeed.comでは給与水準とその件数を表示する項目がある。この項目を利用して平均給与を計算する。

コード

avgsalary.py
import urllib.request, urllib.parse
from bs4 import BeautifulSoup
import re, getopt, sys
import numpy as np


def avgsalary(query, location):
    query = urllib.parse.quote_plus(query)
    location = urllib.parse.quote_plus(location)
    url = "https://jp.indeed.com/%E6%B1%82%E4%BA%BA?q={}&l={}&radius=0".format(query, location)

    request = urllib.request.urlopen(url);
    soup = BeautifulSoup(request.read(), 'html.parser')
    result = soup.find(id="SALARY_rbo")
    results = result.find_all("li")
    salaries = []
    num_salaries = []
    for result in results:
        tmp  = result.a["title"]
        tmp = re.sub(',','', tmp)
        tmp = re.sub(r'([0-9]+)[^\d]+([0-9]+).*$', r'\1,\2', tmp);
        tmp = tmp.split(",")
        salaries.append(tmp[0])
        num_salaries.append(tmp[1])
    salaries = np.array(salaries).astype(np.float)
    salaries *= 10000
    num_salaries = np.array(num_salaries).astype(np.float)
    return(np.sum(salaries * num_salaries)/np.sum(num_salaries))

def main():

    try:  
        opts, args = getopt.getopt(sys.argv[1:],"q:l:", ["query", "location"]);
    except getout.GetoptError as err:
        #usage()
        sys.exit(2)

    query = ""
    location = ""
    for o, a in opts:
        if o == "-q":
            query = a
        elif o == "-l":
            location = a

    print(avgsalary(query, location))

if __name__ == "__main__":
    main()

実行

$ python avgsalary.py -l 御殿場
2312722.94887

説明

このコードは以下のことを行う。
1. BeautifulSoupを用いて給与とその件数を取得。
2. numpy配列に給与と件数を格納。
3. 平均を算出。
なお、出力されるのは年収である。

具体的な例

例えば、以下の比較は面白い。

$ python avgsalary.py -q programmer
4469298.24561
$ python avgsalary.py -q プログラマ
3116876.47306

この比較は、概ね「英語求人」と「日本語求人」の年収の違いを意味している。英語求人のほうが100万以上も年収が高いことを考えると英語がいかに重要かがわかる。ちなみに、US版のindeed.comを使えば、アメリカのプログラマの平均給与が700万円以上であることがわかる。