日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Python | 雜代碼】爬蟲(chóng),從基礎(chǔ)到進(jìn)階(二)

 Four兄 2019-09-06

一、學(xué)習(xí)開(kāi)始前需安裝模塊

pip install requestspip install cvspip install pandaspip install numpypip install jiebapip install repip install pyechartspip install os

二、講解概要

本期還是基礎(chǔ),不過(guò)還是花費(fèi)了小編一天多的時(shí)間,都費(fèi)在排版上了。。。
爬取概要:
為什么要爬取拉勾網(wǎng)?哈哈哈,當(dāng)然是因?yàn)楹?jiǎn)單,啪,原因如下: (1)動(dòng)態(tài)網(wǎng)頁(yè),爬起來(lái)難度更大,講起來(lái)更有內(nèi)容; (2)與一般情況不同,我們所需內(nèi)容通過(guò)get請(qǐng)求獲取不了,需進(jìn)行頁(yè)面分析。課程概要:
1.爬取拉勾網(wǎng)求職信息 (1)requests 請(qǐng)求,獲取單頁(yè)面 (2)分析頁(yè)面加載,找到數(shù)據(jù) (3)添加headers 信息,模仿瀏覽器請(qǐng)求 (4)解析頁(yè)面,實(shí)現(xiàn)翻頁(yè)爬取 (5)爬取數(shù)據(jù)存入csv文件2.數(shù)據(jù)分析與可視化 (1)分析數(shù)據(jù) (2)pyecharts實(shí)現(xiàn)數(shù)據(jù)可視化

三、正式開(kāi)始,豎起你的小眼睛

爬取拉勾網(wǎng)求職信息
(1)requests 請(qǐng)求,獲取單頁(yè)面
# 我們最常用的流程:網(wǎng)頁(yè)上復(fù)制url->發(fā)送get請(qǐng)求—>打印頁(yè)面內(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請(qǐng)求req_result = requests.get(req_url)# 3.打印請(qǐng)求結(jié)果print(req_result.text)

由上面的流程,打印輸出結(jié)果如下:

<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>

看的出來(lái),與我們想象的還是差別很大。
為什么會(huì)出現(xiàn)這種情況,很簡(jiǎn)單,因?yàn)樗⒉皇呛?jiǎn)單的靜態(tài)頁(yè)面,我們知道請(qǐng)求方式有g(shù)et和post請(qǐng)求兩種基本區(qū)別如下:

(1)Get是向服務(wù)器發(fā)索取數(shù)據(jù)的一種請(qǐng)求;而Post是向服務(wù)器提交數(shù)據(jù)的一種請(qǐng)求,要提交的數(shù)據(jù)位于信息頭后面的實(shí)體中。GET和POST只是發(fā)送機(jī)制不同,并不是一個(gè)取一個(gè)發(fā).(2)GET請(qǐng)求時(shí)其發(fā)送的信息是以u(píng)rl明文發(fā)送的,其參數(shù)會(huì)被保存在瀏覽器歷史或web服務(wù)器中,而post則不會(huì)某(這也是后面我們翻頁(yè)的時(shí)候發(fā)現(xiàn)拉勾網(wǎng)翻頁(yè)時(shí) 瀏覽器 url欄地址沒(méi)有變化的原因。)
(2)分析頁(yè)面加載,找到數(shù)據(jù)

 1.請(qǐng)求分析
  在拉鉤網(wǎng)首頁(yè),按F12進(jìn)入開(kāi)發(fā)者模式,然后在查詢(xún)框中輸入python,點(diǎn)擊搜索,經(jīng)過(guò)我的查找,終于找到了頁(yè)面上職位信息所在的頁(yè)面,的確是一個(gè)post請(qǐng)求,而且頁(yè)面返回內(nèi)容為一個(gè)json格式的字典。



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



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



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



(3)添加headers 信息,模仿瀏覽器請(qǐng)求

  通過(guò)上面的請(qǐng)求分析我們可以找到post請(qǐng)求的網(wǎng)址為:https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false,如果此時(shí)我們直接發(fā)送post請(qǐng)求,會(huì)提示如下代碼:

{'success': False, 'msg': '您操作太頻繁,請(qǐng)稍后再訪(fǎng)問(wèn)', 'clientIp': '122.xxx.xxx.xxx'}

