Python爬蟲某招聘網站的崗位信息

 

 

前言

文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html

做者:阿爾法遊戲python

PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取http://t.cn/A6Zvjdunweb

故事又要從一個盆友提及chrome

昨晚有個盆友 問我 爬蟲學的怎麼樣了?json

正當我不明因此之際,盆友的微信語音通話接了進來api

友:「看你在學python,爬蟲寫的怎麼樣了呀,我想抓一下某招聘網站的數據,能幫我整一個嗎,不行的話我也去看看」瀏覽器

我:「哦哦,你不是技術嘛,本身來嘛安全

友:「我不是沒怎麼接觸過嘛」服務器

我:「行,恰好我也學習下,週末有時間我幫你看下」微信

簡單介紹下這個朋友吧,遊戲圈某技術大拿,真大拿的那種!!


故事聊完了,我們開工吧

一、前期準備

由於是爬蟲,因此我們須要用到以下幾個庫

  • requests

  • fake_useragent

  • json

  • pandas

Requests 的介紹是這樣的: 惟一的一個非轉基因的 Python HTTP 庫,人類能夠安全享用

反正就是你用來獲取網頁數據須要用到的,本次我們只須要用到get方法:

res=request.get(url)構造一個向服務器請求資源的url對象, 這個對象是Request庫內部生成的, 這時候的res返回的是一個包含服務器資源的Response對象,包含從服務器返回的全部的相關資源。

fake_useragent 直譯就是 假身份,做用和直譯基本同樣,是個表裏不一的「人」

UserAgent是識別瀏覽器的一串字符串,至關於瀏覽器的身份證,在利用爬蟲爬取網站數據時,頻繁更換UserAgent能夠避免觸發相應的反爬機制。fake-useragent對頻繁更換UserAgent提供了很好的支持,可謂防反扒利器。

json 就是上期咱們原本打算介紹可是換了一個庫實現的 用於處理json數據,能夠將已編碼的 JSON 字符串解碼爲 Python 對象

pandas 是咱們的老朋友了,由於常和excel打交道,對錶格的鐘愛,因此pandas在這裏主要做用只是將抓取的數據轉化爲dataframe型後導出成excel表

導入須要用到的庫
import requests
from fake_useragent import UserAgent
import json
import pandas as pd
import time

二、任務分析

其實這步應該在 第1步 前期準備 以前,可是文檔寫到了這裏,咱也不想回去了。

這一步很關鍵,主要是思路分析,大體能夠分爲如下幾點:

  •  明確你須要的數據是什麼

  •  找到你須要的數據來源

  •  理清原始數據的結構

  •  輸出你須要的數據形式

1)明確你須要的數據

好比盆友須要崗位信息,包含哪些字段,常規的有崗位名稱、薪酬範圍、須要的工做年限等等。當你明確須要的數據指標以後,你再去數據來源看是否有這些指標已經如何獲取。

崗位 薪酬 年限
運營 30-50k 5-8年
技術 30-50k 5-8年
2)找到你須要的數據來源

盆友須要的是脈脈上的崗位信息,那麼咱們須要熟悉脈脈的崗位信息在哪可見,以及它們是如何展現的。

這是移動端

移動端無法直接獲取url信息,咱們能夠去pc端看看

這是pc端

這裏pc端用的是Google Chrome瀏覽器 爲了讓你可以點開xhr等等,你須要安裝一個瀏覽器工具

下載瀏覽器驅動程序:http://chromedriver.storage.googleapis.com/index.html

查看驅動和瀏覽器版本的映射關係:http://blog.csdn.net/huilan_same/article/details/51896672

pc端是一個列表,咱們經過下拉能夠加載更多,這說明這個頁面是非靜態頁面,所以在獲取url的時候須要特別注意。

操做流程:

  • 第1步,獲取數據源URL地址: F12 打開瀏覽器開發者工具調試頁面,選中network——xhr,刷新網頁後選擇 招聘,能夠看見右側有刷新調試頁面有內容刷新,選中最近一個刷新的條目便可獲取數據源url地址,見右側的request URL內容便是。

  • 第2步,找到該URL地址規律: url = 'https://maimai.cn/sdk/company/obtian_company_job?webcid=jYZTTwkX&count=20&page=0&job_title='(你點了應該會提示沒數據),仔細分析,咱們能夠獲得動態變化部分應該爲count和page,count表示每頁20個,page表示當前頁數。經過修改count和page後再瀏覽器打開咱們驗證了該判斷。

  • 第3步,獲取數據源URL地址: 由於網頁動態,這裏建議把cookie記錄下來備用,cookie數據在request Header中。

3)理清原始數據的結構

當咱們獲取到數據來源url以後,就須要理清這些原始數據長啥樣,如此纔好去解析整理出想要的信息。打開一個url,咱們發現是一個json,嗯,很完整的多層json。

網頁json圖

使用json.loads方法作簡單的預處理,而後咱們一層一層尋找目標數據指標所在。

【這裏我是經過spyder變量管理器 點開數據 讓你們直觀理解】

  • 第一層:字典

  • 第二層:字典

  • 第三層:列表

  • 第四層:字典

4)輸出你須要的數據

經過理清原始數據結構,結合你須要的數據,我們就能夠進行數據簡單過濾選擇了

直接建立一個空字典,存儲你須要的數據信息

三、實現細節

1)材料準備

將url按照規律進行拆分

