python爬蟲-- 爬取51job網招聘信息

項目概覽

  • 在瀏覽器上訪問51job 官方網站,並在搜索框輸入關鍵詞“Python”,地點選在“西安”,單擊”搜索“按鈕進入搜索頁
  • 在搜索頁中,所有符合條件的職位信息以列表的形式排序設有分頁顯示。每條職位信息是一個URL 地址,通過URL 地址可以進入該職位的詳情頁。
  • 職位詳情頁也是數據爬取的頁面,爬取的數據信息有:職位名稱、企業名稱、待遇、福利以及職位要求等等。

項目框架

  • 項目的開發工具選擇 Requests模塊和 BeautifulSoup 模塊實現了爬蟲開發和數據清洗。
  • 數據存儲選擇 Sqlalchemy 框架
  • 數據庫選擇Mysql

具體步驟

一:獲取城市編號
  • 在這裏插入圖片描述- 通過觀察搜索頁的URL地址,我們就可以發現對應的搜索內容一樣的時候,不同的城市對應的編號不一樣。
  • 如下圖所示,我們可以從網頁中找到area_array_s.js。從這個網頁上有地區和編號之間的關係。
    在這裏插入圖片描述
  • 下面的代碼是獲取城市編號
def get_city_code():
    url = 'https://js.51jobcdn.com/in/js/h5/dd/d_jobarea.js?20191212'
    r = requests.get(url)
    begin = r.text.find('var hotcity')
    if begin == -1:
        print('Not find var hotcity')
    # print(begin)
    end = r.text.find(';',begin)
    if end == -1:
        print('Not find ; ')
    # print(end)
    result_text = r.text[begin : end-1]
    #print(result_text)
    begin = result_text.find('{')
    city_dict_str = result_text[begin:]
    # print(city_dict_str)
    key,value = "",""
    key_list,value_list = [],[]
    count = 1
    i = 0
    while i < len(city_dict_str):
        if city_dict_str[i] == '"' and count == 1:
            count = 2
            i += 1
            while city_dict_str[i] != '"':
                key += city_dict_str[i]
                i += 1
            key_list.append(key)
            key = ""
            i += 1
        if city_dict_str[i] == '"' and count == 2:
            count = 1
            i += 1
            while city_dict_str[i] != '"':
                value += city_dict_str[i]
                i += 1
            value_list.append(value)
            value = ""
            i += 1
        i += 1
    city_dict = {}
    i = 0
    while i < len(key_list):
        city_dict[value_list[i]] = key_list[i]
        i += 1
    # print(city_dict)
    return city_dict
獲取招聘職位總頁數
  • 當我們搜索Python+西安的時候,會看到以下網頁。在這裏插入圖片描述
  • 獲取城市編號之後,就可以動態的構建搜索頁的URL地址,實現不同地點的不同關鍵詞的職位搜索。在爬取職位信息之前,還需要確定當前職位的總頁數,因爲同一職位可能會有成千上萬條招聘信息,而這些招聘信息都會進行分頁處理。
  • 那我們總頁數的獲取方式可以爲通過總職位數除以每一頁的職位數。通過觀察便可以知道每頁的職位數上限是50。總職位數可以從”Doc“選項卡里找到相應的位置。
  • 代碼如下:
headers = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36',
    'Host' : 'search.51job.com',
    'Upgrade-Insecure-Requests' : '1'
}

# 獲取職位總頁數
def get_pageNumber(city_code,keyword):
    url = 'https://search.51job.com/list/' + str(city_code) + \
          ',000000,0000,00,9,99,' + str(keyword) + ',2,1.html'
    r = requests.get(url=url,headers=headers)
    soup = BeautifulSoup(r.content.decode('gbk'),'html5lib')
    find_page = soup.find('div',class_='rt').getText()
    temp = re.findall(r"\d+\.?\d*",find_page)
    if temp:
        pageNumber = math.ceil(int(temp[0])/50)
        return pageNumber
    else:
        return 0
爬取每個職位信息
  • 這是兩個循環。遍歷總頁數和遍歷每頁的職位信息。
  • 遍歷總頁數:每次遍歷需要重新構建搜索頁的URL地址,使當前遍歷的次數對於搜索頁的頁數。構建後的URL地址發送HTTP請求並從響應內容提取當前頁面的所有職位信息。
  • 遍歷每頁的職位信息:對當前搜索頁的所有職位的URL 地址進行遍歷訪問,通過發哦送HTTP請求進入每個職位的詳情頁,在職位詳情頁裏爬取目標數據。
  • 代碼比較多,我就不貼了,大家可以去我的githup查看"get_info"函數。
數據存儲
  • 數據庫選用Mysql 數據庫。
  • 主要是一些創建表、更新表的數據或者新增表的數據等等,比較簡單,就不貼代碼了。

總結

  • 以上只是我簡單的分享了一下項目的思路。
  • 代碼githup:https://github.com/zhangyi-13572252156/spider-51job
發佈了170 篇原創文章 · 獲贊 98 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章