想了解一下現在python職位的要求,需要掌握什麼框架資料庫方向等等。先在互聯網招聘公司拉勾網爬取網站上所有關鍵字為python的全國職位,然後把職位的各種信息保存到mongodb中,把職位描述這部分拿出來,使用jieba分詞提取關鍵字做成詞雲。

首先打開拉勾網,在搜索欄輸入python,就馬上出現如圖信息

先用右鍵查看網頁源代碼,發現html沒有這個網頁職位信息,就可以判斷lagou.com/jobs/list_pyt是直接爬取不出想要的信息,這時候需要FireFox瀏覽器,打開firebug,點擊網路里的XHR,刷新網頁,出現2個url,點擊第一個看響應,好像要爬取的信息出現。再點擊json看看裡面的結構,嗯,就是要爬取的數據,一頁15個職位信息,每個信息對應著公司名字,職位ID等等很詳細的信息。而且是齊整的json格式,太方便了!

這裡我有個問題data[content][positionResult][totalCount]這裡顯示python職位有1290個,但是拉勾網只顯示30頁也就是450個,但是爬取下去31,32都是有真實職位存在的。

地址是lagou.com/jobs/position,因為是post方法,點擊post,需要3個參數 first值false表示職位搜索默認true表示最新,kd就是搜索關鍵詞,pn就是頁碼

直接敲代碼request.post獲取不到這個json,因為缺少header請求頭,這個好辦,回去把整個請求頭信息複製過去妥妥的,注意這裡有個cookie,這個其實也可以用python代碼獲取,但是我還是直接複製過來吧,以後再補充。

好了現在測試一下,可以獲取到這個json文件,接著隨便打開一個職位看看lagou.com/jobs/1638652.,用上面同樣方法查看源代碼直接有想獲取的信息了,那麼就這個網址就可以直接爬取了。點擊多個職位看看,變化的是後面一串數字1638652,這個數字就是在剛剛獲取的json文件裏的data[content][positionResult][result][positionId]獲取得到,把網址lagou.com/jobs/{}.html.format(data[positionId])串聯起來就行了。

再分析這個職位詳細網頁,用firebug小箭頭點擊文字就出來了,用beautifulsoup這個包去抓取精確位置就可以了。

現在基本OK,先把所有職位列表json爬取下來,然後獲取各自信息,利用職位ID構造職位詳情url把職位描述保存下來。

拉勾網是有反爬蟲機制的,按照上面方法爬取幾頁會出現出現「您所用的IP地址出現異常」,然後瀏覽器就上不去了。所以這裡要搞點反爬蟲,例如header請求頭裡的UserAgent更換,還有使用代理IP,加點每次訪問隨機時間。

import requestsimport jsonfrom bs4 import BeautifulSoupimport pymongoimport timeimport randomfrom multiprocessing import Poolfrom proxy import get_random_IP, get_page_headers, get_position_headersclient = pymongo.MongoClient(localhost, 27017)lagou = client[lagou_position]job = lagou[python_job]def get_page(pn=1): time.sleep(random.randint(5, 10) / 10.0) url1 = https://www.lagou.com/jobs/positionAjax.json?px=default&needAddtionalResult=false data = { first: true, kd: python, pn: pn, } try: wb_data = requests.post(url1, headers=get_page_headers(), data=data, proxies={http: get_random_IP()}) data = json.loads(wb_data.text) position = data[content][positionResult][result] position_total = data[content][positionResult][totalCount] for i in position: print i data = { companySize: i[companySize], workYear: i[workYear], education: i[education], financeStage: i[financeStage], city: i[city], district: i[district], industryField: i[industryField], positionId: i[positionId], positionName: i[positionName], jobNature: i[jobNature], companyFullName: i[companyFullName], companyLabelList: i[companyLabelList], salary: i[salary], companyShortName: i[companyShortName], positionAdvantage: i[positionAdvantage], } get_position(data) except: time.sleep(180) print data passdef get_position(data): url2 = https://www.lagou.com/jobs/{}.html.format(data[positionId]) wb_data = requests.get(url2, headers=get_position_headers(), proxies={http: get_random_IP()}) soup = BeautifulSoup(wb_data.text, lxml) job_bt = soup.select(#job_detail > dd.job_bt > div)[0] work_add = soup.select(div.work_addr)[0] data[job_bt] = job_bt.get_text() data[work_add] = work_add.get_text().replace( , ).replace(
, ) job.insert_one(data)if __name__ == __main__: start = time.time() pool = Pool(processes=6) # pool = Pool() pool.map(get_page, range(0, 81)) pool.close() pool.join() end = time.time() print end - start

