Python3獲取拉勾網(wǎng)招聘信息的方法實(shí)例
前言
為了了解跟python數(shù)據(jù)分析有關(guān)行業(yè)的信息,大概地了解一下對(duì)這個(gè)行業(yè)的要求以及薪資狀況,我決定從網(wǎng)上獲取信息并進(jìn)行分析。既然想要分析就必須要有數(shù)據(jù),于是我選擇了拉勾,冒著危險(xiǎn)深入內(nèi)部,從他們那里得到了信息。不得不說,拉勾的反爬技術(shù)還挺厲害的,稍后再說明。話不多說,直接開始。
一、明確目的
每次爬蟲都要有明確的目的,剛接觸隨便找東西試水的除外。我想要知道的是python數(shù)據(jù)分析的要求以及薪資狀況,因此,薪資、學(xué)歷、工作經(jīng)驗(yàn)以及一些任職要求就是我的目的。
既然明確了目的,我們就要看一下它們?cè)谑裁次恢?,所以我們打開瀏覽器,尋找目標(biāo)。像拉勾這種網(wǎng)站他們的信息一般都是通過ajax加載的,而且在輸入“python數(shù)據(jù)分析”敲擊回車之后跳轉(zhuǎn)的頁面,招聘信息不是一開始就顯示出來的,通過點(diǎn)擊頁碼也只是招聘信息在變化甚至連network都沒多大變化,可以大膽猜測(cè)他是通過post請(qǐng)求的,所以我們只關(guān)注post請(qǐng)求以及XHR文件,很快就發(fā)現(xiàn)了我們要的東西。

點(diǎn)擊preview可見詳細(xì)信息以json形式保存著,其中‘salary'、‘workYear'、‘education'、‘positionID'(招聘信息詳情頁有關(guān)的id)是我們要的。再觀察一下它的form data,其中kd=關(guān)鍵字,pn=pageNum(頁碼)這是我們請(qǐng)求的時(shí)候要帶上的參數(shù)。另外我們要注意請(qǐng)求頭的referer參數(shù),待會(huì)兒要用。知道了目標(biāo)之后,爬起來!
二、開始爬蟲
先設(shè)置請(qǐng)求頭headers,把平時(shí)用的user-agent帶上,再把formdata也帶上,用requests庫直接requests.post(url, headers=headers, data=formdata) ,然后就開始報(bào)錯(cuò)了: {"status":false,"msg":"您操作太頻繁,請(qǐng)稍后再訪問","clientIp":"......","state":2402}。
解決這個(gè)問題的關(guān)鍵在于,了解拉勾的反爬機(jī)制:在進(jìn)入python數(shù)據(jù)分析招聘頁之前,我們要在主頁,不妨叫它start_url輸入關(guān)鍵字跳轉(zhuǎn)。在這個(gè)過程中,服務(wù)器會(huì)傳回來一個(gè)cookies,如果帶著這個(gè)cookies請(qǐng)求的話我們就可以得到要的東西,所以要先請(qǐng)求start_url獲取cookies在請(qǐng)求目標(biāo)url,而且在請(qǐng)求目標(biāo)地址的話還要帶上referer這個(gè)請(qǐng)求頭參數(shù),referer的含義大概是這樣:告訴服務(wù)器我是從哪個(gè)頁面鏈接過來的,服務(wù)器基此可以獲得一些信息用于處理。另外,睡眠時(shí)間也要設(shè)置的長(zhǎng)一點(diǎn),不然很容易被封。知道了反爬機(jī)制之后,話不多說,直接上代碼。
'''
@author: Max_Lyu
Create time: 2019/4/1
url: https://github.com/MaxLyu/Lagou_Analyze
'''
# 請(qǐng)求起始 url 返回 cookies
def get_start_url(self):
session = requests.session()
session.get(self.start_url, headers=self.headers, timeout=3)
cookies = session.cookies
return cookies
# 將返回的 cookies 一起 post 給 target_url 并獲取數(shù)據(jù)
def post_target_url(self):
cookies = self.get_start_url()
pn = 1
for pg in range(30):
formdata = {
'first': 'false',
'pn': pn,
'kd': 'python數(shù)據(jù)分析'
}
pn += 1
response = requests.post(self.target_url, data=formdata, cookies=cookies, headers=self.headers, timeout=3)
self.parse(response)
time.sleep(60) # 拉勾的反扒技術(shù)比較強(qiáng),短睡眠時(shí)間會(huì)被封
# 解析 response,獲取 items
def parse(self, response):
print(response)
items = []
print(response.text)
data = json.loads(response.text)['content']['positionResult']['result']
if len(data):
for i in range(len(data)):
positionId = data[i]['positionId']
education = data[i]['education']
workYear = data[i]['workYear']
salary = data[i]['salary']
list = [positionId, education, workYear, salary]
items.append(list)
self.save_data(items)
time.sleep(1.3)
其中save_data(items)是保存文件,我是保存在csv文件。篇幅有限,這里就不展示了。
三、獲取招聘詳情
上面說了positionID 是為了獲取詳情頁,詳情頁里面有要的任職要求。這個(gè)要獲取就相對(duì)容易了,不過文本的處理并沒有很簡(jiǎn)單,我只能通過“要求”這兩個(gè)字獲取任職要求(雖然有的為任職技能啥的,就這樣進(jìn)行取舍了)。
'''
@author: Max_Lyu
Create time: 2019/4/1
url: https://github.com/MaxLyu/Lagou_Analyze
'''
def get_url():
urls = []
with open("analyst.csv", 'r', newline='') as file:
# 讀取文件
reader = csv.reader(file)
for row in reader:
# 根據(jù) positionID 補(bǔ)全 url
if row[0] != "ID":
url = "https://www.lagou.com/jobs/{}.html".format(row[0])
urls.append(url)
file.close()
return urls
# 獲取詳細(xì)信息
def get_info():
urls = get_url()
length = len(urls)
for url in urls:
print(url)
description = ''
print(length)
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
content = etree.HTML(response.text)
detail = content.xpath('//*[@id="job_detail"]/dd[2]/div/p/text()')
print(detail)
for i in range(1, len(detail)):
if '要求' in detail[i-1]:
for j in range(i, len(detail)):
detail[j] = detail[j].replace('\xa0', '')
detail[j] = re.sub('[、;;.0-9。]', '', detail[j])
description = description + detail[j] + '/'
print(description)
write_file(description)
length -= 1
time.sleep(3)
四、成果與展示

