Python使用BeautifulSoup與selenium爬取Boos直聘

數據採集

數據採集(Date Capture),又叫做數據獲取,數據採集是將系統需要管理的所有對象的原始數據(外部數據)進行一系列的操作並輸入到系統內部的一個接口。像攝像頭、麥克風等等,都是數據採集工具,而在計算機世界,相應的數據採集工具就更多了,簡單的採集工具有Hawk、八爪魚等。在計算機廣泛應用的今天,數據採集在多個領域具有非常重要的意義。它是計算機與外部物理世界連接的橋樑。

前幾個月做了一個互聯網加項目,是基於機器學習的一個簡歷招聘推薦系統

今天就分享一下當時爬取Boss直聘時的爬蟲代碼

用到的庫

  • Python3
  • selenium
  • BeautifulSoup
  • os
  • io
  • re

簡述思路

第一步 查看網站url與網站標籤


可以看到所有的子網頁與招聘職位便籤都是有規律的,所以咱們可以從這裏下手

代碼

import io
import os
import re
import time
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome



#尋找網站
def find_boss():
    main_html = BeautifulSoup(browser.page_source, "lxml")
    htmls_two = main_html.find_all("a", href=re.compile('\w.*?-\w.*?'))   #尋找職位href


    for html_two in htmls_two:                                           #遍歷

        for i in range(1,100):                                          #尋找下一頁

            browser.get(base_url+html_two['href']+'?page='+str(i)+'&ka=page-'+str(i))
            print("第{}頁".format(str(i)))                                 #輸出下一頁

            soup_one = BeautifulSoup(browser.page_source, 'lxml')
            link_lists_nexts = soup_one.find_all('a', href=re.compile('job_detail/.*?~.html'))  #尋找需要爬取的職位網站


            for link_lists_next in link_lists_nexts:                      #遍歷
                html_end=base_url+link_lists_next['href']
                browser.get(html_end)

                reptilian()                                             #執行爬蟲函數
                time.sleep(1)



#主函數
if __name__=='__main__':

    #獲取目標網站url 與 創建招聘信息文件
    url='https://www.zhipin.com/?ka=header-home-logo'
    base_url='https://www.zhipin.com'


    #打開瀏覽器
    browser=Chrome()
    browser.get(url)

    #主函數

    find_boss()

    #關閉瀏覽器
    browser.close()

構造函數的時候使用了正則表達式匹配了第一頁所有的招聘崗位網站

構造成功後可以爬蟲就可以定位到想要爬取的具體招聘崗位網頁了

第二步 爬取崗位具體信息

在這裏插入圖片描述

現在我們要根據要爬取的具體信息來分析標籤了

#構造爬蟲函數
def reptilian():

    page_source=browser.page_source
    soup=BeautifulSoup(page_source, 'html.parser')
    #工作名稱 學歷 福利 工資
    company_info=soup.find('div', class_='info-primary')
    job_name = company_info.find('div', class_='name')
    study_infor=company_info.find('p',)
    job_tags=company_info.find('div',class_='job-tags')
    describe=soup.find('div',class_='text')
    #工作地址 公司名稱
    detail_content=soup.find('div', class_='detail-content')
    company_name=detail_content.find('div', class_='name')
    company_addr=detail_content.find('div',class_='location-address')

    #去標籤
    job_name = ' '.join('%s' % id for id in job_name)
    study_infor = ' '.join('%s' % id for id in study_infor)
    job_tags = ' '.join('%s' % id for id in job_tags)
    describe=' '.join('%s' % id for id in describe)
    company_name = ' '.join('%s' % id for id in company_name)
    company_addr = ' '.join('%s' % id for id in company_addr)
    cut = re.compile(r'<[^>]+>', re.S)

    job_name= cut.sub('', job_name)
    study_infor= cut.sub('', study_infor)
    job_tags= cut.sub('', job_tags)
    company_name= cut.sub('', company_name)
    company_addr= cut.sub('', company_addr)
    describe = cut.sub('', describe)

    f="-------------------------------------------------------------------------------------"

    infors=str(job_name)+str(study_infor)+str(job_tags)+str(company_name)+str(company_addr)+'\n'+"職位描述 : "+'\n'+str(describe)+'\n'+str(f)+'\n'

    write_data(file_path=file_path, file_name=file_name, data=infors)

可以添加個寫入txt文件的函數,便於保存

# 創建文件函數(文件路徑,文件名)
def establish_file(file_path, file_name):
    # 文件路徑
    path = file_path + file_name
    # 判斷文件是否存在
    if os.path.exists(path):
        print(file_name + "文件已經存在,正在刪除~~~~~")
        # 刪除原有的文件
        os.remove(path)
        print("原有文件已經刪除,正在重新創建文件~~~~")
    # 創建文件(文件路徑, 打開方式‘w’只寫, 編碼格式)

    f = io.open(path, 'w', encoding='utf-8')
    # 關閉文件
    f.close()
    print("文件創建成功!")


# 將獲取數據寫入文件中(文件路徑,文件名,數據)
def write_data(file_path, file_name, data):
    # 文件路徑
    path = file_path + file_name
    # 打開創建文件(文件路徑,打開方式'a'追加, 編碼格式)
    f = io.open(path, 'a', encoding='utf-8')
    print("正在寫入" + file_name + "...")
    # 數據寫入文件
    f.write(data)
    print("寫入成功")
    # 關閉文件
    f.close()

這樣就成功將該招聘崗位的基本信息就爬取到了

在這裏插入圖片描述

自動化爬取

接下來就考慮將所有頁數的與所有在招聘崗位自動化爬取了

