實戰爬取BOOS直聘,找到最適合你的職位

隨遇啊發表於2020-12-07

說明

最近忙著找工作,想了解一下用人單位的招聘要求,以爬取boss直聘的招聘資訊作為參考。這裡記錄一下的爬取流程,並不作為其它用途!

分析頁面結構

通過分析頁面,發現招聘的詳細資訊都在詳情頁(如下圖),故通過詳情頁來提取招聘內容
在這裡插入圖片描述

設計爬蟲策略
在這裡插入圖片描述

通過列表頁獲取詳細頁的url地址,然後存入到url佇列中,發現列表頁有10頁,這裡使用多執行緒提高爬取效率;

通過url佇列中的詳情頁url地址得到詳情頁的html內容,採用xpath解析,提取招聘資訊,以字典形式存入data佇列中,這裡也採用多執行緒;

將data佇列中的資料儲存為json檔案,這裡每儲存的一個json檔案都是一個列表頁所有的招聘資訊。

頁面請求方式的判斷
在這裡插入圖片描述

不難發現,這裡是通過get請求並新增查詢字串獲取指定頁面的;

查詢字串引數的含義:query=python表示搜尋的職位,page=1表示列表頁的頁碼,ka=page-1這個沒用到可以忽略掉;

對應的程式碼如下:

regx_obj = re.compile(r'<br/>|<(em).*?>.*?</\1>')

def send_request(url_path, headers, param=None):
    """
    :brief 傳送請求,獲取html響應(這裡是get請求)
    :param url_path: url地址
    :param headers: 請求頭引數
    :param param: 查詢引數, 如:param = {'query': 'python', 'page': 1}
    :return: 返回響應內容
    """
    response = requests.get(url=url_path, params=param, headers=headers)
    response = regx_obj.sub('', response.text)
    return response

通過列表頁獲取詳情頁url
在這裡插入圖片描述

這裡通過xpath語法@href獲取a標籤href屬性值,拿到詳細頁url地址,程式碼如下:

def detail_url(param):
    """
    :brief 獲取詳情頁的url地址
    :param param:  get請求的查詢引數
    :return: None
    """
    wuhan_url = '/'.join([base_url, "c101200100/h_101200100/"])
    html = send_request(wuhan_url, headers, param=param)
    # 列表頁頁面
    html_obj = etree.HTML(html)
    # 提取詳情頁url地址
    nodes = html_obj.xpath(".//div[@class='info-primary']//a/@href")
    for node in nodes:
        detail_url = '/'.join([base_url, node])  # 拼接成完整的url地址
        print(detail_url)
        url_queue.put(detail_url)  # 新增到佇列中

解析詳情頁的資料
在這裡插入圖片描述

通過xpath解析資料,然後將資料儲存為字典放到佇列中,程式碼如下:

def parse_data():
    """
    :brief 從html文字中提取指定資訊
    :return: None
    """
    # # 解析為HTML文件
    try:
        while True:
            # 等待25s,超時則丟擲異常
            detail_url = url_queue.get(timeout=25)
            html = send_request(detail_url, headers, param=None)
            html_obj = etree.HTML(html)
            item = {}
            # 釋出日期
            item['publishTime'] = html_obj.xpath(".//div[@class='info-primary']//span[@class='time']/text()")[0]
            # 職位名
            item['position'] = html_obj.xpath(".//div[@class='info-primary']//h1/text()")[0]
            # 釋出者姓名
            item['publisherName'] = html_obj.xpath("//div[@class='job-detail']//h2/text()")[0]
            # 釋出者職位
            item['publisherPosition'] = html_obj.xpath("//div[@class='detail-op']//p/text()")[0]
            # 薪水
            item['salary'] = html_obj.xpath(".//div[@class='info-primary']//span[@class='badge']/text()")[0]
            # 公司名稱
            item['companyName'] = html_obj.xpath("//div[@class='info-company']//h3/a/text()")[0]
            # 公司型別
            item['companyType'] = html_obj.xpath("//div[@class='info-company']//p//a/text()")[0]
            # 公司規模
            item['companySize'] = html_obj.xpath("//div[@class='info-company']//p/text()")[0]
            # 工作職責
            item['responsibility'] = html_obj.xpath("//div[@class='job-sec']//div[@class='text']/text()")[0].strip()
            # 招聘要求
            item['requirement'] = html_obj.xpath("//div[@class='job-banner']//div[@class='info-primary']//p/text()")[0]
            print(item)
            jobs_queue.put(item)  # 新增到佇列中
            time.sleep(15)
    except:
        pass

儲存資料為json檔案

程式碼如下:

def write_data(page):
    """
    :brief 將資料儲存為json檔案
    :param page: 頁面數
    :return: None
    """
    with open('D:/wuhan_python_job_{}.json'.format(page), 'w', encoding='utf-8') as f:
        f.write('[')
        try:
            while True:
                job_dict = jobs_queue.get(timeout=25)
                job_json = json.dumps(job_dict, indent=4, ensure_ascii=False)
                f.write(job_json + ',')
        except:
            pass
        f.seek(0, 2)
        position = f.tell()
        f.seek(position - 1, 0)  # 剔除最後一個逗號
        f.write(']')

json資料示例

{
     "salary": "4K-6K",
     "publisherName": "曾麗香",
     "requirement": "城市:武漢經驗:應屆生學歷:本科",
     "responsibility": "1、2018屆統招本科畢業,計算機相關專業;2、熟悉python開發;3、良好的溝通表達能力,學習能力強,積極上進;",
     "publishTime": "釋出於2018-06-11 12:15",
     "companyName": "雲智匯科技",
     "position": "軟體開發(python、0年經驗)",
     "publisherPosition": "HR主管剛剛線上",
     "companySize": "未融資500-999人",
     "companyType": "計算機軟體"}

其它
div中存在
標籤,xpath無法獲取div標籤中所有的文字內容(如下圖):
在這裡插入圖片描述

解決辦法:拿到html文字後,提前通過正規表示式剔除該標籤

核心程式碼如下:

正規表示式:去掉標籤中的<br/> 和 <em></em>標籤,便於使用xpath解析提取文字
regx_obj = re.compile(r'<br/>|<(em).*?>.*?</\1>')
response = requests.get(url=url_path, params=param, headers=headers)
response = regx_obj.sub('', response.text)

當爬取速度過快時,會被封ip,這裡將多執行緒改為單執行緒版,並使用time.sleep降低爬取速度
在這裡插入圖片描述
推薦一下我建的python學習交流扣扣qun:850973621,群裡有免費的視訊教程,開發工具、
電子書籍、專案原始碼分享。一起交流學習,一起進步!

作者:white_study
連結:https://www.jianshu.com/p/d293fe5ba56f
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章