1. 程式人生 > >Python爬蟲之五:抓取智聯招聘基礎版

Python爬蟲之五:抓取智聯招聘基礎版

對於每個上班族來說,總要經歷幾次換工作,如何在網上挑到心儀的工作?如何提前為心儀工作的面試做準備?今天我們來抓取智聯招聘的招聘資訊,助你換工作成功!

執行平臺: Windows
Python版本: Python3.6
IDE: Sublime Text
其他工具: Chrome瀏覽器

1、網頁分析

1.1 分析請求地址

以北京海淀區的python工程師為例進行網頁分析。開啟智聯招聘首頁,選擇北京地區,在搜尋框輸入”python工程師”,點選”搜工作”: 1搜尋職位

接下來跳轉到搜尋結果頁面,按”F12”開啟開發者工具,然後在”熱門地區“欄選擇”海淀“,我們看一下位址列:

2選擇地區

由位址列後半部分searchresult.ashx?jl=北京&kw=python工程師&sm=0&isfilter=1&p=1&re=2005可以看出,我們要自己構造地址了。接下來要對開發者工具進行分析,按照如圖所示步驟找到我們需要的資料:Request HeadersQuery String Parameters

3開發者工具分析

構造請求地址:

paras = {
    'jl': '北京',             # 搜尋城市
    'kw': 'python工程師',      # 搜尋關鍵詞 
    'isadv'
: 0, # 是否開啟更詳細搜尋選項 'isfilter': 1, # 是否對結果過濾 'p': 1, # 頁數 're': 2005 # region的縮寫,地區,2005代表海淀 } url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + urlencode(paras)

請求頭:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
, 'Host': 'sou.zhaopin.com', 'Referer': 'https://www.zhaopin.com/', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9' }

1.2 分析有用資料

接下來我們要分析有用資料,從搜尋結果中我們需要的資料有:職位名稱、公司名稱、公司詳情頁地址、職位月薪:

4有用資料

通過網頁元素定位找到這幾項在HTML檔案中的位置,如下圖所示:

5找出有用資料

用正則表示式對這四項內容進行提取:

# 正則表示式進行解析
pattern = re.compile('<a style=.*? target="_blank">(.*?)</a>.*?'        # 匹配職位資訊
    '<td class="gsmc"><a href="(.*?)" target="_blank">(.*?)</a>.*?'     # 匹配公司網址和公司名稱
    '<td class="zwyx">(.*?)</td>', re.S)                                # 匹配月薪      

# 匹配所有符合條件的內容
items = re.findall(pattern, html)

注意:解析出來的部分職位名稱帶有標籤,如下圖所示:

6職位名稱中帶有標籤

那麼在解析之後要對該資料進行處理剔除標籤,用如下程式碼實現:

for item in items:
    job_name = item[0]
    job_name = job_name.replace('<b>', '')
    job_name = job_name.replace('</b>', '')
    yield {
        'job': job_name,
        'website': item[1],
        'company': item[2],
        'salary': item[3]
    }

2、寫入檔案

我們獲取到的資料每個職位的資訊項都相同,可以寫到資料庫中,但是本文選擇了csv檔案,以下為百度百科解釋:

逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其檔案以純文字形式儲存表格資料(數字和文字)。純文字意味著該檔案是一個字元序列,不含必須像二進位制數字那樣被解讀的資料。

由於python內建了csv檔案操作的庫函式,所以很方便:

import csv
def write_csv_headers(path, headers):
    '''
    寫入表頭
    '''
    with open(path, 'a', encoding='gb18030', newline='') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writeheader()

def write_csv_rows(path, headers, rows):
    '''
    寫入行
    '''
    with open(path, 'a', encoding='gb18030', newline='') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writerows(rows)

3、進度顯示

要想找到理想工作,一定要對更多的職位進行篩選,那麼我們抓取的資料量一定很大,幾十頁、幾百頁甚至幾千頁,那麼我們要掌握抓取進度心裡才能更加踏實啊,所以要加入進度條顯示功能。

本文選擇tqdm 進行進度顯示,來看一下酷炫結果(圖片來源網路):

7tqdm演示

執行以下命令進行安裝:pip install tqdm

簡單示例:

from tqdm import tqdm
from time import sleep

for i in tqdm(range(1000)):
    sleep(0.01)

4、完整程式碼

以上是所有功能的分析,如下為完整程式碼:

#-*- coding: utf-8 -*-
import re
import csv
import requests
from tqdm import tqdm
from urllib.parse import urlencode
from requests.exceptions import RequestException

def get_one_page(city, keyword, region, page):
    '''
    獲取網頁html內容並返回
    '''
    paras = {
        'jl': city,         # 搜尋城市
        'kw': keyword,      # 搜尋關鍵詞 
        'isadv': 0,         # 是否開啟更詳細搜尋選項
        'isfilter': 1,      # 是否對結果過濾
        'p': page,          # 頁數
        're': region        # region的縮寫,地區,2005代表海淀
    }

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
        'Host': 'sou.zhaopin.com',
        'Referer': 'https://www.zhaopin.com/',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9'
    }

    url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + urlencode(paras)
    try:
        # 獲取網頁內容,返回html資料
        response = requests.get(url, headers=headers)
        # 通過狀態碼判斷是否獲取成功
        if response.status_code == 200:
            return response.text
        return None
    except RequestException as e:
        return None