出現(xiàn)這種提示的原因是,我們直接post訪(fǎng)問(wèn)url,服務(wù)器會(huì)把我們誤認(rèn)為‘機(jī)器人’,這也是一種反爬,解決方法很簡(jiǎn)單,加一個(gè)請(qǐng)求頭即可完全模擬瀏覽器請(qǐng)求,請(qǐng)求頭獲取見(jiàn)下圖:



(4)解析頁(yè)面,實(shí)現(xiàn)翻頁(yè)爬取

1.怎么實(shí)現(xiàn)翻頁(yè)呢?
  一般,我們實(shí)現(xiàn)翻頁(yè)的方法就是自己手動(dòng)的在瀏覽器翻頁(yè),然后觀察網(wǎng)址的變化,找出規(guī)律,可是翻拉鉤網(wǎng)的時(shí)候我們會(huì)發(fā)現(xiàn),在瀏覽器里翻頁(yè)的時(shí)候,url框內(nèi)的網(wǎng)址并沒(méi)有變化。
2.再次頁(yè)面分析?
  還得繼續(xù)分析頁(yè)面求,我們必須要相信,肯定是有變化的,不然,頁(yè)面內(nèi)容怎么可能自己變化呢?
  分析發(fā)現(xiàn)下面規(guī)律:
post請(qǐng)求中,有個(gè)請(qǐng)求參數(shù)->表單數(shù)據(jù),包含三個(gè)參數(shù)first、kd、pn,通過(guò)動(dòng)圖演示,我們不難猜出其含義:

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


現(xiàn)階段代碼:

import requests
# 1. post 請(qǐng)求的 url
req_url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
# 2. 請(qǐng)求頭 headers
headers = {'你的請(qǐng)求頭'}
# 3. for 循環(huán)請(qǐng)求
for i in range(1,31):
   data = { 'first':'false','kd':'Python','pn':i}    
   # 3.1 requests 發(fā)送請(qǐng)求
   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 = ['公司','城市','職位','薪資','學(xué)歷要求','工作經(jīng)驗(yàn)','職位優(yōu)點(diǎn)']        
       # 建立DataFrame對(duì)象        file_test = pd.DataFrame(columns=name, data=list_info)        
       # 數(shù)據(jù)寫(xiě)入        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)          
           # 寫(xiě)入文件            writer.writerows(list_info)

簡(jiǎn)單展示一下爬取到的數(shù)據(jù)


四、來(lái)點(diǎn)進(jìn)階的(和爬蟲(chóng)無(wú)關(guān))

數(shù)據(jù)分析+pyechart數(shù)據(jù)可視化

1.薪資分布分析

# 薪資分析,下面的幾個(gè)都是柱狀圖,和這個(gè)地方分析一樣# 統(tǒng)計(jì)各個(gè)城市出現(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之間,所以,不要怕學(xué)python吃不到飯。

2.工作地點(diǎn)分析



通過(guò)圖表,我們很容易看出,需要python程序員的公司大多分布在北京、上海、深圳,再后面就是廣州了,所以,學(xué)python的同學(xué)千萬(wàn)不要去錯(cuò)城市哦。

3.職位學(xué)歷要求


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

4.工作經(jīng)驗(yàn)要求



主要是需要3-5年工作經(jīng)驗(yàn)的同學(xué),不老也不年輕,成熟穩(wěn)重,又能學(xué)新東西的年齡,招聘公司真聰明。

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

# 和下面福利關(guān)鍵詞的分析差不多,大家可以自己試著寫(xiě)寫(xiě)。


開(kāi)發(fā),沒(méi)錯(cuò)是開(kāi)發(fā),至于具體什么開(kāi)發(fā),公司面談吧。哈哈哈~

6.工作福利優(yōu)點(diǎn)分析

# 福利關(guān)鍵詞分析
content = ''
# 連接所有公司福利介紹
for x in positionAdvantage:    content = content + x
# 去除多余字符
content = re.sub('[,、(),1234567890;;&%$#@!~_=+]', '', content)
# jieba 切詞,pandas、numpy計(jì)數(shù)
segment = jieba.lcut(content)words_df = pd.DataFrame({'segment': segment})words_stat = words_df.groupby(by=['segment'])['segment'].agg({'計(jì)數(shù)': numpy.size})words_stat = words_stat.reset_index().sort_values(by=['計(jì)數(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='福利關(guān)鍵詞')wordcloud.add('福利關(guān)鍵詞', codes, counts, word_size_range=[20, 100])wordcloud.render()

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多