文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。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步 前期準備 以前,可是文檔寫到了這裏,咱也不想回去了。
這一步很關鍵,主要是思路分析,大體能夠分爲如下幾點:
明確你須要的數據是什麼
找到你須要的數據來源
理清原始數據的結構
輸出你須要的數據形式
好比盆友須要崗位信息,包含哪些字段,常規的有崗位名稱、薪酬範圍、須要的工做年限等等。當你明確須要的數據指標以後,你再去數據來源看是否有這些指標已經如何獲取。
崗位 | 薪酬 | 年限 |
---|---|---|
運營 | 30-50k | 5-8年 |
技術 | 30-50k | 5-8年 |
盆友須要的是脈脈上的崗位信息,那麼咱們須要熟悉脈脈的崗位信息在哪可見,以及它們是如何展現的。
這是移動端
移動端無法直接獲取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中。
當咱們獲取到數據來源url以後,就須要理清這些原始數據長啥樣,如此纔好去解析整理出想要的信息。打開一個url,咱們發現是一個json,嗯,很完整的多層json。
網頁json圖
使用json.loads方法作簡單的預處理,而後咱們一層一層尋找目標數據指標所在。
【這裏我是經過spyder變量管理器 點開數據 讓你們直觀理解】
第一層:字典
第二層:字典
第三層:列表
第四層:字典
經過理清原始數據結構,結合你須要的數據,我們就能夠進行數據簡單過濾選擇了
直接建立一個空字典,存儲你須要的數據信息
將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值'}
請求數據並用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)
接上個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)
直接使用pandas的to_excel方法導出數據成excel
#將存有崗位信息的列表轉化爲dataframe表格形式
df = pd.DataFrame(list)
df.to_excel(r'F:\Python\崗位數據.xlsx',sheet_name='崗位信息',index = 0
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)