Python爬蟲實戰,requests模塊,Python實現拉勾網求職信息數據分析與可視化 前言 開發工具 環境搭建 數據爬取 數據可視化

前言

利用requests爬取拉勾網求職信息數據分析與可視化,廢話不多說。

讓我們愉快地開始吧~

開發工具

Python版本:3.6.4

相關模塊:

requests模塊;

re模塊;

os模塊

jieba模塊;

pandas模塊

numpy模塊

pyecharts模塊;

以及一些Python自帶的模塊。

環境搭建

安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。

數據爬取

爬取拉勾網求職信息

1.requests 請求,獲取單頁面

# 我們最常用的流程:網頁上覆制url->發送get請求—>打印頁面內容->分析抓取數據 
# 1.獲取拉鉤網url 
req_url = 'https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=' 
# 2.發送get請求 
req_result = requests.get(req_url) 
# 3.打印請求結果 
print(req_result.text)

輸出結果如下

<html>  
    <head>     
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="renderer"  content="webkit">     
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  </head>  
 <script type="text/javascript" src="https://www.lagou.com/utrack/trackMid.js?version=1.0.0.3&t=1529144464"></script>  
 <body>   
  <input type="hidden" id="KEY" value="VAfyhYrvroX6vLr5S9WNrP16ruYI6aYOZIwLSgdqTWc"/>  
 <script type="text/javascript">HZRxWevI();</script>é?μé?¢?? è????-...  <script type="text/javascript" src="https://www.lagou.com/upload/oss.js"></script>  
 </body></html>

上述結果我們可以看出與我們想象的還是差別很大。
爲什麼會出現以上這種情況呢,其實很簡單,因爲它並不是簡單的靜態頁面,我們知道請求方式有get和post請求兩種基本區別如下

(1)Get是向服務器發索取數據的一種請求;而Post是向服務器提交數據的一種請求,要提交的數據位 於信息頭後面的實體中。GET和POST只是發送機制不同,並不是一個取一個發. (2)GET請求時其發送的信息是以url明文發送的,其參數會被保存在瀏覽器歷史或web服務器中, 而post則不會某(這也是後面我們翻頁的時候發現拉勾網翻頁時 瀏覽器 url欄地址沒有變化的原因。)

2.分析頁面加載,找到數據

1.請求分析

在拉鉤網首頁,按F12進入開發者模式,然後在查詢框中輸入python,點擊搜索,經過我的查找,終於找到了頁面上職位信息所在的頁面,的確是一個post請求,而且頁面返回內容爲一個json格式的字典。

2.返回數據內容分析
頁面上:我們主要獲取7個數據(公司|城市|職位|薪資|學歷要求|工作經驗|職位優點)

json數據中:我把爬下來的json數據整理了一下,如下圖

我們會發現,我們需要的數據全在req_info['content']['positionResult']['result']裏面,爲一個列表,而且還包含許多其他的信息,本次我們不關心其他數據。我們所需要數據如下圖框

3.添加headers 信息,模仿瀏覽器請求

通過上面的請求分析我們可以找到post請求的網址爲:https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false,如果此時我們直接發送post請求,會提示如下代碼:

{'success': False, 'msg': '您操作太頻繁,請稍後再訪問', 'clientIp': '122.xxx.xxx.xxx'}

出現這種提示的原因是,我們直接post訪問url,服務器會把我們誤認爲‘機器人’,這也是一種反爬,解決方法很簡單,加一個請求頭即可完全模擬瀏覽器請求,請求頭獲取見下圖

4.解析頁面,實現翻頁爬取

分析發現下面規律:
post請求中,有個請求參數->表單數據,包含三個參數first、kd、pn,通過動圖演示,我們不難猜出其含義

data = {  
               'first':'true', # 是不是第一頁,false表示不是,true 表示是                        'kd':'Python', # 搜索關鍵字         
               'pn':1 # 頁碼      
        }

代碼

import requests\
# 1. post 請求的 url\
req_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'\
# 2. 請求頭 headers\
headers = {'你的請求頭'}\
# 3. for 循環請求\
for i in range(1,31):\
   data = { 'first':'false','kd':'Python','pn':i}    \
   # 3.1 requests 發送請求\
   req_result = requests.post(req_url,headers = headers,data = data)    req_result.encoding = 'utf-8'\
   # 3.2 獲取數據\
   req_info = req_result.json()    \
   # 打印出獲取到的數據\
   print(req_info)

5.爬取數據存入csv文件

def file_do(list_info):    # 獲取文件大小    file_size = os.path.getsize(r'G:\lagou_test.csv')    \
   if file_size == 0:        \
       # 表頭        name = ['公司','城市','職位','薪資','學歷要求','工作經驗','職位優點']        \
       # 建立DataFrame對象        file_test = pd.DataFrame(columns=name, data=list_info)        \
       # 數據寫入        file_test.to_csv(r'G:\lagou_test.csv', encoding='gbk',index=False)    \
   else:        \
       with open(r'G:\lagou_test.csv','a+',newline='') as file_test :  # 追加到文件後面            writer = csv.writer(file_test)          \
           # 寫入文件            writer.writerows(list_info)

展示爬取的數據

數據可視化

數據分析+pyechart數據可視化

薪資分佈分析

# 薪資分析,下面的幾個都是柱狀圖,和這個地方分析一樣# 統計各個城市出現次數
salary_lists = {}for x in city: 
salary_lists[x] = salary.count(x) 
key = [] 
values = []for k,v in salary_lists.items():    
    key.append(k)    
    values.append(v) 
bar2 = Bar('求職信息數據化','需求量',page_title='薪資分佈')
# 圖表其他主題:vintage,macarons,infographic,shine,roma
bar2.use_theme('vintage') 
bar2.add('薪資',key,values,is_more_utils = True,is_datazoom_show = True,xaxis_interval=0, xaxis_rotate=30, yaxis_rotate=30) 
bar2.render()

我們可以看到,python的薪資基本都是10k起步,大部分公司給出薪資在10k-40k之間,所以,不要怕學python喫不到飯。

2.工作地點分析

通過圖表,我們很容易看出,需要python程序員的公司大多分佈在北京、上海、深圳,再後面就是廣州了,所以,學python的同學千萬不要去錯城市哦。

3.職位學歷要求

根據圖表顯示,python程序員的學歷要求並不高,主要是本科,雖然學歷要求不高,但一定要有思辨能力哦。

4.工作經驗要求

主要是需要3-5年工作經驗的同學,不老也不年輕,成熟穩重,又能學新東西的年齡,招聘公司真聰明。

5.工作職位研究方向分析

6.工作福利優點分析

# 福利關鍵詞分析
content = ''
# 連接所有公司福利介紹
for x in positionAdvantage:    
    content = content + x
# 去除多餘字符
content = re.sub('[,、(),1234567890;;&%$#@!~_=+]', '', content)
# jieba 切詞,pandas、numpy計數
segment = jieba.lcut(content) 
words_df = pd.DataFrame({'segment': segment}) 
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"計數": numpy.size}) 
words_stat = words_stat.reset_index().sort_values(by=["計數"], ascending=False) test = words_stat.head(1000).values
# 製作詞雲圖\
codes = [test[i][0] for i in range(0,len(test))] 
counts = [test[i][1] for i in range(0,len(test))] 
wordcloud = WordCloud(width=1300, height=620,page_title='福利關鍵詞') wordcloud.add("福利關鍵詞", codes, counts, word_size_range=[20, 100]) wordcloud.render()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章