利用python分析2018智联招聘全国各个城市的职位数排名

新年快到了,工作了一年你,躺在床上,退下一身的疲怠,是否也曾向往去到一个新的城市工作和生活呢?

那中国除了公认的北上广深工作机会最多以外,还有那些城市也相对不错呢?

这时候我们可能会打开招聘网站开始选择城市然后来了解这个城市的职位情况.

那么一直秉持着人生苦短,我学python的我们,为什么不能用python来写一个分析2018全国各个城市的职位数排名的爬虫脚本呢?

这么一想十分可行啊,我们只需要找到一个目标招聘平台,然后通过用代码get到它的html正文,通过BeautifulSoup分析html来得到我们想要的数据,然后用matplotlib画出图表就可以了. (完整代码见本文末尾.)

于是立马动手,首先,既然我们是要分析全国范围内的所有城市的职位数,那么我们肯定首先要把所有的城市先列出来.然而这里想必地理学的再好的同学也不可能能把全国范围内所有的城市都能背下来吧,所以这一步,我们也是用python来爬取到全国范围内所有的城市名称.

1.爬取全国范围内所有的城市列表

通过一番查找,终于找到了智联上的这个页面.http://www.zhaopin.com/citymap.html

乍一看好像所有的城市名都是加粗的,右键查看一下源代码,果然,所有的城市名都被加上了<strong>标签,类似于这样

那就简单了,我们直接获取该网页所有<strong>标签里面的内容,就是标签名了.代码:

def getCitys(citys):
    urlPath = "http://www.zhaopin.com/citymap.html"
    print("开始爬取所有城市:")
    r = requests.get(urlPath)
    if r.ok:
        r.raise_for_status()
        r.encoding = 'utf-8'
        data = r.text
        print("目标url:", urlPath)
        soup = BeautifulSoup(data, 'html.parser')
        a = soup.find_all('strong')
        for i in a:
            try:
                citys.append(i.contents[0])
            except:
                continue
    else:
        print("城市获取失败!")

这样我们就获取到了所有的城市名,下一步我们就是要通过遍历这些城市名来查询某一个职业的职位数了.

2.遍历城市名,爬取对应城市的职位数.

这时候我们先打开智联的搜工作页面,输入职位名"android",地址选择"烟台",然后点击搜工作,这时候注意到,浏览器的地址栏变成了:

http://sou.zhaopin.com/jobs/searchresult.ashx?jl=烟台&kw=android&p=1&isadv=0

原来,智联的找工作这个按钮是执行了一个get请求而已,其中jl=和&kw=即分别代表要查找的城市和职位关键字,这时候先不要着急写代码,我们先来像上面说的一样来分析一下这个页面.
首先第一眼直接就找到了这样的字眼

上面赫然显示着共84个职位满足条件,一切总是那么完美,不需要多余的任何操作,仿佛传到桥头自然直一样,这不正是我们想要找的职位数吗.然后右键选择查看源代码.恩,不得不说相当完美!

但这次数据格式好像比较复杂一点,我们如果仅仅简单用<em>84</em>标签包裹的内容来获取职位数的话好像已经行不通了,因为该网页很多的地方也使用了<em>标签,那怎么办呢,这时候我们只能使用正则表达式来匹配了.

修修改改,最终的正则表达式是这样的:(?!共<em>)[0-9]+(?=</em>个职位满足条件),其中的?!和?=则是让其所在的括号内的内容不放入匹配缓冲区里.

好,接下来我们就可以结合以上的内容来写代码了.

import re
import requests

zhilianUrl = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=烟台&kw=android&p=1&isadv=0"
r = requests.get(zhilianUrl)
if r.ok:
    r.raise_for_status()
    r.encoding = 'utf-8'
    rr = r'(?!共<em>)[0-9]+(?=</em>个职位满足条件)'
    a = re.findall(rr, r.text, 0)
    print(a)
else:
    print("职位数获取失败!")

写完赶紧兴冲冲的run一下,...然而...

结果是运行没有报错也没有任何输出,左边的红色方块显示程序还在运行中,是的,它卡住了,停止运行再重新start还是会卡主,检查一下程序也没问题啊,what?辛辛苦苦才到达了这步救过竟然卡住了?这个时候我们不要着急,身为一个整天跟各种BUG打交道的程序员,一定要镇定,努力分析问题可能的原因,然后解决问题.

继续回到我们的这个问题上,排除我们程序本身的问题,会不会是对方的网站早知道我们会写python爬取,故意给我们加了限制呢?于是我们给我们的这次访问加上一个请求头试试,让我们的这次请求伪装成来自浏览器的访问.

ok,改代码,给这次get请求加上一个请求头:

import re
import requests

headers = {
    'Host': 'blog.csdn.net',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Referer': 'http://www.baidu.com',
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
}
zhilianUrl = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=烟台&kw=android&p=1&isadv=0"
r = requests.get(zhilianUrl, headers=headers)
if r.ok:
    r.raise_for_status()
    r.encoding = 'utf-8'
    rr = r'(?!共<em>)[0-9]+(?=</em>个职位满足条件)'
    a = re.findall(rr, r.text, 0)
    print(a)
else:
    print("城市获取失败!")

运行:

F:\PythonPoj\PythonLearn\venv\Scripts\python.exe F:/PythonPoj/PythonLearn/test.py
['84']

Process finished with exit code 0

果然这下就没问题了,程序瞬间就成功获取到了职位数为 84
继续改动一下程序,遍历所有的城市列表,并根据key=城市名,value=职位数的格式将所有的城市职位数都获取来存到一个字典(Dictionary)里.

def getData(citys, data):
    for city in citys:
        headers = {
            'Host': 'blog.csdn.net',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding': 'gzip, deflate',
            'Referer': 'http://www.baidu.com',
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
        }
        zhilianUrl = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl=" + city + "&kw=" + zhiwei + "&p=1&isadv=0"
        r = requests.get(zhilianUrl, headers=headers)
        if r.ok:
            r.raise_for_status()
            r.encoding = 'utf-8'
            rr = r'(?!共<em>)[0-9]+(?=</em>个职位满足条件)'
            a = re.findall(rr, r.text, 0)

            if int(a[0]) >= 50 and hasCity(r):
                print(city, zhiwei, a[0])
                data[city] = int(a[0])
        else:
            print("城市获取失败!")

这样我们就得到了这样的数据:
{'北京': 4205, '上海': 2702, '广州': 1442, '深圳': 1872, '天津': 536 ...}

使用matplotlib根据数据画出图表

通过上面我们获取完了数据之后,直接用matplotlib库画出图表来就可以直观的看到各个城市的职位数情况了.

def draw(keys, values):
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    time = i = datetime.datetime.now()
    plt.title(str(time.year) + "/" + str(time.month) + "/" + str(time.day) + zhiwei + "职位数分布图")
    plt.bar(keys, values, label="职位数")
    plt.legend()
    plt.show()

结果展示

程序运行:

运行结果:

android爬取结果

还可以修改一下脚本中的职位名,查找其他职业:

python爬取结果
PHP爬取结果
会计爬取结果

本文出自: http://www.jianshu.com/p/abe40b2919ed
完整代码点此获取
本文为作者原创,转载请注明出处.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335