Python 爬蟲實戰案例 - 獲取拉勾網招聘職位信息

引言

拉勾網,作為互聯網招聘領域的佼佼者,匯聚了海量且多樣的職位招聘信息。這些信息涵蓋了從新興科技領域到傳統行業轉型所需的各類崗位,無論是初出茅廬的應屆生,還是經驗豐富的職場老手,都能在其中探尋到機遇。

對于求職者而言,能夠快速、全面地掌握招聘職位的詳細情況,如薪資待遇的高低、工作地點的便利性、職位描述所要求的技能與職責等,無疑能在求職路上搶占先機。而企業方,通過分析同行業職位信息的發布趨勢、薪資水平的波動,也可為制定更具吸引力的招聘策略提供有力依據。

接下來,就讓我們看看如何運用 Python 爬蟲從拉勾網獲取關鍵的招聘信息。

目錄

一、實戰目標

二、技術路線

三、數據爬取

3.1 網頁分析

3.2 網頁請求

3.3 網頁解析

3.4 保存數據

總結


一、實戰目標

本次實戰的核心目標是精準抓取拉勾網特定職位的關鍵招聘信息。具體而言,要獲取的信息涵蓋:職位名稱,它如同求職路上的指南針,能讓求職者迅速定位職業方向;薪資范圍,這是求職者關注的重點,也是衡量自身價值與市場行情的關鍵標尺;公司名稱,背后關聯著企業的規模、文化與發展前景;

二、技術路線

requests:用于發送HTTP請求,獲取網頁內容。

BeautifulSoup:用于解析HTML頁面,提取所需的信息。

csv:用于將爬取的數據存儲為CSV文件,便于后續分析。

三、數據爬取

3.1 網頁分析

拉勾網的職位列表頁,清晰明了的卡片式設計呈現了眾多招聘信息,關鍵數據一目了然。仔細觀察其 URL,不難發現其中蘊含的規律,如職位關鍵詞、城市代碼、頁碼等參數巧妙嵌入,以 “https://www.lagou.com/wn/jobsfromSearch=true&kd=python&pn=1&city=%E8%A5%BF%E5%AE%89” 職位關鍵詞 /city = 城市代碼、kd = 關鍵職位、pn = 頁碼” 為例,這種結構為精準定位不同職位、不同地區的招聘頁面提供了線索,pn 參數可以協助我們獲取多分頁的信息。

分析后我們可以知道,職位信息都在class_=‘item__10RTO’ 的div元素下,可以通過id=‘openWinPostion’、class_=‘money__3Lkgq’、class_=‘company-name__2-SjF’ 來分別獲取職位名稱、薪資范圍和公司名稱。

3.2 網頁請求

在 Python 的工具庫中,requests 庫能高效地向目標網站發送 HTTP 請求,幫我們牽線搭橋獲取網頁內容。不過,拉勾網為了維護自身數據的有序訪問,設置了一些防護機制,我們得像智慧的訪客一樣巧妙應對。

首先,合理設置請求頭(headers)至關重要,它就像是我們拜訪網站時遞出的名片,告知對方我們是友好且正常的瀏覽器訪問。模擬常見瀏覽器的 User-Agent 字段,如 “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36”,讓服務器誤以為我們是普通用戶操作。同時,Referer 字段也不可忽視,它記錄著請求的來源頁面,保持其合理性,能避免一些不必要的攔截。最后,如果網站有動態驗證的話我們需要設置 Cookie ,可以從自己瀏覽器訪問記錄中找到Cookie參數。

