1. 程式人生 > 實用技巧 >我爬取了爬蟲崗位薪資,分析後發現爬蟲真香

我爬取了爬蟲崗位薪資,分析後發現爬蟲真香

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理

首先,確定目標網站:

https://jobs.51job.com/pachongkaifa

1.開始

開啟pycharm,新建檔案->匯入必備的庫->加入常用的請求頭header

  1. # 匯入requests包
  2. import requests
  3. from lxml import etree
  4. # 網頁連結
  5. url = "https://jobs.51job.com/pachongkaifa/p1/"
  6. # 請求頭
  7. headers = {
  8. "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
  9. "Accept-Encoding": "gzip, deflate, br",
  10. "Accept-Language": "zh-CN,zh;q=0.9",
  11. "Connection": "keep-alive",
  12. "Cookie": "guid=7e8a970a750a4e74ce237e74ba72856b; partner=blog_csdn_net",
  13. "Host": "jobs.51job.com",
  14. "Sec-Fetch-Dest": "document",
  15. "Sec-Fetch-Mode": "navigate",
  16. "Sec-Fetch-Site": "none",
  17. "Sec-Fetch-User": "?1",
  18. "Upgrade-Insecure-Requests": "1",
  19. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
  20. }

2.分析目標網站的標籤,發現想要的欄位(崗位、公司名稱、城市、薪資)都在p標籤裡面,如下圖

<p class="info">

3.開始編寫程式碼

先通過request請求網頁,防止中文亂碼,進行gbk的編碼(如果不設定則會出現亂碼)

  1. res = requests.get(url=url, headers=headers)
  2. res.encoding='gbk'
  3. s = res.text

,接著進行解析網頁,獲取想要的內容

  1. selector = etree.HTML(s)
  2. for item in selector.xpath('/html/body/div[4]/div[2]/div[1]/div/div'):
  3. title = item.xpath('.//p/span[@class="title"]/a/text()')
  4. name = item.xpath('.//p/a/@title')
  5. location_name = item.xpath('.//p/span[@class="location name"]/text()')
  6. sary = item.xpath('.//p/span[@class="location"]/text()')
  7. time = item.xpath('.//p/span[@class="time"]/text()')
  8. if len(title)>0:
  9. print(title)
  10. print(name)
  11. print(location_name)
  12. print(sary)
  13. print(time)
  14. print("-----------")

最後出現執行後,結果如下:

4.儲存到csv檔案

為了方便下一步我們對資料進行分析,我將爬取下來的資料儲存到csv檔案

匯入需要的庫包

  1. import csv
  2. import codecs

建立csv檔案,並設定為追加寫模式

  1. f = codecs.open('爬蟲工程師崗位薪資.csv','a','gbk')
  2. writer = csv.writer(f)
  3. writer.writerow(["崗位","公司","城市","薪資"])

在爬取檔案的時候將爬取的內容迴圈寫入csv

writer.writerow([title[0]+"",name[0]+"",location_name[0]+"",sary[0]+""])

儲存好的csv資料如下:

5.分析資料並進行視覺化

從csv中讀取爬取好的資料

  1. with open('爬蟲工程師崗位薪資.csv','r',encoding = 'gbk') as fp:
  2. reader = csv.reader(fp)
  3. for row in reader:
  4. #崗位
  5. title_list.append(row[0])
  6. #城市
  7. city_list.append(row[2][0:2])
  8. #薪資分佈
  9. sary = row[3].split("-")
  10. if(len(sary)==2):
  11. try:
  12. sary = sary[1].replace("/月","")
  13. if "萬" in sary:
  14. sary = sary.replace("萬","")
  15. sary = int(sary)
  16. sary = sary*10000
  17. sary_list.append(sary)
  18. if "千" in sary:
  19. sary = sary.replace("千","")
  20. sary = int(sary)
  21. sary = sary * 1000
  22. sary_list.append(sary)
  23. except:
  24. pass

