1. 程式人生 > >python獲取無憂網的招聘資料

python獲取無憂網的招聘資料

工作前的閒聊

又到了家裡催找工作的時候

我的天,就想窩在家多鑽研一下程式都不行的

然後,爬爬51job的招聘資訊吧,主要是不想自己一頁頁去翻,怪麻煩的

作為一個戀家的人,而且自己有臺車子不開怪可惜的,鑑於廣州限行,就暫不考慮,有需要再看看吧

:以下內容在作者這邊的請求頭中是有cookie值的,但大家如果需要用的話,就請使用自己的cookie值吧,程式碼中就不貼上去了


介面分析

搜尋關鍵字:"python"

工作地區: "江門" + "中山" + "珠海" + "佛山"

https://search.51job.com/list/031500%252C030700%252C030500%252C030600,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=

網址是這麼一串東西,

不難看出:

031500就是江門, 030700就是中山, 030500就是珠海, 030600就是佛山

%252C是他們中間的連線符

然後還有後面的python , 以及.html?前的那個數字是頁數

剩下那些引數其實都不太需要,但還是留著吧

頁面爬取

介面基本分析完,先把網頁文字拔下來看看長啥樣

import requests

url = r"https://search.51job.com/list/031500%252C030700%252C030500%252C030600,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}

resp = requests.get(url, headers=headers)

with open("51job.html", "w", encoding="utf-8") as f:
    f.write(resp.content.decode(resp.encoding))

儲存到的html檔案點開看看,然後發現,很多是亂碼,主要還是因為這個response.encoding不太給力,不過沒關係,拿到第一手網頁程式碼,可以到head標籤中的meta標籤中查詢charset屬性,這裡找到是gbk,然後把response.encoding改成"gbk"即可

修改之後再執行一次,走你 !

這就可以了,然後看看拿到的頁面有沒有我們需要的內容

頁面分析

在網頁審查元素可以看到我們想要的是id為resultList的div下的類屬性為el的div

 

 

 

在我們儲存的網頁程式碼中查詢關鍵字,可以看到我們需要的資訊是存在的

資訊等的都十分齊全

解析與提取頁面資料

接下來就是解析,用的是xpath , 初步解析,要求先是取到以下內容

div下的p標籤下的span標籤下的a標籤的href值和文字內容,"職位名稱"(a標籤裡的href連結方便後續爬取職位詳情)

div下的class=t2的span標籤的文字內容,"所屬公司"

div下的class=t3的span標籤的文字內容,"上班地點"

div下的class=t4的span標籤的文字內容,"工資待遇"

div下的class=t5的span標籤的文字內容,"釋出時間"

from lxml import etree
content = resp.content.decode("gbk")

tree = etree.HTML(content)

div_list = tree.xpath('//div[@id="resultList"]/div[@class="el"]')

for div in div_list:
    try:
        position = div.xpath('./p/span/a/text()')[0].strip()
        href = div.xpath('./p/span/a/@href')[0].strip()
        company = div.xpath('./span[@class="t2"]/a/text()')[0].strip()
        city = div.xpath('./span[@class="t3"]/text()')[0].strip()
        treatment = div.xpath('./span[@class="t4"]/text()')[0].strip()
        publish_time = div.xpath('./span[@class="t5"]/text()')[0].strip()
    except:
        continue

資料的儲存

還有什麼格式的文件比類excel文件看起來舒服的呢,所以這裡採用numpy模組對資料進行處理並儲存到本地

import numpy as np

# 這是在for迴圈之前的
arr = np.array(["職位", "連結", "公司", "城市", "待遇", "釋出時間"])

# 這是在for迴圈裡取得資料之後的(try結構外)
    arr_tmp = np.array([position, href, company, city, treatment, publish_time])
    arr = np.vstack((arr, arr_tmp))

# 這是在for迴圈之後的
np.savetxt("work.csv", arr, fmt="%s", delimiter=",")

這是後就能看到目錄下生成了以個csv檔案

開啟檢視,正是我們想要的內容

接下來可以大量地獲取了

正式爬取資料

從網頁可以直觀看到有10頁的資料,所以直接用迴圈取獲取即可

整體程式碼如下

import requests
from lxml import etree
import numpy as np


arr = np.array(["職位", "連結", "公司", "城市", "待遇", "釋出時間"])

url_head = r"https://search.51job.com/list/031500%252C030700%252C030500%252C030600,000000,0000,00,9,99,python,2,"

url_tail = r".html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
for page in range(10):
    url = url_head + str(page + 1) + url_tail
    resp = requests.get(url, headers=headers)
    content = resp.content.decode("gbk")
    tree = etree.HTML(content)
    div_list = tree.xpath('//div[@id="resultList"]/div[@class="el"]')
    for div in div_list:
        try:
            position = div.xpath('./p/span/a/text()')[0].strip()
            href = div.xpath('./p/span/a/@href')[0].strip()
            company = div.xpath('./span[@class="t2"]/a/text()')[0].strip()
            city = div.xpath('./span[@class="t3"]/text()')[0].strip()
            treatment = div.xpath('./span[@class="t4"]/text()')[0].strip()
            publish_time = div.xpath('./span[@class="t5"]/text()')[0].strip()
        except:
            continue
        arr_tmp = np.array([position, href, company, city, treatment, publish_time])
        arr = np.vstack((arr, arr_tmp))

np.savetxt("work.csv", arr, fmt="%s", delimiter=",")

爬取完畢之後檢查csv檔案,正式我們想要的內容並且條數是基本接近的(有小部分取不到屬正常情況)