目錄
- 前言
- 項目準備
- 網頁分析
-
- 關于動态渲染
- 關于翻頁
- 需求分析與功能實作
-
- 詳情頁分析
- 擷取詳情資料
- 結果展示
- 可視化觀察
-
- 學曆統計
- 工作經驗統計
- 最後
前言
在上一篇文章中,為大家分享了selenium的使用方法,是以今天這篇文章為大家帶了的就是關于selenium的實戰項目。
本次項目的内容是爬取51job的招聘資訊,希望接下來的内容對你找工作有所幫助。
項目準備
本次項目涉及到的庫比較多,需要各位小夥伴們先做好準備:
- requests
- selenium
- lxml
- csv
- pandas
- matplotlib
安裝方式應該不需要我再概述了吧。
網頁分析
當所有必要内容都準備好了之後,就要開始分析網頁了。
網站連結如下:
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=
打開的頁面,如下圖所示:
從上面的網址來看,它存在的參數特别多,能不能像百度一樣,把後面的參數去掉呢?
那我們就來試試,删除參數之後的連結如下所示:
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html
将連結複制到浏覽器,打開的頁面如下所示:
經過觀察發現,和之前的頁面并無差別。
關于動态渲染
該網頁經過分析之後發現,如果直接使用requests向目标網址發送請求,可以發現有些動态加載的資料無法加載出來,可能導緻爬蟲出錯,是以這裡使用selenium自動測試工具,模拟發送請求,并加載資料。
關于翻頁
經過測試,發現該職位下一共有81頁的職位,是以需要擷取到每一頁的連結,是以,在這裡又需要來觀察不同頁面的連結規律了。
# 第一頁
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,1.html
# 第二頁
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,2.html
# 第三頁
https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,3.html
想必聰明的小夥伴們都發現了,URL的變化規律了吧。
隻需要通過簡單的for循環就可以解決了。
需求分析與功能實作
詳情頁分析
每一個招聘資訊,我們都需要點選進去,才能看到每個招聘崗位的詳細資訊。裡面的内容才是我們真正需要的,如下圖所示:
那麼應該如何擷取詳情頁的URL呢?
首先打開開發者工具,使用選擇器進行選擇即可,如下圖所示:
你會發現詳情頁的URL都放在了class屬性為j_joblist的div标簽下的div标簽下的a标簽,隻需要提取a标簽的href屬性即可。
具體代碼如下所示:
def get_link():
link_lists = [] # 儲存詳情頁URL
browser = webdriver.Chrome()
for page in range(1, 82):
browser.get(f'https://search.51job.com/list/030200,000000,0000,00,9,99,python,2,{page}.html')
wait = WebDriverWait(browser, 5)
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.j_joblist')))
# print(button)
joblists = browser.find_elements_by_xpath('//div[@class="j_joblist"]/div/a')
# print(joblists)
for joblist in joblists:
con_link = joblist.get_attribute('href')
link_lists.append(con_link)
browser.quit()
return link_lists
接下來,我就對上面的幾行代碼做簡單的分析。
wait = WebDriverWait(browser, 5)
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.j_joblist')))
# print(button)
joblists = browser.find_elements_by_xpath('//div[@class="j_joblist"]/div/a')
這裡首先引入WebDriverWait這個對象,指定最長的等待時間,然後調用它的until()方法,傳入等待條件,譬如:這裡傳入了element_to_be_clickable,代表節點出現的意思,其參數是節點的定位元組。
擷取詳情資料
當我們将81頁的詳情頁的連結都拿到手之後,隻需通過requests向這些URL發送請求即可。
我們要在詳情頁中提取的資料主要有:
- 崗位名稱
- 薪資
- 工作經驗
- 學曆
- 招聘人數
- 工作地點
- 福利
具體代碼如下所示:
def get_data(url_lists):
with open('data_all3.csv', 'a', encoding='utf-8-sig', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['連結', '崗位名稱', '薪資', '工作經驗', '學曆','招聘人數','工作地點','福利'])
job_information = []
for i, url in enumerate(url_lists):
datalist = []
headers = {
'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
}
time.sleep(0.5)
response = requests.get(url, headers=headers)
# print(response.status_code)
try:
html = response.content.decode('gbk')
# print(html)
data = etree.HTML(html)
datalist.append(url) # 存入崗位連接配接
title = data.xpath('//div[@class="cn"]/h1/@title')[0] # 崗位名稱
# print(title)
datalist.append(title)
salary = data.xpath('//div[@class="cn"]/strong/text()')[0]
datalist.append(salary)
# print(datalist)
information = data.xpath('//p[@class="msg ltype"]/@title')[0] # 地點、學曆、人數
information = re.sub(r'\s+', '', information)
experience = information.split('|')[1] # 工作經驗
# print(experience)
datalist.append(experience)
education = information.split('|')[2] # 學曆
datalist.append(education)
num = information.split('|')[3] # 招聘人數
datalist.append(num)
place = data.xpath('//p[@class="fp"]/text()')[0]
# print(place)
datalist.append(place)
treament = ' '.join(data.xpath('//span[@class="sp4"]/text()')) # 福利
datalist.append(treament)
# job_info = '\n'.join(data.xpath('//div[@class="bmsg job_msg inbox"]/p/text()'))
# datalist.append(job_info)
# print(treament)
# print(job_info)
print(f'第{i}條')
print(datalist)
with open('data_all3.csv', 'a' ,encoding='utf-8-sig', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(datalist)
結果展示
經過半個小時的抓取,終于抓到3779條招聘資訊了。
我直接一句好家夥!!
Python的職位這麼多嗎?
可視化觀察
學曆統計
因為有些公司并沒有指定學曆,是以會出現,招幾人的結果。
不過從上面,我們也可以看出,目前Python的崗位還是大學生是居多的,其次是大專,最後是碩士。
工作經驗統計
有些公司并沒有指定工作經驗,是以會出現學曆在這邊。
不過從上面已經可以看出,目前的企業最需要的擁有3-4年工作時間的程式員,如果你已經有了3-4年的工作經驗的話,那是很容易可以找到使你滿意的工作的。
最後
沒有什麼事情是可以一蹴而就的,生活如此,學習亦是如此!
是以,哪裡會有什麼三天速成,七天速成的說法呢?
唯有堅持,方能成功!
啃書君說:
文章的每一個字都是我用心敲出來的,隻希望對得起每一位關注我的人。在文章末尾點個【贊】,讓我知道,你也在自己的未來拼搏和努力着。
路漫漫其修遠兮,吾将上下而求索。
我是啃書君,一個專注于學習的人,你懂的越多,你不懂的越多,更多精彩内容,我們下期再見!