[requests,pyquery]爬取獵聘網職位信息
為了獲得數據分析相關崗位的地域分布、行業分布、薪酬以及要求技能等信息,編寫爬蟲對獵聘網職位信息進行爬取。未使用scrapy等爬蟲框架,主要使用requests與pyquery獲取與解析網頁,使用multiprocessing實現多線程爬取。
源代碼與爬取數據
Github: Ruiww/LiePinAnalysis
數據:dataanalysis_liepin.csv
共27633條職位信息,條件:全國,一個月內發布,企業職位,關鍵詞"數據分析"
獵聘網職位爬取及分析系列文章已全部完成
系列文章二:[MySQL]獵聘網數據分析職位數據清洗
系列文章三:[python,pandas]數據分析求職指南——獵聘網數據分析職位解析
準備工作
- 安裝python,版本3.6
- 安裝requests,版本2.18.4
- 安裝pyquery,版本1.2.17
- 安裝pymongo,版本3.5.1
- 安裝PyMySql,版本0.7.11
參考
- Requests: HTTP for Humans:requests.get()用法,如何獲取網頁代碼,添加headers
- pyquery - PyQuery complete API - pyquery 1.2.4 documentation):CSS篩選器方法
- PyMongo 3.5.1 Documentation:mongoDB資料庫對象初始化及數據存入方法
- Python3 MySQL 資料庫連接:菜鳥教程中關於使用python3操作MySQL的介紹
實現流程
嵌套循環
獵聘網搜索頁面最多只顯示前100頁,因此分行業進行遍歷。
遍歷網頁時嵌套三層循環:
- 遍歷行業
- 遍歷同一行業索引頁
- 遍歷同一索引頁內所有職位詳情頁
流程圖
代碼解析
main.py 爬取開始代碼,在其中可以修改想要爬取的職位搜索條件,以及爬取進程數等
spider.py 定義爬取過程中調用各種函數
config.py 配置參數文檔,資料庫相關參數及請求頭(headers)可在其中修改
main.py
定義起始頁,確定運行線程數
使用for循環,調用spider(in spider.py)循環解析每個行業
- start_url : 爬蟲起始網頁,代碼中使用篩選條件為 『全國 1個月內 企業職位 key=數據分析』對應頁的url
config.py
mongoDB參數
用於mongoDB初始化
mongo_url = localhost n mongo_DB = LiePin n mongo_table = LiePin_Analysis n
請求頭參數
獲取網頁時使用的請求頭,User-Agent從Agent池中隨機選用,模仿瀏覽器訪問,避免被網站禁止連接
- user_Agent:list形式,保存多個用於請求頭的User_Agent形成Agent池
- ua:隨機獲取user_Agent中一個字元串的值
ua = random.choice(user_Agent)n
- hds:requests.get()調用的請求頭
hds[User-Agent] = ua
spider.py
index_page_html(industry,cur_page,industry_url)
返回索引頁源代碼
- industry_url:待解析的網頁
- industry,cur_page:輸入url對應頁面搜索結果的行業與頁碼,debug時便於定位發生錯誤的網頁
import requestsn import timen #TIPS:requests.get()添加headers參數,模擬瀏覽器訪問,避免網頁禁止訪問n response = requests.get(index_url, headers=hds, timeout=5)n time.sleep(3) #暫停3s,避免過於頻繁訪問,導致爬蟲被禁n
get_industry_url(start_page_html)
解析起始頁源代碼,返回各行業搜索結果索引頁第一頁的url
get_next_page_url(industry,cur_page,index_html)
解析當前索引頁,返回下一頁的url,實現翻頁
- index_html:當前索引頁源代碼
- industry,cur_page:當前索引頁對應的行業與頁碼,debug時便於定位發生錯誤的網頁
get_detail_page_url(index_html)
解析索引頁中包含的職位詳情頁url,返回索引頁中所有詳情頁url組成的list及停止變數構成的元組
return tuple = (detail_url_list,stopvalue)
- detail_url_list:當前頁所有職位詳情頁url列表
- stopvalue:default = 0,若索引頁中出現降級搜索,則stopvalue = 1 => 降級搜索的職位不符合要求,停止對該行業職位爬取
detail_url_list = []n stopvalue = 0n for item in index_html(selector).items():n #出現降級搜索代碼,後面的內容是不想要的,因此跳出循環,並停止獲取下一頁n if item(.downgrade-search):n stopvalue = 1n breakn else:n detail_url = item(.job-info h3 a).attr.hrefn if detail_url.find(https://www.liepin.com/job/) >= 0:n detail_url_list.append(detail_url)n else:n passn
get_detail_page_html(industry,cur_page,detail_page_url)
返回職位詳情頁源代碼
parse_detail_page(industry,detail_html)
解析職位詳情頁,返回字典形式的職位
- 重點:頁面元素分析,CSS篩選器
data = {n JobTitle:title, n company:company,n salary:salary, # min-max萬 XX天反饋n position:position, # 工作地 n PubTime:pubtime, # 職位發布時間n qualification:qualification, # 學歷、工作經驗、語言、年齡n tag_list:tag_list, #職位標籤,數量不定n description:description, # 職位描述,一段文字TEXTn industry:industry, #篩選界面的subindustryn industry_detail:industry_detail, #detailpage右側標註的行業或領域n companySize:companySize,#公司人數n comAddress:comAddress,#地址n is_end:is_end # 職位是否已結束 0:False,1:Truen }n
save_to_mongo(industry,cur_page,i,url,data)
保存數據至mongoDB
- industry, cur_page , i , url : 定位保存的職位,i 是該職位在其索引頁上的排序
import pymongon from config.py import mongo_url,mongo_DB,mongo_tablen #初始化mongoDBn client = pymongo.MongoClient(mongo_url)#資料庫連接n db = client[mongo_DB]#資料庫n table = db[mongo_table]#數據表n #存入數據n db[mongo_table].insert(data)n
loop_detail_page(industry,cur_page,detail_page_url_list)
遍歷某一索引頁下所有職位詳情頁,保存職位信息
- industry,cur_page:哪一行業的哪一頁,定位參數,debug時方便定位
- detail_page_url_list:get_detail_page_url獲得的詳情頁url列表
loop_all_page(cur_page,industry,index_html)
函數內調用loop_detail_page,保存職位信息
若存在下一頁,循環調用loop_all_page,實現翻頁功能
#判斷是否出現降級搜索:Y-->stop,N-->next_pagen if stopvalue != 1:n next_page_url = get_next_page_url(industry,cur_page,index_html)n if next_page_url != None:n next_page_html = index_page_html(industry,cur_page,next_page_url)n cur_page += 1n loop_all_page(cur_page,industry,next_page_html)n
spider(parameter)
主體函數,接收main傳遞的參數,並調用loop_all_page開始解析
TIPS
- 本爬蟲用於爬取企業職位類型的職位詳情頁,因獵頭職位等其他類型職位與企業職位詳情頁網頁代碼結構不同,因此並不通用,實現職位通用爬取可添加if判斷語句,並對不同情況分別編寫頁面解析函數
- 對於分行業爬取仍然超過100頁的情況,可通過增加循環嵌套層數,增加篩選維度
推薦閱讀:
※三分鐘學會Scrapy選擇器(selectors)
※敲敲級簡單的鑒別H圖片的小程序
※pandas操作——合併數據集
※如何優雅的「輪帶逛」初級篇——獲取單張圖片
※揣著Django做項目2:組隊