利用python分析2018智聯(lián)招聘全國各個城市的職位數(shù)排名

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

那中國除了公認的北上廣深工作機會最多以外,還有那些城市也相對不錯呢?

這時候我們可能會打開招聘網(wǎng)站開始選擇城市然后來了解這個城市的職位情況.

那么一直秉持著人生苦短,我學(xué)python的我們,為什么不能用python來寫一個分析2018全國各個城市的職位數(shù)排名的爬蟲腳本呢?

這么一想十分可行啊,我們只需要找到一個目標(biāo)招聘平臺,然后通過用代碼get到它的html正文,通過BeautifulSoup分析html來得到我們想要的數(shù)據(jù),然后用matplotlib畫出圖表就可以了. (完整代碼見本文末尾.)

于是立馬動手,首先,既然我們是要分析全國范圍內(nèi)的所有城市的職位數(shù),那么我們肯定首先要把所有的城市先列出來.然而這里想必地理學(xué)的再好的同學(xué)也不可能能把全國范圍內(nèi)所有的城市都能背下來吧,所以這一步,我們也是用python來爬取到全國范圍內(nèi)所有的城市名稱.

1.爬取全國范圍內(nèi)所有的城市列表

通過一番查找,終于找到了智聯(lián)上的這個頁面.http://www.zhaopin.com/citymap.html

乍一看好像所有的城市名都是加粗的,右鍵查看一下源代碼,果然,所有的城市名都被加上了<strong>標(biāo)簽,類似于這樣

那就簡單了,我們直接獲取該網(wǎng)頁所有<strong>標(biāo)簽里面的內(nèi)容,就是標(biāo)簽名了.代碼:

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("目標(biāo)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("城市獲取失斣熳场庶艾!")

這樣我們就獲取到了所有的城市名,下一步我們就是要通過遍歷這些城市名來查詢某一個職業(yè)的職位數(shù)了.

2.遍歷城市名,爬取對應(yīng)城市的職位數(shù).

這時候我們先打開智聯(lián)的搜工作頁面,輸入職位名"android",地址選擇"煙臺",然后點擊搜工作,這時候注意到,瀏覽器的地址欄變成了:

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

原來,智聯(lián)的找工作這個按鈕是執(zhí)行了一個get請求而已,其中jl=和&kw=即分別代表要查找的城市和職位關(guān)鍵字,這時候先不要著急寫代碼,我們先來像上面說的一樣來分析一下這個頁面.
首先第一眼直接就找到了這樣的字眼

上面赫然顯示著共84個職位滿足條件,一切總是那么完美,不需要多余的任何操作,仿佛傳到橋頭自然直一樣,這不正是我們想要找的職位數(shù)嗎.然后右鍵選擇查看源代碼.恩,不得不說相當(dāng)完美!

但這次數(shù)據(jù)格式好像比較復(fù)雜一點,我們?nèi)绻麅H僅簡單用<em>84</em>標(biāo)簽包裹的內(nèi)容來獲取職位數(shù)的話好像已經(jīng)行不通了,因為該網(wǎng)頁很多的地方也使用了<em>標(biāo)簽,那怎么辦呢,這時候我們只能使用正則表達式來匹配了.

修修改改,最終的正則表達式是這樣的:(?!共<em>)[0-9]+(?=</em>個職位滿足條件),其中的?!和?=則是讓其所在的括號內(nèi)的內(nèi)容不放入匹配緩沖區(qū)里.

好,接下來我們就可以結(jié)合以上的內(nèi)容來寫代碼了.

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("職位數(shù)獲取失敗色解!")

寫完趕緊興沖沖的run一下,...然而...

結(jié)果是運行沒有報錯也沒有任何輸出,左邊的紅色方塊顯示程序還在運行中,是的,它卡住了,停止運行再重新start還是會卡主,檢查一下程序也沒問題啊,what?辛辛苦苦才到達了這步救過竟然卡住了?這個時候我們不要著急,身為一個整天跟各種BUG打交道的程序員,一定要鎮(zhèn)定,努力分析問題可能的原因,然后解決問題.

繼續(xù)回到我們的這個問題上,排除我們程序本身的問題,會不會是對方的網(wǎng)站早知道我們會寫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

果然這下就沒問題了,程序瞬間就成功獲取到了職位數(shù)為 84
繼續(xù)改動一下程序,遍歷所有的城市列表,并根據(jù)key=城市名,value=職位數(shù)的格式將所有的城市職位數(shù)都獲取來存到一個字典(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("城市獲取失斁孀!")

這樣我們就得到了這樣的數(shù)據(jù):
{'北京': 4205, '上海': 2702, '廣州': 1442, '深圳': 1872, '天津': 536 ...}

使用matplotlib根據(jù)數(shù)據(jù)畫出圖表

通過上面我們獲取完了數(shù)據(jù)之后,直接用matplotlib庫畫出圖表來就可以直觀的看到各個城市的職位數(shù)情況了.

def draw(keys, values):
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標(biāo)簽
    plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號
    time = i = datetime.datetime.now()
    plt.title(str(time.year) + "/" + str(time.month) + "/" + str(time.day) + zhiwei + "職位數(shù)分布圖")
    plt.bar(keys, values, label="職位數(shù)")
    plt.legend()
    plt.show()

結(jié)果展示

程序運行:

運行結(jié)果:

android爬取結(jié)果

還可以修改一下腳本中的職位名,查找其他職業(yè):

python爬取結(jié)果
PHP爬取結(jié)果
會計爬取結(jié)果

本文出自: http://www.reibang.com/p/abe40b2919ed
完整代碼點此獲取
本文為作者原創(chuàng),轉(zhuǎn)載請注明出處.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末算灸,一起剝皮案震驚了整個濱河市扼劈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌菲驴,老刑警劉巖荐吵,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赊瞬,居然都是意外死亡先煎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門巧涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薯蝎,“玉大人,你說我怎么就攤上這事谤绳≌季猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵缩筛,是天一觀的道長烟央。 經(jīng)常有香客問我,道長歪脏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任粮呢,我火速辦了婚禮婿失,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啄寡。我一直安慰自己豪硅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布挺物。 她就那樣靜靜地躺著懒浮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪识藤。 梳的紋絲不亂的頭發(fā)上砚著,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音痴昧,去河邊找鬼稽穆。 笑死,一個胖子當(dāng)著我的面吹牛赶撰,可吹牛的內(nèi)容都是我干的舌镶。 我是一名探鬼主播柱彻,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼餐胀!你這毒婦竟也來了哟楷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤否灾,失蹤者是張志新(化名)和其女友劉穎卖擅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坟冲,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡磨镶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了健提。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳猫。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖私痹,靈堂內(nèi)的尸體忽然破棺而出脐嫂,到底是詐尸還是另有隱情,我是刑警寧澤紊遵,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布账千,位于F島的核電站,受9級特大地震影響暗膜,放射性物質(zhì)發(fā)生泄漏匀奏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一学搜、第九天 我趴在偏房一處隱蔽的房頂上張望娃善。 院中可真熱鬧,春花似錦瑞佩、人聲如沸聚磺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘫寝。三九已至,卻和暖如春稠炬,著一層夾襖步出監(jiān)牢的瞬間焕阿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工首启, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捣鲸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓闽坡,卻偏偏與公主長得像栽惶,于是被迫代替她去往敵國和親愁溜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345