抓取智聯招聘

抓取智聯招聘html

 1、 項目需求python

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

2. 使用請求庫:requestsapp

3. 使用解析庫:pyquery函數

4. 使用CSV儲存數據網站

 

 2、 項目分析編碼

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

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

(注:若是圖片看不清楚請右鍵點擊圖片經過新的標籤打開)設計

 這裏拿到了一個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元素的文本內容排除掉(詳細看後面源碼)。

 

 3、 項目源碼

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)
相關文章
相關標籤/搜索