到這里,爬取的任務(wù)就結(jié)束了,源碼地址:https://github.com/MaxLyu/Lagou_Analyze (本地下載)。獲得數(shù)據(jù)之后就是小小地分析一下了,這個(gè)下次再總結(jié)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python生成詞云的實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄猵ython生成詞云的實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
利用python?pywifi實(shí)現(xiàn)破解WiFi密碼
家里沒有怎么辦,只要你會(huì)Python,辦法總比困難多,本文就利用pywifi?這個(gè)庫實(shí)驗(yàn)一下如何破解Wi-Fi?密碼,注意,該方法僅可用來研究學(xué)習(xí)所用,需要的朋友可以參考下2024-03-03
詳解如何在Django項(xiàng)目中使用Jinja2模板引擎
Django是一個(gè)強(qiáng)大的Python Web框架,它提供了一個(gè)內(nèi)置的模板引擎,然而,在某些場(chǎng)景中,開發(fā)者可能傾向于使用更快、更靈活的模板引擎,比如Jinja2,在本文中,我們將詳細(xì)探討如何在Django項(xiàng)目中使用Jinja2模板引擎,并提供豐富的示例2023-11-11
Python爬蟲實(shí)例之2021貓眼票房字體加密反爬策略(粗略版)
這篇文章主要介紹了Python爬蟲實(shí)例之2021貓眼票房字體加密反爬策略(粗略版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
使用Python進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)可視化的多種方法與技巧
可視化是理解和解釋大量數(shù)據(jù)的強(qiáng)大工具之一,而Python作為一種流行的編程語言,提供了豐富的庫和工具來進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)可視化,本文將介紹一些使用Python進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)可視化的方法與技巧,并提供相應(yīng)的代碼實(shí)例,需要的朋友可以參考下2024-05-05