這裡用了三個集合來儲存系統分析的內容(崗位、城市、薪資分佈)

  1. #崗位
  2. title_list=[]
  3. #城市
  4. city_list=[]
  5. #薪資分佈
  6. sary_list=[]

由於薪資是1萬/月、2萬/月,為了轉為10000、20000,則需要進行相應的處理。

開始分析了

5.1.視覺化1:爬蟲崗位常用名稱

  1. dict_x = {}
  2. for item in title_list:
  3. dict_x[item] = title_list.count(item)
  4. sorted_x = sorted(dict_x.items(), key=operator.itemgetter(1), reverse=True)
  5. k_list = []
  6. v_list = []
  7. for k, v in sorted_x[0:11]:
  8. k_list.append(k)
  9. v_list.append(v)
  10. plt.axes(aspect=1)
  11. plt.pie(x=v_list,labels= k_list,autopct='%0f%%')
  12. plt.savefig("爬蟲崗位常用名稱.png", dpi=600)
  13. plt.show()

從圖中可以看出,大多數公司都需要用"爬蟲開發工程師"這個詞

5.2.視覺化2:爬蟲崗位最多的城市

  1. dict_x = {}
  2. for item in city_list:
  3. dict_x[item] = city_list.count(item)
  4. sorted_x = sorted(dict_x.items(), key=operator.itemgetter(1), reverse=True)
  5. k_list = []
  6. v_list = []
  7. for k, v in sorted_x[0:11]:
  8. print(k, v)
  9. k_list.append(k)
  10. v_list.append(v)
  11. plt.bar(k_list,v_list, label='爬蟲崗位最多的城市')
  12. plt.legend()
  13. plt.xlabel('城市')
  14. plt.ylabel('數量')
  15. plt.title(u'爬蟲崗位最多的城市(李運辰)')
  16. plt.savefig("爬蟲崗位最多的城市.png", dpi=600)
  17. plt.show()

從圖中來看,大城市(北上廣深)的爬蟲工程師崗位居多

5.3.視覺化3:薪資分佈情況

  1. dict_x = {}
  2. for item in sary_list:
  3. dict_x[item] = sary_list.count(item)
  4. sorted_x = sorted(dict_x.items(), key=operator.itemgetter(1), reverse=True)
  5. k_list = []
  6. v_list = []
  7. for k, v in sorted_x[0:15]:
  8. print(k, v)
  9. k_list.append(k)
  10. v_list.append(v)
  11. plt.axes(aspect=1)
  12. plt.title(u'薪資分佈情況(李運辰)')
  13. plt.pie(x=v_list, labels=k_list, autopct='%0f%%')
  14. plt.savefig("薪資分佈情況.png", dpi=600)
  15. plt.show()

我們可以發現,爬蟲工程師的薪資在20000+以上的佔大半數,尤其是20000左右的居多,看來爬蟲崗位真是太香,你酸了嗎,哈哈哈哈

  1. data = pd.DataFrame({"value":sary_list})
  2. cats1 = pd.cut(data['value'].values, bins=[8000, 10000, 20000, 30000, 50000,data['value'].max()+1])
  3. pinshu = cats1.value_counts()
  4. pinshu_df = pd.DataFrame(pinshu, columns=['頻數'])
  5. pinshu_df['頻率f'] = pinshu_df / pinshu_df['頻數'].sum()
  6. pinshu_df['頻率%'] = pinshu_df['頻率f'].map(lambda x: '%.2f%%' % (x * 100))
  7. pinshu_df['累計頻率f'] = pinshu_df['頻率f'].cumsum()
  8. pinshu_df['累計頻率%'] = pinshu_df['累計頻率f'].map(lambda x: '%.4f%%' % (x * 100))
  9. print(pinshu_df)
  10. print()
  11. print("李運辰")

從薪資範圍來看,在10000-20000之間站大多數,基本很不錯的薪資,大於20000+的很有一些,真是誘惑太大了

想要獲取更多Python學習資料可以加QQ:2955637827私聊或加Q群630390733大家一起來學習討論吧!