# 拉勾網職位招聘信息爬取與數據分析
import requests# 模擬瀏覽器頭部信息
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36","Referer": "https://www.lagou.com/jobs/list_python?px=default","Cookie": "index_location_city=%E5%85%A8%E5%9B%BD; user_trace_token=20250104093938-902c4ff5-f24c-45e5-aec2-3d1473035947; __lg_stoken__=a8290517006006e881e7779a471d837c8e507eea47d1d1fa6cc1ad03ccb44cefb814362b5ac691966eb8697d786c6e53e4f6c233c3d4eaa9ba7c50ac63afc8f768fef09ed4ae; JSESSIONID=ABAACCCABBFAAGBFE0BC31D870268EB481847F272508F4B; WEBTJ-ID=20250104094035-1942ef8a924bd-0dd7463ae6d789-26001851-1049088-1942ef8a9253d2; LGUID=20250104093941-930407fa-f7e8-4c42-81fc-756f97aefcb1; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735954836; HMACCOUNT=D7BB61FCD5F74C1A; sajssdk_2015_cross_new_user=1; _ga=GA1.2.694435554.1735954836; _gid=GA1.2.74502511.1735954836; X_MIDDLE_TOKEN=bd70439f6dca25617ea4b718273bbf6d; SEARCH_ID=6e9a4c0e27e34ae3929ec6c60a10d1f7; X_HTTP_TOKEN=1226f88b1a607ea4951559537134b7e1ae0350e7f1; sensorsdata2015session=%7B%7D; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735955277; LGRID=20250104094702-51a5d712-8f33-46b0-a616-3b54c420e4a4; _ga_DDLTLJDLHH=GS1.2.1735954837.1.1.1735955277.60.0.0; gate_login_token=v1####df3b53f43f17d1db42f281952270b469e8255336da4736f3; LG_LOGIN_USER_ID=v1####5496aa08cbf5a8587c4797982411a6af15950cd637352b0a; LG_HAS_LOGIN=1; _putrc=B6E2CB0ECCED9CDE; login=true; unick=%E7%94%B3%E7%99%BB%E5%B3%B0; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; privacyPolicyPopup=true; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22%24device_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24os%22%3A%22Windows%22%2C%22%24browser%22%3A%22Chrome%22%2C%22%24browser_version%22%3A%22121.0.0.0%22%7D%7D"
}# 目標URL,以Python職位為例,搜索西安地區,第一頁數據,pn為頁碼,kd為職位關鍵詞
url = "https://www.lagou.com/wn/jobs?fromSearch=true&kd=python&pn=1&city=%E8%A5%BF%E5%AE%89"# 發送get請求,獲取響應
res = requests.get(url, headers=headers)
html = res.text
print(html)

在這段代碼中,我們精心構建了請求頭和請求參數,并發起 GET請求,若請求順利,便能獲得網頁數據,為后續的數據解析鋪就道路。

3.3 網頁解析

當我們成功取回網頁的 HTML 內容,需要合適的工具來解讀其中的奧秘。在這里,我們使用BeautifulSoup來獲取想要的信息。我們已獲取到拉勾網職位列表頁的 HTML 內容,存儲在變量 html 中,提取職位名稱、薪資、公司名稱等信息的代碼如下:

from bs4 import BeautifulSoupjob_list = []
# 創建BeautifulSoup對象,選用html.parser解析器
soup = BeautifulSoup(html, 'html.parser')# 查找所有職位列表項
job_list_items = soup.find_all('div', class_='item__10RTO')for item in job_list_items:# 提取職位名稱job_title = item.find(id='openWinPostion').text.strip()# 提取薪資范圍salary = item.find('span', class_='money__3Lkgq').text.strip()# 提取公司名稱company_name = item.find('div', class_='company-name__2-SjF').text.strip()# 將職位信息寫入列表job_list.append({"job_title": job_title, "salary": salary, "company_name": company_name})print(job_list)

在這段代碼里,我們先創建了 BeautifulSoup 對象,然后定義了列表用于臨時存儲職位信息,接著利用 find_all 方法依據類名找出所有職位列表項,再深入每個列表項,通過標簽與屬性的組合,精準抓取職位名稱、薪資、公司名稱等關鍵信息,將其清晰呈現。

3.4 保存數據

辛苦抓取并解析得到的數據,需要妥善保存才能讓其價值延續。常見的 CSV、JSON 等格式,各有千秋。

CSV 格式,以其簡潔的表格形式,通用性強,能被 Excel 等眾多軟件直接打開編輯,方便數據的初步查看與簡單分析。Python 內置的 csv 模塊便能擔此大任。以下是將獲取到的拉勾網職位數據保存為 CSV 文件的示例:

import csv# CSV文件路徑
csv_file_path = "lagou_jobs.csv"# 寫入CSV文件
with open(csv_file_path, 'w', newline='', encoding='utf-8') as csvfile:fieldnames = ['job_title', 'salary', 'company_name']  # 定義列名writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader()  # 寫入表頭writer.writerows(job_list)  # 寫入數據行print(f"數據已成功保存至 {csv_file_path}")

