搭建一个Python招聘职位爬虫可视化系统,并集成机器学习功能,可以分解为以下几个关键步骤。以下是一个详细的解决方案,附代码片段和实用建议:
一、系统架构设计
1. 数据采集层(Scrapy/Selenium)
2. 数据存储层(MySQL/MongoDB)
3. 数据分析层(Pandas/Numpy)
4. 可视化层(Dash/Plotly)
5. 机器学习层(Scikit-learn/TensorFlow)
6. 调度与监控(Celery/APScheduler)
二、核心模块实现
1. 爬虫实现(反爬虫处理)
import requests
from bs4 import BeautifulSoup
import time
import random
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...',
}
def scrape_job_site(url):
try:
response = requests.get(url, headers=headers, proxies={'http': '127.0.0.1:7890'})
soup = BeautifulSoup(response.text, 'html.parser')
jobs = []
for item in soup.select('.job-item'):
title = item.select_one('.title').text.strip()
company = item.select_one('.company').text.strip()
salary = item.select_one('.salary').text.strip()
jobs.append({'title': title, 'company': company, 'salary': salary})
return jobs
except Exception as e:
print(f'Error: {str(e)}')
return []
# 示例:增量爬取 & 随机延时
for page in range(1, 10):
time.sleep(random.uniform(1, 3)) # 防止IP封锁
url = f'https://jobsite.com/page/{page}'
jobs = scrape_job_site(url)
# 存储到数据库...
反爬策略:
- 使用随机User-Agent(
fake_useragent
库) - 代理IP池(付费服务或自建)
- Selenium模拟浏览器操作(针对动态加载)
- 请求频率控制(避免高频访问)
2. 数据存储(MongoDB示例)
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['job_db']
collection = db['jobs']
def save_to_mongodb(jobs):
if jobs:
collection.insert_many(jobs)
print(f'Inserted {len(jobs)} jobs.')
# 调用示例
save_to_mongodb(jobs)
3. 数据预处理
使用Pandas进行数据清洗:
import pandas as pd
import re
def clean_salary(salary_str):
# 处理薪资范围,例如'10k-20k' -> 计算平均值15k
nums = re.findall(r'\d+', salary_str)
if len(nums) == 2:
return (int(nums[0](@ref) + int(nums[1](@ref))//2
return None
df = pd.DataFrame(list(collection.find()))
df['salary_avg'] = df['salary'].apply(clean_salary)
df.dropna(subset=['salary_avg'], inplace=True)
4. 可视化展示(使用Dash)
import dash
from dash import dcc, html
import plotly.express as px
app = dash.Dash(__name__)
# 示例图表:薪资分布直方图
fig = px.histogram(df, x='salary_avg', title='薪资分布')
app.layout = html.Div([
html.H1("招聘数据可视化"),
dcc.Graph(figure=fig)
])
if __name__ == '__main__':
app.run_server(debug=True)
5. 机器学习(薪资预测示例)
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.feature_extraction.text import TfidfVectorizer
# 文本特征提取
tfidf = TfidfVectorizer(max_features=100)
text_features = tfidf.fit_transform(df['title'] + ' ' + df['requirements'])
# 合并数值特征(示例)
X = pd.concat([
pd.DataFrame(text_features.toarray()),
df[['experience']]
], axis=1)
y = df['salary_avg']
# 训练模型
X_train, X_test, y_train, y_test = train_test_split(X, y)
model = RandomForestRegressor()
model.fit(X_train, y_train)
print(f'R² Score: {model.score(X_test, y_test):.2f}')
三、拓展功能建议
-
实时监控仪表盘
- 使用Grafana或Power BI接入数据库实时更新
-
职位推荐系统
# 使用余弦相似度匹配职位 from sklearn.metrics.pairwise import cosine_similarity user_skills = ['Python', '机器学习'] user_vec = tfidf.transform([' '.join(user_skills)]) job_sim = cosine_similarity(user_vec, text_features) df['similarity'] = job_sim[0] top_jobs = df.sort_values('similarity', ascending=False).head(5)
-
部署方案
- 使用Docker容器化部署
- Nginx反向代理处理Web请求
- 阿里云/腾讯云服务器部署
四、注意事项
- 法律合规性
- 遵守robots.txt协议
- 设置爬虫间隔时间(如 > 3秒)
- 避免爬取个人隐私数据
- 性能优化
- 异步爬虫(
aiohttp
库) - 使用Redis做缓存
- 异步爬虫(
- 数据更新策略
- 每日凌晨低峰期定时爬取(APScheduler)
五、完整项目结构
/job_analysis_system
├── crawler/ # 爬虫模块
├── database/ # 数据库操作
├── analysis/ # 数据分析与机器学习
├── visualization/ # 可视化Dash应用
├── config.py # 配置文件(API密钥等)
└── requirements.txt # 依赖库列表
若有进一步需求(如某模块的代码扩展或部署细节),可提供更具体的开发方向。