實戰爬取BOOS直聘,找到最適合你的職位
說明
最近忙著找工作,想了解一下用人單位的招聘要求,以爬取boss直聘的招聘資訊作為參考。這裡記錄一下的爬取流程,並不作為其它用途!
分析頁面結構
通過分析頁面,發現招聘的詳細資訊都在詳情頁(如下圖),故通過詳情頁來提取招聘內容
設計爬蟲策略
通過列表頁獲取詳細頁的url地址,然後存入到url佇列中,發現列表頁有10頁,這裡使用多執行緒提高爬取效率;
通過url佇列中的詳情頁url地址得到詳情頁的html內容,採用xpath解析,提取招聘資訊,以字典形式存入data佇列中,這裡也採用多執行緒;
將data佇列中的資料儲存為json檔案,這裡每儲存的一個json檔案都是一個列表頁所有的招聘資訊。
頁面請求方式的判斷
不難發現,這裡是通過get請求並新增查詢字串獲取指定頁面的;
查詢字串引數的含義:query=python表示搜尋的職位,page=1表示列表頁的頁碼,ka=page-1這個沒用到可以忽略掉;
對應的程式碼如下:
regx_obj = re.compile(r'<br/>|<(em).*?>.*?</\1>')
def send_request(url_path, headers, param=None):
"""
:brief 傳送請求,獲取html響應(這裡是get請求)
:param url_path: url地址
:param headers: 請求頭引數
:param param: 查詢引數, 如:param = {'query': 'python', 'page': 1}
:return: 返回響應內容
"""
response = requests.get(url=url_path, params=param, headers=headers)
response = regx_obj.sub('', response.text)
return response
通過列表頁獲取詳情頁url
這裡通過xpath語法@href獲取a標籤href屬性值,拿到詳細頁url地址,程式碼如下:
def detail_url(param):
"""
:brief 獲取詳情頁的url地址
:param param: get請求的查詢引數
:return: None
"""
wuhan_url = '/'.join([base_url, "c101200100/h_101200100/"])
html = send_request(wuhan_url, headers, param=param)
# 列表頁頁面
html_obj = etree.HTML(html)
# 提取詳情頁url地址
nodes = html_obj.xpath(".//div[@class='info-primary']//a/@href")
for node in nodes:
detail_url = '/'.join([base_url, node]) # 拼接成完整的url地址
print(detail_url)
url_queue.put(detail_url) # 新增到佇列中
解析詳情頁的資料
通過xpath解析資料,然後將資料儲存為字典放到佇列中,程式碼如下:
def parse_data():
"""
:brief 從html文字中提取指定資訊
:return: None
"""
# # 解析為HTML文件
try:
while True:
# 等待25s,超時則丟擲異常
detail_url = url_queue.get(timeout=25)
html = send_request(detail_url, headers, param=None)
html_obj = etree.HTML(html)
item = {}
# 釋出日期
item['publishTime'] = html_obj.xpath(".//div[@class='info-primary']//span[@class='time']/text()")[0]
# 職位名
item['position'] = html_obj.xpath(".//div[@class='info-primary']//h1/text()")[0]
# 釋出者姓名
item['publisherName'] = html_obj.xpath("//div[@class='job-detail']//h2/text()")[0]
# 釋出者職位
item['publisherPosition'] = html_obj.xpath("//div[@class='detail-op']//p/text()")[0]
# 薪水
item['salary'] = html_obj.xpath(".//div[@class='info-primary']//span[@class='badge']/text()")[0]
# 公司名稱
item['companyName'] = html_obj.xpath("//div[@class='info-company']//h3/a/text()")[0]
# 公司型別
item['companyType'] = html_obj.xpath("//div[@class='info-company']//p//a/text()")[0]
# 公司規模
item['companySize'] = html_obj.xpath("//div[@class='info-company']//p/text()")[0]
# 工作職責
item['responsibility'] = html_obj.xpath("//div[@class='job-sec']//div[@class='text']/text()")[0].strip()
# 招聘要求
item['requirement'] = html_obj.xpath("//div[@class='job-banner']//div[@class='info-primary']//p/text()")[0]
print(item)
jobs_queue.put(item) # 新增到佇列中
time.sleep(15)
except:
pass
儲存資料為json檔案
程式碼如下:
def write_data(page):
"""
:brief 將資料儲存為json檔案
:param page: 頁面數
:return: None
"""
with open('D:/wuhan_python_job_{}.json'.format(page), 'w', encoding='utf-8') as f:
f.write('[')
try:
while True:
job_dict = jobs_queue.get(timeout=25)
job_json = json.dumps(job_dict, indent=4, ensure_ascii=False)
f.write(job_json + ',')
except:
pass
f.seek(0, 2)
position = f.tell()
f.seek(position - 1, 0) # 剔除最後一個逗號
f.write(']')
json資料示例
{
"salary": "4K-6K",
"publisherName": "曾麗香",
"requirement": "城市:武漢經驗:應屆生學歷:本科",
"responsibility": "1、2018屆統招本科畢業,計算機相關專業;2、熟悉python開發;3、良好的溝通表達能力,學習能力強,積極上進;",
"publishTime": "釋出於2018-06-11 12:15",
"companyName": "雲智匯科技",
"position": "軟體開發(python、0年經驗)",
"publisherPosition": "HR主管剛剛線上",
"companySize": "未融資500-999人",
"companyType": "計算機軟體"}
其它
div中存在
標籤,xpath無法獲取div標籤中所有的文字內容(如下圖):
解決辦法:拿到html文字後,提前通過正規表示式剔除該標籤
核心程式碼如下:
正規表示式:去掉標籤中的<br/> 和 <em></em>標籤,便於使用xpath解析提取文字
regx_obj = re.compile(r'<br/>|<(em).*?>.*?</\1>')
response = requests.get(url=url_path, params=param, headers=headers)
response = regx_obj.sub('', response.text)
當爬取速度過快時,會被封ip,這裡將多執行緒改為單執行緒版,並使用time.sleep降低爬取速度
推薦一下我建的python學習交流扣扣qun:850973621,群裡有免費的視訊教程,開發工具、
電子書籍、專案原始碼分享。一起交流學習,一起進步!
作者:white_study
連結:https://www.jianshu.com/p/d293fe5ba56f
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
相關文章
- 爬取 Boss 直聘網上海區域 PHP 職位資訊資料並分析PHP
- 如何找到適宜的前端職位?前端
- Go 高效抓取 Boss直聘職位資料Go
- 爬取 boss 直聘技術崗並分析
- 拉勾網職位資料爬取
- 怎麼才能找到適合你的雲端計算方案
- 女生轉行IT,有哪些合適的方向和職位?
- 寫了個簡單爬蟲,分析 Boss 直聘自動駕駛崗位爬蟲自動駕駛
- 上海高階Java職位熱聘Java
- 如何選擇最好最適合你的MacBookMac
- 如何爬取前程無憂python職位資訊Python
- 邦芒支招:6個建議幫你找到合適的工作
- 應聘dba職位到底需要多少經驗
- Boss直聘轉場動畫的實現動畫
- Pyhton抓取BOSS直聘職位描述和資料清洗,很簡單沒有那麼難
- 利用Python爬蟲獲取招聘網站職位資訊Python爬蟲網站
- 6個最熱門的IT技術職位,薪資有多高?其實你也行!
- 圖片爬取實戰一
- Python爬蟲實戰:爬取淘寶的商品資訊Python爬蟲
- 最適合學Python的幾類人,有你嗎?Python
- 你是最適合創業的程式設計師嗎?創業程式設計師
- 高手教程《三倍投幾期止損最合適》實戰教程
- 獵頭職位(北京)-誠聘JAVA工程師Java工程師
- 爬蟲實戰——58同城租房資料爬取爬蟲
- 最適合參加IT培訓的4類人,有你嗎?
- 對比Memcached和Redis,誰才是適合你的快取?Redis快取
- 如何找到適合網站優化的內容?網站優化
- 如何用資料探勘找到合適房源?
- 爬蟲實戰(一):爬取微博使用者資訊爬蟲
- 哪個檔案系統最適合你的 Linux 系統?Linux
- Puppeteer 實戰-爬取動態生成的網頁網頁
- Java與Python:哪一個最適合你? - computersciencehubJavaPython
- 這五類人最適合轉Web前端,有你嗎?Web前端
- python爬蟲實戰:爬取西刺代理的代理ip(二)Python爬蟲
- 程式設計師跳槽,到底選擇什麼時間辭職最合適?程式設計師
- 利用 Python 找出適合你的國考市考公務員崗位Python
- 如何在網路上找到適合的外鏈平臺
- Python爬蟲實戰詳解:爬取圖片之家Python爬蟲