專案準備
本次專案涉及到的庫比較多,需要各位小夥伴們先做好準備:
requestsseleniumlxmlcsvpandasmatplotlib安裝方式應該不需要我再概述了吧。
網頁分析當所有必要內容都準備好了之後,就要開始分析網頁了。
網站連結如下:
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年的工作經驗的話,那是很容易可以找到使你滿意的工作的。
最後沒有什麼事情是可以一蹴而就的,生活如此,學習亦是如此!
因此,哪裡會有什麼三天速成,七天速成的說法呢?
唯有堅持,方能成功!
之前我看過一本《Python程式開發指南》很不錯,現在分享給大家