首頁>技術>

專案準備

本次專案涉及到的庫比較多,需要各位小夥伴們先做好準備:

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程式開發指南》很不錯,現在分享給大家

8
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Hadoop生態圈hive應用