#url裏count和page是變化的規律所在,自選一個進行循環
#因脈脈沒有通用的崗位list彙總頁面,所以若是想獲取其餘list能夠經過搜索或者查詢指定公司職位後修改url便可
#url = https://maimai.cn/sdk/company/obtian_company_job?webcid=jYZTTwkX&count=20&page=50&job_title=

path = 'https://maimai.cn/sdk/company/obtian_company_job?webcid=jYZTTwkX&count=20&page='
tail = '&job_title='

#這裏須要注意,必定要加cookie,不然將獲取不到數據
headers = {"User-Agent": UserAgent(verify_ssl=False).random,
"Cookie":'填入你本身的瀏覽器cookie值'}
2)數據請求

請求數據並用json.load()簡單進行數據類型轉化python對象

#建立空list,用於存儲抓取的崗位信息(字典存儲)
list = []
#計數用的變量n
n = 0
#因單頁顯示20條崗位信息,因此須要翻頁(實際網頁效果是下拉加載更多)
#數據爲json,所以須要json.load 解析
for i in range(0,51): #我這裏只去前50頁數據
url = path + str(i) +tail
response_comment = requests.get(url,headers = headers)
json_comment = response_comment.text
json_comment = json.loads(json_comment)
3)數據篩選

接上個for循環,由於每頁內有20條數據,所以須要再用一個循環取出每條數據並存入一個空字典中,同時將每一個字典合到空列表中進行彙總

data = json_comment['data']

#單頁顯示20條崗位信息,逐一採集
for i in range(len(data['normal_data'])):
n = n+1
#建立空字典用於存儲單個崗位信息
result = {}
result['工做年限'] = data['normal_data'][i]['worktime']
result['學歷要求'] = data['normal_data'][i]['degree']
result['職位描述'] = data['normal_data'][i]['description']
result['公司名稱'] = data['normal_data'][i]['company']
result['工做地點'] = data['normal_data'][i]['city']
result['職位名稱'] = data['normal_data'][i]['position']
result['崗位薪酬'] = data['normal_data'][i]['salary_info']
result['最近修改時間'] = data['normal_data'][i]['modify_time']
result['發佈時間'] = data['normal_data'][i]['pub_time']
result['瀏覽量'] = data['normal_data'][i]['views']
result['發佈人職位'] = data['normal_data'][i]['user']['position'].upper()
#將崗位信息存入list中
list.append(result)
4)數據導出

直接使用pandas的to_excel方法導出數據成excel

#將存有崗位信息的列表轉化爲dataframe表格形式   
df = pd.DataFrame(list)
df.to_excel(r'F:\Python\崗位數據.xlsx',sheet_name='崗位信息',index = 0
5)結果展現

 

四、完整代碼

import requestsfrom fake_useragent import UserAgentimport jsonimport pandas as pdimport timestart_time = time.perf_counter()#url裏count和page是變化的規律所在,自選一個進行循環#因脈脈沒有通用的崗位list彙總頁面,所以若是想獲取其餘list能夠經過搜索或者查詢指定公司職位後修改url便可#url = https://maimai.cn/sdk/company/obtian_company_job?webcid=jYZTTwkX&count=20&page=50&job_title=path = 'https://maimai.cn/sdk/company/obtian_company_job?webcid=jYZTTwkX&count=20&page='tail = '&job_title='#這裏須要注意,必定要加cookie,不然將獲取不到數據headers = {"User-Agent": UserAgent(verify_ssl=False).random,           "Cookie":'你的cookie'}#建立空list,用於存儲抓取的崗位信息(字典存儲)list = []#計數用的變量nn = 0 #因單頁顯示20條崗位信息,因此須要翻頁(實際網頁效果是下拉加載更多)#數據爲json,所以須要json.load 解析for i in range(1,2):    url = path + str(i) +tail    response_comment = requests.get(url,headers = headers)    json_comment = response_comment.text    json_comment = json.loads(json_comment)        data = json_comment['data']#    print('\r正在抓取第%d頁崗位信息(每頁20個崗位)'%i,end=' ')#單頁顯示20條崗位信息,逐一採集    for i in range(len(data['normal_data'])):        n = n+1        #建立空字典用於存儲單個崗位信息        result = {}        result['工做年限'] = data['normal_data'][i]['worktime']        result['學歷要求'] = data['normal_data'][i]['degree']        result['職位描述'] = data['normal_data'][i]['description']        result['公司名稱'] = data['normal_data'][i]['company']        result['工做地點'] = data['normal_data'][i]['city']        result['職位名稱'] = data['normal_data'][i]['position']        result['崗位薪酬'] = data['normal_data'][i]['salary_info']        result['最近修改時間'] = data['normal_data'][i]['modify_time']        result['發佈時間'] = data['normal_data'][i]['pub_time']        result['瀏覽量'] = data['normal_data'][i]['views']        result['發佈人職位'] = data['normal_data'][i]['user']['position'].upper()        #將崗位信息存入list中           list.append(result)        print('\r已整合%d個崗位信息'%n,end=' ')        use_time = time.perf_counter()print('\n合計運行時長:{0:.2f} 秒'.format(use_time-start_time))#將存有崗位信息的列表轉化爲dataframe表格形式   df = pd.DataFrame(list)df.to_excel(r'F:\Python\脈脈-字節跳動招聘崗位.xlsx',sheet_name='崗位信息',index = 0)
相關文章
相關標籤/搜索