抓取智聯招聘


抓取智聯招聘

 一、 項目需求

1. 爬取智聯招聘有關於“房地產銷售”關鍵字的崗位信息,包括公司名稱、招聘崗位、薪資和公司地址。(此處的關鍵字其實還可以更靈活的設置,如果直接是房地產銷售就把程序寫死了,這個程序只能抓取房地產銷售崗位的信息,我們可以通過觀察分析URL地址來推理設計出更靈活的程序,比如可以靈活的根據輸入的關鍵字和工作地點來動態生成一個URL,具體的操作后面再詳細闡述)

2. 使用請求庫:requests

3. 使用解析庫:pyquery

4. 使用CSV儲存數據

 

 二、 項目分析

用瀏覽器打開智聯招聘官網,搜索關鍵字“房地產銷售”,獲取目標URL:

https://sou.zhaopin.com/jobs/searchresult.ashx?jl=廣州&kw=房地產銷售&sg=11dd585aae0f4afdbcf9150b215cc8ba&p=1

(注:如果圖片看不清楚請右鍵點擊圖片通過新的標簽打開)

 這里拿到了一個URL,其中里面包含了我們看不懂的參數,比如說sg參數,然而此時可以簡單粗暴的將這個參數刪除,即直接訪問:

https://sou.zhaopin.com/jobs/searchresult.ashx?jl=廣州&kw=房地產銷售&p=1 這個URL,發現結果跟前面截圖的一模一樣,也就可以推測,sg參數應該是給機器看的,對我們的抓取沒有影響,也就是可以忽略。

對於URL的其他參數估計不正常的人都能秒懂了,jl參數代表地址,kw參數就是keyword,而p參數就是當前所在的第幾頁。完了以后接下來就是構造請求URL了:

from urllib import parse

url_params = {
    'jl':'廣州',
    'kw':'房地產銷售',
    'p':1  
}
url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + parse.urlencode(url_params)

接下來就該設置請求頭了,請求頭最重要的信息其實就是 User-Agent 了,因為有些網站有反爬機制,如果我們直接通過 requests 庫向一個URL發起請求時,此時默認的User-Agent為python-requests/2.10.0,這樣就很容易被識別為爬蟲因而被拒絕訪問。

from requests

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'
}
requests.get(url=url,headers=headers)

然而這里就可以抓取到上面截圖的頁面源碼了,接下來要做的就是從源碼里面提取我們需要的信息,包括公司名稱、招聘崗位、薪資和公司地址。

分析發現,每條記錄都被以一個class屬性為newlist的table標簽包裹着,但是我們需要的信息在這里並沒有完全包含,缺少了公司的詳細地址和工作崗位,所以抓取到這個頁面還不足以完成需求,然而再分析發現,每個table下都有一個a元素,它的href屬性就是這條記錄鏈接,點開這個鏈接就可以看到這個公司詳細的招聘信息了:

分析發現,我們需要的公司名稱就在class屬性為inner-left和fl的div元素下的第一個h2元素下的a元素的文本內容;月薪在class屬性為terminalpage-left的div元素下的第一個li元素里面的strong元素的文本;招聘崗位信息在最后一個li下的a元素的文本;工作地點在class屬性為tab-inner-cont的div元素下的h2元素的文本,當然,這里面的a元素也有文本內容,所以在這里需要將a元素的文本內容排除掉(詳細看后面源碼)。

 

 三、 項目源碼

import requests
from pyquery import PyQuery as pq
import re
import csv
from urllib import parse
from tqdm import tqdm
from requests.exceptions import RequestException


def get_one_page(url):
    """獲取一個網頁,參數url在主函數構造,防止程序出錯還捕捉了RequestException異常"""
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/67.0.3396.62 Safari/537.36'
    }
    try:
        response = requests.get(url=url,headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


def parse_one_page(html):
    """解析一個網頁,獲取一個頁面中所有公司的url鏈接,並將這些鏈接儲存在列表中,最后返回這個列表"""
    document = pq(html)
    url_list = []
    a_list = document('.zwmc a:first')
    for item in a_list.items():
        url_list.append(item.attr('href'))
    if url_list:
        return url_list


def parse_one_company(url_list):
    """生成器函數,使用pyquery解析庫提取我們需要的信息"""
    pattern = re.compile('(.*?) .*?')
    for url in url_list:
        html = get_one_page(url)
        document = pq(html)
        company_name = document('.inner-left.fl h2').text()
        salary = document('.terminalpage-left li:first strong').text()
        position = document('.terminalpage-left li:eq(7) strong').text()
        address = document('.tab-inner-cont h2').text()
        address = re.findall(pattern,address)
        if not address:
            address = '地址信息為空'
        else:
            address = address[0]
        yield {
            'company_name':company_name,
            'salary':salary,
            'position':position,
            'address':address
        }


def write_with_csv(content):
    """將數據寫入csv文件中,注意如果數據存在中文必須指定編碼格式"""
    with open('data.csv','a',encoding='utf-8') as csvfile:
        fieldnames = ['company_name','salary','position','address']
        writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
        writer.writerow(content)


def main(city,keyword,page):
    """主函數,動態生成url,調用以上所有函數實現數據抓取,分析及儲存功能"""
    url_params = {
        'jl':city,
        'kw':keyword,
        'p':page
    }
    url = 'https://sou.zhaopin.com/jobs/searchresult.ashx?' + parse.urlencode(url_params)
    html = get_one_page(url)
    if html:
        url_list = parse_one_page(html)
        items = parse_one_company(url_list)
        for item in items:
            write_with_csv(item)


if __name__ == '__main__':
    # tqdm模塊用於顯示進度
    for i in tqdm(range(1,11)):
        main('廣州','房地產銷售',i)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM