一、學習開始前需安裝模塊pip install requestspip install cvspip install pandaspip install numpypip install jiebapip install repip install pyechartspip install os
二、講解概要本期還是基礎,不過還是花費了小編一天多的時間,都費在排版上了。。。 爬取概要: 為什么要爬取拉勾網(wǎng)?哈哈哈,當然是因為簡單,啪,原因如下: (1)動態(tài)網(wǎng)頁,爬起來難度更大,講起來更有內(nèi)容; (2)與一般情況不同,我們所需內(nèi)容通過get請求獲取不了,需進行頁面分析。課程概要: 1.爬取拉勾網(wǎng)求職信息 (1)requests 請求,獲取單頁面 (2)分析頁面加載,找到數(shù)據(jù) (3)添加headers 信息,模仿瀏覽器請求 (4)解析頁面,實現(xiàn)翻頁爬取 (5)爬取數(shù)據(jù)存入csv文件2.數(shù)據(jù)分析與可視化 (1)分析數(shù)據(jù) (2)pyecharts實現(xiàn)數(shù)據(jù)可視化
三、正式開始,豎起你的小眼睛爬取拉勾網(wǎng)求職信息(1)requests 請求,獲取單頁面# 我們最常用的流程:網(wǎng)頁上復制url->發(fā)送get請求—>打印頁面內(nèi)容->分析抓取數(shù)據(jù)# 1.獲取拉鉤網(wǎng)urlreq_url = 'https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput='# 2.發(fā)送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>
看的出來,與我們想象的還是差別很大。 為什么會出現(xiàn)這種情況,很簡單,因為它并不是簡單的靜態(tài)頁面,我們知道請求方式有get和post請求兩種基本區(qū)別如下: (1)Get是向服務器發(fā)索取數(shù)據(jù)的一種請求;而Post是向服務器提交數(shù)據(jù)的一種請求,要提交的數(shù)據(jù)位于信息頭后面的實體中。GET和POST只是發(fā)送機制不同,并不是一個取一個發(fā).(2)GET請求時其發(fā)送的信息是以url明文發(fā)送的,其參數(shù)會被保存在瀏覽器歷史或web服務器中,而post則不會某(這也是后面我們翻頁的時候發(fā)現(xiàn)拉勾網(wǎng)翻頁時 瀏覽器 url欄地址沒有變化的原因。)
(2)分析頁面加載,找到數(shù)據(jù) 1.請求分析 在拉鉤網(wǎng)首頁,按F12進入開發(fā)者模式,然后在查詢框中輸入python ,點擊搜索,經(jīng)過我的查找,終于找到了頁面上職位信息所在的頁面,的確是一個post 請求,而且頁面返回內(nèi)容為一個json 格式的字典。

2.返回數(shù)據(jù)內(nèi)容分析 頁面上:我們主要獲取7個數(shù)據(jù)(公司|城市|職位|薪資|學歷要求|工作經(jīng)驗|職位優(yōu)點)

json 數(shù)據(jù)中:我把爬下來的json 數(shù)據(jù)整理了一下,如下圖:

我們會發(fā)現(xiàn),我們需要的數(shù)據(jù)全在req_info['content']['positionResult']['result'] 里面,為一個列表,而且還包含許多其他的信息,本次我們不關心其他數(shù)據(jù)。我們所需要數(shù)據(jù)如下圖框:

(3)添加headers 信息,模仿瀏覽器請求 通過上面的請求分析我們可以找到post 請求的網(wǎng)址為:https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false,如果此時我們直接發(fā)送post 請求,會提示如下代碼: {'success': False, 'msg': '您操作太頻繁,請稍后再訪問', 'clientIp': '122.xxx.xxx.xxx'}
出現(xiàn)這種提示的原因是,我們直接post 訪問url,服務器會把我們誤認為‘機器人’,這也是一種反爬,解決方法很簡單,加一個請求頭即可完全模擬瀏覽器請求,請求頭獲取見下圖:

(4)解析頁面,實現(xiàn)翻頁爬取1.怎么實現(xiàn)翻頁呢? 一般,我們實現(xiàn)翻頁的方法就是自己手動的在瀏覽器翻頁,然后觀察網(wǎng)址的變化,找出規(guī)律,可是翻拉鉤網(wǎng) 的時候我們會發(fā)現(xiàn),在瀏覽器里翻頁的時候,url框 內(nèi)的網(wǎng)址并沒有變化。 2.再次頁面分析? 還得繼續(xù)分析頁面求,我們必須要相信,肯定是有變化的,不然,頁面內(nèi)容怎么可能自己變化呢? 分析發(fā)現(xiàn)下面規(guī)律: 在post 請求中,有個請求參數(shù)->表單數(shù)據(jù),包含三個參數(shù)first、kd、pn ,通過動圖演示,我們不難猜出其含義: data = { 'first':'true', # 是不是第一頁,false表示不是,true 表示是 'kd':'Python', # 搜索關鍵字 'pn':1 # 頁碼 }

現(xiàn)階段代碼: import requests # 1. post 請求的 url req_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false' # 2. 請求頭 headers headers = {'你的請求頭'} # 3. for 循環(huán)請求 for i in range(1,31): data = { 'first':'false','kd':'Python','pn':i} # 3.1 requests 發(fā)送請求 req_result = requests.post(req_url,headers = headers,data = data) req_result.encoding = 'utf-8' # 3.2 獲取數(shù)據(jù) req_info = req_result.json() # 打印出獲取到的數(shù)據(jù) print(req_info)
(5)爬取數(shù)據(jù)存入csv文件def file_do(list_info): # 獲取文件大小 file_size = os.path.getsize(r'G:\lagou_test.csv') if file_size == 0: # 表頭 name = ['公司','城市','職位','薪資','學歷要求','工作經(jīng)驗','職位優(yōu)點'] # 建立DataFrame對象 file_test = pd.DataFrame(columns=name, data=list_info) # 數(shù)據(jù)寫入 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)
簡單展示一下爬取到的數(shù)據(jù):

四、來點進階的(和爬蟲無關)數(shù)據(jù)分析+pyechart數(shù)據(jù)可視化1.薪資分布分析 # 薪資分析,下面的幾個都是柱狀圖,和這個地方分析一樣# 統(tǒng)計各個城市出現(xiàn)次數(shù) 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('求職信息數(shù)據(jù)化','需求量',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.職位學歷要求
根據(jù)圖表顯示,python 程序員的學歷要求并不高,主要是本科,雖然學歷要求不高,但一定要有思辨能力哦。
4.工作經(jīng)驗要求

主要是需要3-5年工作經(jīng)驗的同學,不老也不年輕,成熟穩(wěn)重,又能學新東西的年齡,招聘公司真聰明。
5.工作職位研究方向分析 # 和下面福利關鍵詞的分析差不多,大家可以自己試著寫寫。

開發(fā),沒錯是開發(fā),至于具體什么開發(fā),公司面談吧。哈哈哈~
6.工作福利優(yōu)點分析 # 福利關鍵詞分析 content = '' # 連接所有公司福利介紹 for x in positionAdvantage: content = content + x # 去除多余字符 content = re.sub('[,、(),1234567890;;&%$#@!~_=+]', '', content) # jieba 切詞,pandas、numpy計數(shù) segment = jieba.lcut(content)words_df = pd.DataFrame({'segment': segment})words_stat = words_df.groupby(by=['segment'])['segment'].agg({'計數(shù)': numpy.size})words_stat = words_stat.reset_index().sort_values(by=['計數(shù)'], 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()
|