[requests,pyquery]爬取獵聘網職位信息

為了獲得數據分析相關崗位的地域分布、行業分布、薪酬以及要求技能等信息,編寫爬蟲對獵聘網職位信息進行爬取。未使用scrapy等爬蟲框架,主要使用requests與pyquery獲取與解析網頁,使用multiprocessing實現多線程爬取。

源代碼與爬取數據

Github: Ruiww/LiePinAnalysis

數據:dataanalysis_liepin.csv

共27633條職位信息,條件:全國,一個月內發布,企業職位,關鍵詞"數據分析"

獵聘網職位爬取及分析系列文章已全部完成

系列文章二:[MySQL]獵聘網數據分析職位數據清洗

系列文章三:[python,pandas]數據分析求職指南——獵聘網數據分析職位解析


準備工作

  1. 安裝python,版本3.6
  2. 安裝requests,版本2.18.4
  3. 安裝pyquery,版本1.2.17
  4. 安裝pymongo,版本3.5.1
  5. 安裝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

  1. 本爬蟲用於爬取企業職位類型的職位詳情頁,因獵頭職位等其他類型職位與企業職位詳情頁網頁代碼結構不同,因此並不通用,實現職位通用爬取可添加if判斷語句,並對不同情況分別編寫頁面解析函數
  2. 對於分行業爬取仍然超過100頁的情況,可通過增加循環嵌套層數,增加篩選維度

推薦閱讀:

三分鐘學會Scrapy選擇器(selectors)
敲敲級簡單的鑒別H圖片的小程序
pandas操作——合併數據集
如何優雅的「輪帶逛」初級篇——獲取單張圖片
揣著Django做項目2:組隊

TAG:爬虫计算机网络 | 数据分析 | Python |