def parse_one_page(html):
    '''
    解析HTML程式碼,提取有用資訊並返回
    '''
    # 正則表示式進行解析
    pattern = re.compile('<a style=.*? target="_blank">(.*?)</a>.*?'        # 匹配職位資訊
        '<td class="gsmc"><a href="(.*?)" target="_blank">(.*?)</a>.*?'     # 匹配公司網址和公司名稱
        '<td class="zwyx">(.*?)</td>', re.S)                                # 匹配月薪      

    # 匹配所有符合條件的內容
    items = re.findall(pattern, html)   

    for item in items:
        job_name = item[0]
        job_name = job_name.replace('<b>', '')
        job_name = job_name.replace('</b>', '')
        yield {
            'job': job_name,
            'website': item[1],
            'company': item[2],
            'salary': item[3]
        }

def write_csv_file(path, headers, rows):
    '''
    將表頭和行寫入csv檔案
    '''
    # 加入encoding防止中文寫入報錯
    # newline引數防止每寫入一行都多一個空行
    with open(path, 'a', encoding='gb18030', newline='') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writeheader()
        f_csv.writerows(rows)

def write_csv_headers(path, headers):
    '''
    寫入表頭
    '''
    with open(path, 'a', encoding='gb18030', newline='') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writeheader()

def write_csv_rows(path, headers, rows):
    '''
    寫入行
    '''
    with open(path, 'a', encoding='gb18030', newline='') as f:
        f_csv = csv.DictWriter(f, headers)
        f_csv.writerows(rows)

def main(city, keyword, region, pages):
    '''
    主函式
    '''
    filename = 'zl_' + city + '_' + keyword + '.csv'
    headers = ['job', 'website', 'company', 'salary']
    write_csv_headers(filename, headers)
    for i in tqdm(range(pages)):
        '''
        獲取該頁中所有職位資訊,寫入csv檔案
        '''
        jobs = []
        html = get_one_page(city, keyword, region, i)
        items = parse_one_page(html)
        for item in items:
            jobs.append(item)
        write_csv_rows(filename, headers, jobs)

if __name__ == '__main__':
    main('北京', 'python工程師', 2005, 10)

上面程式碼執行效果如圖所示:

8程式碼執行效果

執行完成後會在py同級資料夾下會生成名為:zl_北京_python工程師.csv的檔案,開啟之後效果如下:

9資料儲存結果

本示例功能比較簡單,只做到了資料抓取,並沒有對資料分析,下次我會抓取更多資訊,對薪水和職位對工作技能的要求等各項資料進行分析,敬請期待!

歡迎關注公眾賬號:

微信公眾號