拉勾網大概有1290關於關鍵字python全國職位,我只爬取80頁也就是1200條,但是我爬取下來竟然有1216條,我又把他們職位ID檢查一下,沒有重複的有1189。

# _*_ coding: utf-8 _*_import pymongoclient = pymongo.MongoClient(localhost, 27017)lagou = client[lagou_position]job = lagou[python_job]# 存儲到文本def save_text(): with open(python_job.txt, wb+) as f: for i in job.find(): f.write(i[job_bt].encode(utf-8)) # unicode編碼utf-8才能寫入# 檢查數據情況def check_data(): a = set() for i in job.find(): a.add(i[positionId]) print len(a) # 輸出1189 print job.count() # 輸出1215

然後就把職位描述全部提取出來保存到文本中,使用jieba分詞,文檔fxsjy/jieba,中文文檔都有。我這裡主要適應wordcloud詞雲權重,把分詞再一一計算詞頻,按照對應格式傳過去。

def get_word_weight(): with open(python_job.txt, rb+) as f: file = f.read() a = [] seg_list = list(jieba.cut(file, cut_all=False)) for word in seg_list: if len(word) > 1: a.append(word) b = set(a) word_text = [] for i in b: weight = (i, a.count(i)) word_text.append(weight) # print (word_text[0][1]) return word_text

最後這裡使用wordcloud詞雲amueller/word_cloud沒有中文文檔,但是知乎有個大神有介紹Python pytagcloud 中文分詞 生成標籤雲 系列(一)Python word_cloud 部分文檔翻譯 標籤雲系列(二)Python word_cloud 樣例 標籤雲系列(三)一開始要在wordcloud.py更改文字樣式,在系列二有詳細介紹,不更改的話是不能生成中文詞雲的。

# encoding=utf-8from os import pathfrom wordcloud import WordCloud, STOPWORDSimport matplotlib.pyplot as pltfrom lagou_jieba import get_word_weight, get_language_weightd = path.dirname(__file__)text = open(path.join(d, a.txt)).read().decode(utf-8)stopwords = set(STOPWORDS)stopwords.add(u"崗位職責")stopwords.add(u"任職要求")stopwords.add(u"崗位要求")language = open(path.join(d, job.txt)).read()language=get_language_weight()frequencies = get_word_weight()wordcloud_fre = WordCloud().fit_words(frequencies)wordcloud_org = WordCloud().generate(text)wordcloud_eng = WordCloud().generate(language)plt.imshow(wordcloud_fre, interpolation=bilinear)plt.axis("off") # 去掉x,y坐標plt.show()plt.imshow(wordcloud_eng, interpolation=bilinear)plt.axis("off") # 去掉x,y坐標plt.show()wc = WordCloud(stopwords=stopwords, margin=10).generate(text)plt.figure()plt.imshow(wc, interpolation="bilinear")plt.axis("off")plt.show()

最後生成圖是

要掌握的工具是

看起來比較醜,其實很多參數需要去調節的,看大神的這個圖

總結一下:python的輪子實在太強大了......

源代碼遲點放到github,因為目前還不會用github.....


推薦閱讀:
相关文章