import io
import os
import re
import time
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome



# 創建文件函數(文件路徑,文件名)
def establish_file(file_path, file_name):

    # 文件路徑
    path = file_path + file_name

    # 判斷文件是否存在
    if os.path.exists(path):

        print(file_name + "文件已經存在")

    else:

        f = io.open(path, 'w', encoding='utf-8')
        # 關閉文件
        f.close()
        print("文件創建成功!")

        # 主函數

        find_boss()


# 將獲取數據寫入文件中(文件路徑,文件名,數據)
def write_data(file_path, file_name, data):
    # 文件路徑
    path = file_path + file_name
    # 打開創建文件(文件路徑,打開方式'a'追加, 編碼格式)
    f = io.open(path, 'a', encoding='utf-8')
    print("正在寫入" +file_name + "...")
    # 數據寫入文件
    f.write(data)
    print("寫入成功")
    # 關閉文件
    f.close()



#構造爬蟲函數


# 構造爬蟲函數
def reptilian():
    page_source = browser.page_source
    soup = BeautifulSoup(page_source, 'html.parser')

    try:
        # 工作名稱 學歷 福利 工資
        company_info = soup.find('div', class_='info-primary')
        job_name = company_info.find('div', class_='name')
        study_infor = company_info.find('p')
        job_tags = company_info.find('div', class_='job-tags')
        describe = soup.find('div', class_='text')

        # 工作地址 公司名稱
        detail_content = soup.find('div', class_='detail-content')
        company_name = detail_content.find('div', class_='name')
        company_addr = detail_content.find('div', class_='location-address')

        # 剔除標籤
        job_name = job_name.get_text("", strip=True)
        study_infor = study_infor.get_text("", strip=True)
        job_tags = job_tags.get_text("", strip=True)
        describe = describe.get_text("", strip=True)
        company_name = company_name.get_text("", strip=True)
        company_addr = company_addr.get_text("", strip=True)

    except AttributeError:

        print("該頁面不存在,請跳過本次頁面")

    else:

        f = "-------------------------------------------------------------------------------------"
        infors = "工作名稱 工資:" + job_name + '\n' + "工作地點 工作經驗 學歷:" + study_infor + '\n' + "公司福利:" + job_tags + '\n' + "職位描述:" + describe + '\n' + "公司名稱:" + company_name + '\n' + "工作地址:" + company_addr + '\n' + f + '\n'
        write_data(file_path=file_path, file_name=file_name, data=infors)


#尋找網站
def find_boss():
    main_html = BeautifulSoup(browser.page_source, "lxml")
    job_list=main_html.find('div',class_="menu-sub")
    htmls_two = job_list.find_all("a", href=re.compile('\w.*?-\w.*?'))   #尋找職位href


    for html_two in htmls_two:                                           #遍歷

        for i in range(1,11):                                          #尋找下一頁

            browser.get(base_url+html_two['href']+'?page='+str(i)+'&ka=page-'+str(i))
            print("第{}頁".format(str(i)))                                 #輸出下一頁


            soup_one = BeautifulSoup(browser.page_source, 'lxml')
            link_lists_nexts = soup_one.find_all('a', href=re.compile('job_detail/.*?~.html'))  #尋找需要爬取的職位網站


            for link_lists_next in link_lists_nexts:                      #遍歷
                html_end=base_url+link_lists_next['href']
                browser.get(html_end)
                reptilian()                                             #執行爬蟲函數
                time.sleep(1)









#主函數
if __name__=='__main__':

    #獲取目標網站url 與 創建招聘信息文件
    url='https://www.zhipin.com/?ka=header-home-logo'
    base_url='https://www.zhipin.com'
    file_path='E:\\'   #路徑
    file_name=str(input("請輸入要創建的文件名稱:"))


    #打開瀏覽器
    browser=Chrome()
    browser.get(url)

    #創建文件
    establish_file(file_path=file_path, file_name=file_name)


    #關閉瀏覽器
    browser.close()

注意

在設計代碼的時候一定要考慮到404網站的存在,及時拋出異常,考慮周到

改進

import io
import os
import re
import time
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome
      


#尋找網站
def find_boss():
    main_html = BeautifulSoup(browser.page_source, "lxml")
    job_lists = main_html.find('div', class_="menu-sub")
    job_list= job_lists.find_all("a", href=re.compile('\w.*?-\w.*?'))

    for html_two in job_list[79:]:

        browser.get(base_url+html_two['href'])

        soup_one = BeautifulSoup(browser.page_source, 'lxml')
        link_lists_nexts = soup_one.find_all('a', href=re.compile('job_detail/.*?~.html'))  #尋找需要爬取的職位網站

        for link_lists_next in link_lists_nexts:                    #遍歷

            html_end=base_url+link_lists_next['href']
            print(html_end)
            browser.get(html_end)
            # reptilian()                                                           #執行爬蟲函數
            time.sleep(1)
        try:                                                                        #下一頁

            next_page =soup_one.find('div', class_="page")
            next_page_end = next_page.find("a", class_='next')
            browser.get(base_url + next_page_end['href'])

        except:
            pass                                                               #如果沒有則退出



#主函數
if __name__=='__main__':

    #獲取目標網站url 與 創建招聘信息文件
    url='https://www.zhipin.com/?ka=header-home-logo'
    base_url='https://www.zhipin.com'
   

    #打開瀏覽器
    browser=Chrome()
    browser.get(url)

   #運行主函數
    find_boss()

在這裏插入圖片描述

這樣,一個簡單的python爬蟲就實現了

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