用python爬取獵聘網的指定職位信息

寫在前面:某日,公司想要招聘一個崗位的人員,想從招聘網上看看相關崗位的薪資及相關條件,於是就有了以下爬取過程。

       這裏以關鍵詞 “基因” “近一個月內”作爲條件爬取相關信息,打開獵聘網,輸入 “基因”,選擇近一個月內,結果如下:

當前顯示的是第一頁:

查看當前鏈接:發現規律不明顯

https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&flushckid=1&fromSearchBtn=2&pubTime=30&ckid=3d871f0122b3e6c9&degradeFlag=0&curPage=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~fA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp&d_ckId=cf67c27a6ce68af047a9752179e2d5d0&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d

點擊第二頁並查看第二頁的鏈接:

https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&fromSearchBtn=2&pubTime=30&ckid=43f135ffd04645b1&degradeFlag=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~UoKQA1_uiNxxEb8RglVcHg&d_sfrom=search_fp&d_ckId=a7fac3c3df0712444f709570b349c883&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d&curPage=1

通過對比發現關鍵curpage=1表示的是第二頁,那是不是將1改爲相應的數字就找到了頁碼呢?爲了證實猜想,我們多點開幾個試一下,試過之後發現curpage=0表示第一頁,curpage=2表示第三頁,猜想正確!這樣一來URL的構造就非常簡單了,只需要更改url最後的數字即可。接下來就是確定一共有多少頁,點擊頁碼跳到最後發現一共有100頁:

這樣,URL的構造就很清晰了,如下:

url = 'https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&fromSearchBtn=2&pubTime=30&ckid=27fda43c09cfd22a&degradeFlag=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~UoKQA1_uiNxxEb8RglVcHg&d_sfrom=search_fp&d_ckId=72cb43ffd77e25f190635f45f4400ce0&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d&curPage='

for i in range(101):
    url = url + 'i'

接下來就是獲得具體的頁面信息:檢查網頁元素髮現每一條職位信息都在ul標籤下的li標籤中,於是我們可以通過xpath定位li標籤

html = requests.get(url, headers = headers).text
mytree = lxml.etree.HTML(html)
postList = mytree.xpath('//ul[@class="sojob-list"]/li')

這樣得到的是所有的li標籤列表,現在我們來解決其中一個具體的li標籤用以獲得想要的內容:

從該結構中可以看到,我們想要的內容在li標籤下的h3標籤和p標籤中,從而使用相應的xpath繼續定位並提取內容:

postTitle = postList.xpath('.//div[@class="job-info"]/h3/a/text()')[0]
postInfo = postList.xpath('.//div[@class="job-info"]/p/span//text()')
postSalary = postInfo[0]
postEDU = postInfo[1]
postExperience = postInfo[2]

這樣一來基本上就解決了一條職位信息的獲取,一頁的信息只需對li標籤列表進行循環獲取,而所有頁面的信息只需對所有構造的url進行循環獲取,最終將所有信息保存下來即可。

         完整代碼如下:

import csv
from time import sleep
import lxml
import requests
from lxml import etree


headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"}

url = 'https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&fromSearchBtn=2&pubTime=30&ckid=27fda43c09cfd22a&degradeFlag=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~UoKQA1_uiNxxEb8RglVcHg&d_sfrom=search_fp&d_ckId=72cb43ffd77e25f190635f45f4400ce0&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d&curPage='


def getPerPageInfo(url):

    html = requests.get(url, headers = headers).text
    mytree = lxml.etree.HTML(html)
    postList = mytree.xpath('//ul[@class="sojob-list"]/li')
    # print(postList)
    for post in postList:
        postTitle = post.xpath('.//div[@class="job-info"]/h3/a/text()')[0]
        postInfo = post.xpath('.//div[@class="job-info"]/p/span//text()')
        postSalary = postInfo[0]
        postEDU = postInfo[1]
        postExperience = postInfo[2]
        infoList = [postTitle,postSalary,postEDU,postExperience]

        # 將得到的數據用csv格式存儲
        writer.writerow(infoList)      # writerows()會把單個字符寫入到一個單元格中,而writerow()會把一個字符串寫入一個單元格中



if __name__ == '__main__':


    csvHeader = ['招聘崗位','薪酬','所需學歷','工作經驗']
    with open('./獵聘網基因相關崗位信息.csv', 'a+', encoding='utf-8', errors='ignore', newline="") as f:
        writer = csv.writer(f)
        writer.writerow(csvHeader)
        for i in range(101):
            url = url + 'i'
            getPerPageInfo(url)
            sleep(0.5)          # 每一頁爬取時延遲一會,防止對別人服務器造成太大壓力

總結:這個爬取過程比較簡單,基本上沒有遇到什麼阻力,當然,這也跟我們爬去的內容簡單有關係,如果想要爬去更多內容或者爬取更加智能化還需要修改很多地方,比如還要爬去詳情頁,相關的關鍵字不去手動輸入通過分析後得到URL而是使用者輸入關鍵字後url自動生成等等,這些都可以作爲擴展進行聯繫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章