在這段示例中,我們首先定義了 CSV 文件路徑,運用 csv.DictWriter 以字典形式將數據逐行寫入 CSV 文件,同時寫入表頭,確保數據存儲的規范性與完整性,方便后續隨時調取分析。

最后對代碼進行整理優化,并增加多頁面處理。

# 爬取拉勾網職位招聘信息
import requests
from bs4 import BeautifulSoup
import csvdef get_html(url):# 模擬瀏覽器頭部信息headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36","Referer": "https://www.lagou.com/jobs/list_python?px=default","Cookie": "index_location_city=%E5%85%A8%E5%9B%BD; user_trace_token=20250104093938-902c4ff5-f24c-45e5-aec2-3d1473035947; __lg_stoken__=a8290517006006e881e7779a471d837c8e507eea47d1d1fa6cc1ad03ccb44cefb814362b5ac691966eb8697d786c6e53e4f6c233c3d4eaa9ba7c50ac63afc8f768fef09ed4ae; JSESSIONID=ABAACCCABBFAAGBFE0BC31D870268EB481847F272508F4B; WEBTJ-ID=20250104094035-1942ef8a924bd-0dd7463ae6d789-26001851-1049088-1942ef8a9253d2; LGUID=20250104093941-930407fa-f7e8-4c42-81fc-756f97aefcb1; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735954836; HMACCOUNT=D7BB61FCD5F74C1A; sajssdk_2015_cross_new_user=1; _ga=GA1.2.694435554.1735954836; _gid=GA1.2.74502511.1735954836; X_MIDDLE_TOKEN=bd70439f6dca25617ea4b718273bbf6d; SEARCH_ID=6e9a4c0e27e34ae3929ec6c60a10d1f7; X_HTTP_TOKEN=1226f88b1a607ea4951559537134b7e1ae0350e7f1; sensorsdata2015session=%7B%7D; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1735955277; LGRID=20250104094702-51a5d712-8f33-46b0-a616-3b54c420e4a4; _ga_DDLTLJDLHH=GS1.2.1735954837.1.1.1735955277.60.0.0; gate_login_token=v1####df3b53f43f17d1db42f281952270b469e8255336da4736f3; LG_LOGIN_USER_ID=v1####5496aa08cbf5a8587c4797982411a6af15950cd637352b0a; LG_HAS_LOGIN=1; _putrc=B6E2CB0ECCED9CDE; login=true; unick=%E7%94%B3%E7%99%BB%E5%B3%B0; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; privacyPolicyPopup=true; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22%24device_id%22%3A%221942ef8ab81cd-06cd07b2b912ae-26001851-1049088-1942ef8ab822d7%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24os%22%3A%22Windows%22%2C%22%24browser%22%3A%22Chrome%22%2C%22%24browser_version%22%3A%22121.0.0.0%22%7D%7D"}# 發送get請求,獲取響應res = requests.get(url, headers=headers)html = res.textif res.status_code == 200:print(f"請求成功,狀態碼:{res.status_code}")else:print(f"請求失敗,狀態碼:{res.status_code}")return htmldef get_alljobs(html):job_list = []# 創建BeautifulSoup對象,選用html.parser解析器soup = BeautifulSoup(html, 'html.parser')# 查找所有職位列表項job_list_items = soup.find_all('div', class_='item__10RTO')for item in job_list_items:# 提取職位名稱job_title = item.find(id='openWinPostion').text.strip()# 提取薪資范圍salary = item.find('span', class_='money__3Lkgq').text.strip()# 提取公司名稱company_name = item.find('div', class_='company-name__2-SjF').text.strip()# 將職位信息寫入列表job_list.append({"job_title": job_title, "salary": salary, "company_name": company_name})return job_listdef save_to_csv(job_list):# CSV文件路徑csv_file_path = "lagou_jobs.csv"# 寫入CSV文件with open(csv_file_path, 'w', newline='', encoding='utf-8') as csvfile:fieldnames = ['job_title', 'salary', 'company_name']  # 定義列名writer = csv.DictWriter(csvfile, fieldnames=fieldnames)writer.writeheader()  # 寫入表頭writer.writerows(job_list)  # 寫入數據行return f"數據已成功保存至 {csv_file_path}"if __name__ == "__main__":# 目標URL,以Python職位為例,搜索西安地區,第一頁數據,pn為頁碼,kd為職位關鍵詞base_url = "https://www.lagou.com/wn/jobs?fromSearch=true&kd=python&city=%E8%A5%BF%E5%AE%89"# 配置頁碼數量num_pages = 3# 定義一個空列表,存儲所有的職位jobs = []for i in range(1, num_pages+1):url = f"{base_url}&pn={i}"html = get_html(url)job_list = get_alljobs(html)jobs.extend(job_list)save_to_csv(jobs)print("爬取完成,數據已保存至 lagou_jobs.csv")

總結

本文通過詳細步驟展示了如何使用Python爬取拉勾網的職位招聘信息。我們使用了requests、BeautifulSoup、csv等常見庫完成拉勾網數據的抓取、解析與存儲,并且介紹了如何處理反爬蟲機制、分頁問題以及數據存儲。

在享受爬蟲技術帶來便利的同時,務必銘記要遵循網站規則。合理設置爬取頻率,模擬真實用戶行為,不惡意沖擊服務器;尊重網站的 robots.txt 協議,不越界訪問禁止區域。只有如此,才能確保爬蟲技術在合法合規的軌道上穩健前行,實現數據獲取與網站運營的和諧共生。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72984.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LM Studio 替換源的方式解決huggingface.co無法訪問的問題

安裝軟件完成之后,不要打開,打開了就直接關閉 在安裝目錄下,比如我安裝在E:\Program Files\LM Studio 下面三個文件中的huggingface.co全部替換為hf-mirror.com然后再打開即可。 E:\Program Files\LM Studio\resources\app\.webpack\rende…

【模擬CMOS集成電路設計】帶隙基準(Bandgap)設計與仿真(基于運放的電流模BGR)

【模擬CMOS集成電路設計】帶隙基準(Bandgap)設計與仿真 前言工程文件&部分參數計算過程,私聊~ 一、 設計指標指標分析: 二、 電路分析三、 仿真3.1仿真電路圖3.2仿真結果(1)運放增益(2)基準溫度系數仿真(3)瞬態啟動仿真(4)靜態…

微服務拆分-遠程調用

我們在查詢購物車列表的時候,它有一個需求,就是不僅僅要查出購物車當中的這些商品信息,同時還要去查到購物車當中這些商品的最新的價格和狀態信息,跟購物車當中的快照進行一個對比,從而去提醒用戶。 現在我們已經做了服…

機動車授權簽字人考試的報名條件是什么?

機動車授權簽字人考試的報名條件通常如下: 學歷職稱與工作經驗要求 中級職稱及以上:應具備中級及以上專業技術職稱,且從事相關檢驗檢測工作三年及以上。如果承檢車型有專項作業車、大型客車、校車和危險貨物運輸車等,若不是相關專…

智慧工廠監測信息系統:構筑安全的數字化未來

在現代工業的浪潮中,智慧工廠已成為推動生產效率和產品質量提升的關鍵力量。為了確保這一先進生產模式的穩健運行,智慧工廠監測信息系統應運而生,并通過一系列安全措施,為企業的數字化轉型保駕護航。 安全注冊,筑牢第…

P2P中NAT穿越方案(UDP/TCP)(轉)

轉自:P2P中NAT穿越方案(UDP/TCP)_udp反向鏈接-CSDN博客 同:P2P中NAT穿越方案(UDP/TCP) - 知乎 (zhihu.com) 本文介紹了傳統基于udp的打洞方式,更進一步闡述了tcp打洞的原理,是對于…

算法 之 樹形dp 樹的中心、重心

文章目錄 重心實踐題目小紅的陡峭值 在樹的算法中,求解樹的中心和重心是一類十分重要的算法 求解樹的重心 樹的重心的定義:重心是樹中的一個節點,如果將這個點刪除后,剩余各個連通塊中點數的最大值最小,那么這個節點…

游戲引擎學習第146天

音高變化使得對齊讀取變得不可能,我們可以支持循環聲音了。 我們今天的目標是完成之前一段時間所做的音頻代碼。這個項目并不依賴任何引擎或庫,而是一個教育項目,目的是展示從頭到尾運行一個游戲所需要的全部代碼。無論你對什么方面感興趣&a…

深入理解MySQL主從原理

導讀 高鵬(網名八怪),《深入理解MySQL主從原理》系列文的作者。 本系列通過GTID、Event、主庫、從庫、案例分析,五大塊來詳細講解主從原理。 這篇文章重在學習筆記整理! 在學習《深入理解MySQL主從原理》一書時&…

前端數據模擬利器 Mock.js 深度解析

前端數據模擬利器 Mock.js 深度解析 一、Mock.js 核心價值 1.1 為何需要數據模擬 前后端并行開發加速接口文檔驅動開發異常場景模擬測試演示環境數據構造 1.2 Mock.js 核心能力 // 典型數據生成示例 Mock.mock(/api/user, {"users|5-10": [{"id|1": 1…

Phi-4-multimodal:圖、文、音頻統一的多模態大模型架構、訓練方法、數據細節

Phi-4-Multimodal 是一種參數高效的多模態模型,通過 LoRA 適配器和模式特定路由器實現文本、視覺和語音/音頻的無縫集成。訓練過程包括多階段優化,確保在不同模式和任務上的性能,數據來源多樣,覆蓋高質量網絡和合成數據。它的設計…

前后端數據加密傳輸【最佳方案】

AES和RSA區別 算法類型安全性密鑰長度/輸出長度速度應用場景AES對稱加密高128位、192位、256位快適用于大規模數據加密,入HTTPS協議的數據傳輸RSA非對稱加密高1024位、2048位、4096位較慢適用于數據安全傳輸、數字簽名和身份驗證 綜上:兼顧安全性和性能…

Unity--Cubism Live2D模型使用

了解LIVE2D在unity的使用--前提記錄 了解各個組件的作用 Live2D Manuals & Tutorials 這些文件都是重要的控制動畫參數的 Cubism Editor是編輯Live2D的工具,而導出的數據的類型,需要滿足以上的條件 SDK中包含的Cubism的Importer會自動生成一個Pref…

Linux | Vim 鼠標不能右鍵粘貼、跨系統復制粘貼

注:本文為 “ Vim 中鼠標右鍵粘貼、跨系統復制粘貼問題解決方案” 相關文章合輯。 未整理去重。 Linux 入門:vim 鼠標不能右鍵粘貼、跨系統復制粘貼 foryouslgme 發布時間 2016 - 09 - 28 10:24:16 Vim基礎 命令模式(command-mode)插入模式(insert-m…

Flink-DataStreamAPI-執行模式

一、概覽 DataStream API支持不同的運行時執行模式,我們可以根據用例的要求和作業的特征進行選擇。 STREAMING執行模式:被稱為“經典”執行模式為,主要用于需要持續增量處理并且預計無限期保持在線的無界作業BATCH執行模式:類似…

解決VScode 連接不上問題

問題 :VScode 連接不上 解決方案: 1、手動殺死VS Code服務器進程,然后重新嘗試登錄 打開xshell ,遠程連接服務器 ,查看vscode的進程 ,然后全部殺掉 [cxqiZwz9fjj2ssnshikw14avaZ ~]$ ps ajx | grep vsc…

C#類型轉換基本概念

一、基本定義? C# 類型轉換是將數據從一種類型轉換為另一種類型的過程,分為 ?隱式轉換? 和 ?顯式轉換? 兩類?。 強類型語言特性?:C# 要求變量類型在編譯時確定,類型轉換需滿足兼容性或顯式規則?。目的?:處理不同數據類…

使用阿里云操作系統控制臺排查內存溢出

引言 操作系統控制臺是阿里云最新推出的一款智能運維工具,專為提升運維效率、優化服務器管理而設計。它集成了多種運維管理功能,包括操作系統助手、插件管理器以及其他實用工具,為用戶提供一站式的運維解決方案。無論是個人開發者還是企業運…

(C/S)架構、(B/S)架構

客戶機/服務器(C/S)架構 理論描述: 客戶機/服務器架構是一種網絡架構風格,其中任務被分配給網絡中的不同計算機,以提高效率和靈活性。這種架構由兩部分組成:客戶端(Client)和服務器&…

混合存儲HDD+SSD機型磁盤陣列,配上SSD緩存功能,性能提升300%

企業日常運行各種文件無處不在,文檔、報告、視頻、應用數據......面對成千上萬的文件,團隊之間需要做到無障礙協作,員工能夠即時快速訪問、共享處理文件。隨著業務增長,數字化辦公不僅需要大容量,快速高效的文件訪問越…