目錄
一、抓取並解析數據
1.導入相關庫
2、獲取網頁信息
3.數據清洗
4.爬取結果:
??二、保存數據
1.保存到excel中
2.保存到數據庫中
?
?3.調用
三、使用flask,實現可視化
1.主函數
2.可視化界面:
2.1職位信息展示+分頁
2.2使用echars制作圖標?
2.3導入地圖?
?2.4制作詞雲
?三.總結
運用正則表達式,找到相對應的數據,然後對數據進行清洗,最後保存數據,保存為excel文件和保存到數據庫中。(這裡用的是sqlite數據庫)
import re # 正則表達式,進行文字匹配
from urllib.request import Request
from urllib.request import urlopen # 制定URL,獲取網頁數據
from urllib.error import URLError as error
import json
import xlwt
import sqlite3
爬取到的信息是很多,需要用正則表達式進行匹配,一個工作崗位有:8個屬性,我只爬取職位名稱、公司名稱、公司鏈接、工資、工作地點、是否是實習、員工待遇。
def main():
baseurl = "https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,{}.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
# 1.爬取網頁
datalist = getData(baseurl)
savepath = "51job.xls"
jobpath = "newjob.db"
# 保存數據到表格
saveData(datalist, savepath)
# 保存數據到數據庫
saveData2DB(datalist, jobpath)
# 爬取網頁
def getData(baseurl):
datalist = []
for page in range(0, 30):
url1 = baseurl.format(page + 1)
html = askURL(url1) # 保存獲取到的網頁源碼
# 2.逐一解析數據
html_data = re.findall('window.__SEARCH_RESULT__ =(.*?)</script>', html, re.S)
html_data = ''.join(html_data)
infodict = json.loads(html_data) # 將str類型的數據轉換為dict類型
engine_jds = infodict['engine_jds']
for item in engine_jds:
data = []
job_href = item["job_href"] # 工作鏈接
name = item['job_name']
temp1 = re.sub(' ', '', name)
# 去掉括號中的內容,英文的括號要加反斜槓
temp2 = re.sub('(.*?)', '', temp1)
# 去掉括號中的內容,中文括號
job_name = re.sub('(.*?)', '', temp2)
job_company = item['company_name']
job_salary1 = item['providesalary_text']
if job_salary1:
job_salary = get_avgsalary(job_salary1)
else:
job_salary = ""
area = item["workarea_text"] # 工作地點
newarea = re.findall('(.*?)-', area, re.S)
job_area = ''.join(newarea)
demand = item['attribute_text'][1:]
job_requirements = ' '.join(demand)
if job_requirements.find(' ') != -1:
job_experience, job_education = job_requirements.split(' ')
else:
job_experience = job_requirements
job_fuli = item['jobwelf'] if item['jobwelf'] else '無'
if job_salary == "" or job_area == "" or job_education == "":
continue
else:
data.append(job_href)
data.append(job_name)
data.append(job_company)
data.append(job_salary)
data.append(job_area)
# data.append(job_requirements)
data.append(job_experience)
data.append(job_education)
data.append(job_fuli)
datalist.append(data)
# print(datalist)
return datalist
主要對薪資進行清洗,統一以萬/月為單位,並取區間平均值。
# 對薪資進行數據清洗
def get_avgsalary(salary):
global avg_salary
if '-' in salary: # 針對10-20千/月或者10-20萬/年的情況,包含-
low_salary = re.findall(re.compile('(d*.?d+)'), salary)[0]
high_salary = re.findall(re.compile('(d?.?d+)'), salary)[1]
avg_salary = (float(low_salary) + float(high_salary)) / 2
avg_salary = ('%.2f' % avg_salary)
if u'萬' in salary and u'年' in salary: # 單位統一成萬/月的形式
avg_salary = float(avg_salary) / 12
avg_salary = ('%.2f' % avg_salary) # 保留兩位小數
elif u'千' in salary and u'月' in salary:
avg_salary = float(avg_salary) / 10
else: # 針對20萬以上/年和100元/天這種情況,不包含-,取最低工資,沒有最高工資
avg_salary = re.findall(re.compile('(d*.?d+)'), salary)[0]
if u'萬' in salary and u'年' in salary: # 單位統一成萬/月的形式
avg_salary = float(avg_salary) / 12
avg_salary = ('%.2f' % avg_salary)
elif u'千' in salary and u'月' in salary:
avg_salary = float(avg_salary) / 10
elif u'元' in salary and u'天' in salary:
avg_salary = float(avg_salary) / 10000 * 21 # 每月工作日21天
avg_salary = str(avg_salary) + '萬/月' # 統一薪資格式
return avg_salary
def saveData(datalist, savepath):
print("sava....")
book = xlwt.Workbook(encoding="utf-8", style_compression=0) # 創建work對象
sheet = book.add_sheet('python', cell_overwrite_ok=True) # 創建工作表
col = ("工作鏈接", "工作名稱", "公司", "薪資", "工作地區", "工作經驗", "學歷", "員工福利")
for i in range(0, 8):
sheet.write(0, i, col[i]) # 列名
for i in range(0, 1000):
# print("第%d條" %(i+1))
data = datalist[i]
for j in range(0, 8):
sheet.write(i + 1, j, data[j]) # 數據
book.save(savepath) # 保存數據
結果顯示:
# 創建數據表 (表名為newjob)
def init_job(jobpath):
sql = '''
create table newjob
(
id integer primary key autoincrement,
job_href text,
job_name varchar,
job_company varchar,
job_salary text ,
job_area varchar ,
job_experience text,
job_education text,
job_fuli text
)
'''
conn = sqlite3.connect(jobpath)
cursor = conn.cursor()
cursor.execute(sql)
conn.commit()
conn.close()
#將數據保存到數據庫中
def saveData2DB(datalist, jobpath):
init_job(jobpath)
conn = sqlite3.connect(jobpath)
cur = conn.cursor()
for data in datalist:
for index in range(len(data)):
data[index] = '"' + str(data[index]) + '"'
sql = '''
insert into newjob (
job_href,job_name,job_company,job_salary,job_area,job_experience,job_education,job_fuli)
values(%s)''' % ",".join(data)
# print(sql)
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
在main函數中
# 保存數據到表格
saveData(datalist, savepath)
# 保存數據到數據庫
saveData2DB(datalist, jobpath)
實現繪圖、分詞、連接數據庫導入數據、制作詞語等
import jieba # 分詞作用
from matplotlib import pyplot as plt # 繪圖作用,數據可視化
from wordcloud import WordCloud # 詞雲
from PIL import Image # 圖片處理
import numpy as np # 矩陣運算
import sqlite3 # 數據庫
# 准備詞雲所需要的詞
con = sqlite3.connect("newjob.db")
cur = con.cursor()
sql = "select job_name from newjob"
data = cur.execute(sql)
test = ""
for item in data:
test = test + item[0]
# print(test)
cur.close()
con.close()
# 分詞
cut = jieba.cut(test)
string = " ".join(cut)
print(len(string))
img = Image.open(r'staticassetsimgdemo.png') # 打開圖片
img_array = np.array(img) # 將圖片轉化為二維數組
wc = WordCloud(
background_color="white",
mask=img_array,
font_path="msyh.ttc" # 字體所在位置 c:windowsonts
)
wc.generate_from_text(string)
# 繪制圖片
fip = plt.figure(1)
plt.imshow(wc)
plt.axis("off") # 是否顯示坐標軸
# plt.show() #顯示生成的詞雲圖片
#輸出詞雲圖片到文件
plt.savefig(r'staticassetsimgdemo1.jpg')
import jieba # 分詞作用
from matplotlib import pyplot as plt # 繪圖作用,數據可視化
from wordcloud import WordCloud # 詞雲
from PIL import Image # 圖片處理
import numpy as np # 矩陣運算
import sqlite3 # 數據庫
# 准備詞雲所需要的詞
con = sqlite3.connect("newjob.db")
cur = con.cursor()
sql = "select job_name from newjob"
data = cur.execute(sql)
test = ""
for item in data:
test = test + item[0]
# print(test)
cur.close()
con.close()
# 分詞
cut = jieba.cut(test)
string = " ".join(cut)
print(len(string))
img = Image.open(r'staticassetsimgdemo.png') # 打開圖片
img_array = np.array(img) # 將圖片轉化為二維數組
wc = WordCloud(
background_color="white",
mask=img_array,
font_path="msyh.ttc" # 字體所在位置 c:windowsonts
)
wc.generate_from_text(string)
# 繪制圖片
fip = plt.figure(1)
plt.imshow(wc)
plt.axis("off") # 是否顯示坐標軸
# plt.show() #顯示生成的詞雲圖片
#輸出詞雲圖片到文件
plt.savefig(r'staticassetsimgdemo1.jpg')
第一次寫項目總結,筆記還不太完善,只是做了一個很簡單的框架,簡單記錄一下!(需要完整項目工程文件,可以私信或留言)
先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