用Python爬取智聯招聘信息做職業規划


  上學期在實驗室發表時寫了一個爬取智聯招牌信息的爬蟲。

操作流程大致分為:信息爬取——數據結構化——存入數據庫——所需技能等分詞統計——數據可視化

  1.數據爬取

 

 1 job = "通信工程師" #以爬取通信工程師職業為例
 2 leibie = '1'
 3 url_job = []
 4 
 5 for page in range(99):
 6     x = str(page) #爬取的頁碼
 7     p = str(page+1)
 8     print("正在抓取第一"+p+"頁...\n") #提示
 9     url = "http://sou.zhaopin.com/jobs/searchresult.ashx?in=210500%3B160400%3B160000%3B160500%3B160200%3B300100%3B160100%3B160600&jl=上海%2B杭州%2B北京%2B廣州%2B深圳&kw="+job+"&p="+x+"&isadv=0" #url地址,此處為示例,可更據實際情況更改
10     r = requests.post(url) #發送請求
11     data = r.text
12     pattern=re.compile('ssidkey=y&ss=201&ff=03" href="(.*?)" target="_blank"',re.S) #正則匹配出招聘信息的URL地址
13     tmp_job = re.findall(pattern,data)
14     url_job.extend(tmp_job) #加入隊列

 

 

上面代碼以上海、杭州、北京、廣州、深圳的“通信工程師”為例實現爬取了智聯招聘上每一則招聘信息的URL地址。

(示例)在智聯招聘上如下圖所示的招聘地址:

  2.數據結構化

獲得URL之后,就通過URL,發送get請求,爬取每一則招聘的數據,然后使用Xpath或者正則表達式把所有數據結構化,代碼如下:

 1 for x in url_job:
 2     print(x)
 3     d = requests.post(x) #發送post請求
 4     zhiwei = d.text
 5     selector = etree.HTML(zhiwei) #獲得招聘頁面源碼
 6     name = selector.xpath('//div[@class="inner-left fl"]/h1/text()') #匹配到的職業名稱
 7     mone = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[1]/strong/text()') #匹配到該職位的月薪
 8     adress = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[2]/strong/a/text()') #匹配工作的地址
 9     exp = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[5]/strong/text()') #匹配要求的工作經驗
10     education = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[6]/strong/text()') #匹配最低學歷
11     zhiweileibie = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[8]/strong/a/text()') #匹配職位類別
12 
13     match = re.compile('<!-- SWSStringCutStart -->(.*?)<!-- SWSStringCutEnd -->',re.S)#此處為匹配對職位的描述,並且對其結構化處理
14     description = re.findall(match,zhiwei)
15     des = description[0]
16     des = filter_tags(des) #filter_tags此函數下面會講到
17     des = des.strip()
18     des = des.replace('&nbsp;','')
19     des = des.rstrip('\n')
20     des = des.strip(' \t\n')
21     try: #嘗試判斷是否為最后一則
22         name = to_str(name[0])
23         mone = to_str(mone[0])
24         adress = to_str(adress[0])
25         exp = to_str(exp[0])
26         education = to_str(education[0])
27         zhiweileibie = to_str(zhiweileibie[0])
28         des = to_str(des)
29     except Exception as e:
30         continue

 

上面代碼中使用了filter_tags函數,此函數的目的在於把HTML代碼替換實體,並且去掉各種標簽、注釋和換行空行等,該函數代碼如下:

 1 def filter_tags(htmlstr):
 2     #先過濾CDATA
 3     re_cdata=re.compile('//<!\[CDATA\[[^>]*//\]\]>',re.I) #匹配CDATA
 4     re_script=re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I)#Script
 5     re_style=re.compile('<\s*style[^>]*>[^<]*<\s*/\s*style\s*>',re.I)#style
 6     re_br=re.compile('<br\s*?/?>')#處理換行
 7     re_h=re.compile('</?\w+[^>]*>')#HTML標簽
 8     re_comment=re.compile('<!--[^>]*-->')#HTML注釋
 9     s=re_cdata.sub('',htmlstr)#去掉CDATA
10     s=re_script.sub('',s) #去掉SCRIPT
11     s=re_style.sub('',s)#去掉style
12     #s=re_br.sub('\n',s)#將br轉換為換行
13     s=re_h.sub('',s) #去掉HTML 標簽
14     s=re_comment.sub('',s)#去掉HTML注釋
15     #去掉多余的空行
16     blank_line=re.compile('\n+')
17     s=blank_line.sub('\n',s)
18     # s=replaceCharEntity(s)#替換實體
19     return s

  3.存入數據庫

上面的代碼已經幫我們實現根據數據表中設置的字段清洗好雜亂無章的數據了,之后只要在循環中把結構化的數據存入數據庫即可。

具體代碼如下:

 1 conn = pymysql.connect(host='127.0.0.1',user='root',passwd='××××××',db='zhiye_data',port=3306,charset='utf8')
 2 cursor=conn.cursor()
 3 
 4 sql='INSERT INTO `main_data_3` (`name`,`mone`,`adress`,`exp`,`education`,`zhiweileibie`,`description`,`leibie`,`company_range`,`company_kind`) VALUES(\''+name+'\',\''+mone+'\',\''+adress+'\',\''+exp+'\',\''+education+'\',\''+zhiweileibie+'\',\''+des+'\',\''+leibie+'\',\'a\',\'b\');'#%(name,mone,adress,exp,education,zhiweileibie,des,leibie)
 5 
 6     #print(sql)
 7     try:
 8         cursor.execute(sql)
 9         conn.commit()
10         print (cursor.rowcount)
11     except Exception as e:
12         print (e)
13 cursor.close()
14 conn.close()

存入數據庫中的具體數據示例如下圖:

 

  4.數據統計

首先對職位的描述進行分詞統計,以便分析出該職業所需要的技能。

對職位描述進行分詞我先使用的是SAE的分詞服務,示例代碼(PHP)如下(僅供參考):

 1     public function get()
 2     {
 3         $h = D('hotword');
 4         $data = $h->get_des();
 5 
 6         foreach ($data as $k => $v) {
 7             $content = POST("http://segment.sae.sina.com.cn/urlclient.php?encoding=UTF-8&word_tag=1","context=".$v['description']);
 8             $text = json_decode($content,true);
 9             if (empty($text[0]['word_tag'])) {
10                 exit;
11             }
12             $sta = $h->hotword_save($text);
13             dump($sta);
14         }
15     }

向服務地址發送post請求,會以JSON格式返回具體的分析結果。存入數據庫(如下圖):

對每個詞的出現頻率進行統計,去掉一些無關的和通用的詞之后就是所需職業技能的關鍵詞。

然后我也對各個地區各個職業的月薪、數量等也進行欄統計。

下面放幾張結果的示例圖(不清晰的截圖,,,見諒哈):

 

下圖為不同職業對學歷要求的統計圖

下圖為Python開發出現最多的技能詞

下圖為C開發出現最多的技能詞

最后的分析我這里就不多說了,聰明的人看圖都應該能看懂了哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM