引言
拉勾網,作為互聯網招聘領域的佼佼者,匯聚了海量且多樣的職位招聘信息。這些信息涵蓋了從新興科技領域到傳統行業轉型所需的各類崗位,無論是初出茅廬的應屆生,還是經驗豐富的職場老手,都能在其中探尋到機遇。
對于求職者而言,能夠快速、全面地掌握招聘職位的詳細情況,如薪資待遇的高低、工作地點的便利性、職位描述所要求的技能與職責等,無疑能在求職路上搶占先機。而企業方,通過分析同行業職位信息的發布趨勢、薪資水平的波動,也可為制定更具吸引力的招聘策略提供有力依據。
接下來,就讓我們看看如何運用 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 協議,不越界訪問禁止區域。只有如此,才能確保爬蟲技術在合法合規的軌道上穩健前行,實現數據獲取與網站運營的和諧共生。