python獲取無憂網的招聘資料
工作前的閒聊
又到了家裡催找工作的時候
我的天,就想窩在家多鑽研一下程式都不行的
然後,爬爬51job的招聘資訊吧,主要是不想自己一頁頁去翻,怪麻煩的
作為一個戀家的人,而且自己有臺車子不開怪可惜的,鑑於廣州限行,就暫不考慮,有需要再看看吧
注:以下內容在作者這邊的請求頭中是有cookie值的,但大家如果需要用的話,就請使用自己的cookie值吧,程式碼中就不貼上去了
介面分析
搜尋關鍵字:"python"
工作地區: "江門" + "中山" + "珠海" + "佛山"
網址是這麼一串東西,
不難看出:
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°reefrom=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°reefrom=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檔案,正式我們想要的內容並且條數是基本接近的(有小部分取不到屬正常情況)