最近在帮朋友优化简历时发现一个现象:同样一份工作,不同招聘网站对岗位描述的用词差异巨大。有的公司写"精通Python",有的写"熟练使用Python开发",还有的用"Python编程能力优秀"——这些细微差别背后,其实藏着HR筛选简历的关键密码。
于是萌生了一个想法:能不能用爬虫抓取各大招聘网站的岗位描述,统计高频技术关键词?这样不仅能知道哪些技能最热门,还能发现不同公司对同一技能的不同表述方式,让简历优化更有针对性。
这个爬虫项目核心解决三个问题:
国内主流招聘平台的反爬策略差异明显:
考虑到开发成本,首期选择智联招聘作为数据源。其特点:
采用分层架构:
code复制爬取层 → 解析层 → 存储层 → 分析层
注意:严格遵守robots.txt协议,设置3秒请求间隔,单日抓取量控制在2000页以内
招聘网站的分页逻辑常有陷阱:
python复制def parse_page(self, response):
# 处理正常分页
yield from self.parse_job_list(response)
# 处理JavaScript生成的分页按钮
hidden_pages = response.xpath('//input[@name="totalPage"]/@value').get()
if hidden_pages and int(hidden_pages) > self.page:
next_page = f"?page={self.page+1}"
yield response.follow(next_page, self.parse_page)
岗位描述中的干扰项需要特殊处理:
python复制class TextCleanPipeline:
def process_item(self, item, spider):
desc = item['job_desc']
# 移除HTML标签
desc = re.sub(r'<[^>]+>', '', desc)
# 过滤薪资范围(如15k-30k)
desc = re.sub(r'\d+k-\d+k', '', desc)
# 标准化技能名称
desc = desc.replace('PYTHON', 'Python')
item['clean_desc'] = desc
return item
结合TF-IDF和词性标注提升准确率:
python复制def extract_keywords(texts):
# 加载停用词表
stopwords = set(open('stopwords.txt').read().splitlines())
# 自定义词典添加技术名词
jieba.load_userdict('tech_terms.dict')
# 关键词提取
tfidf = TfidfVectorizer(tokenizer=jieba.cut, stop_words=stopwords)
tfidf_matrix = tfidf.fit_transform(texts)
return tfidf.get_feature_names_out()
| 指标类型 | 计算方式 | 应用场景 |
|---|---|---|
| 绝对词频 | 词出现总次数 | 判断技能热度 |
| 岗位覆盖率 | 包含该词的岗位比例 | 判断技能普适性 |
| 组合词频 | 两个词共同出现的频率 | 发现技能组合需求 |
通过公司行业标签,计算:
code复制行业特异性 = (词在目标行业的频率) / (词在全行业的频率)
值>1表示该技能在目标行业更受重视
使用皮尔逊相关系数计算:
code复制关键词薪资相关性 = corr(关键词出现频率, 岗位薪资中位数)
问题1:突然返回空白页面
问题2:关键字段位置变化
同义词合并:
技能等级识别:
python复制re.findall(r'(精通|熟练|熟悉|了解).*?(Python|Java)', desc)
python复制def generate_wordcloud(keywords):
# 设置技能词形状
mask = np.array(Image.open('python_logo.png'))
wc = WordCloud(
font_path='msyh.ttc',
background_color='white',
mask=mask,
colormap='viridis'
)
wc.generate_from_frequencies(keywords)
return wc.to_image()
使用Pyecharts制作技能热度时间轴:
python复制timeline = Timeline()
for month in months:
chart = (
Bar()
.add_xaxis(top_skills)
.add_yaxis("需求频次", month_data)
)
timeline.add(chart, month)
timeline.render("skill_trend.html")
我在实际运行中发现,不同城市的技能需求差异比预期更大。比如上海更看重"分布式系统"经验,而深圳的"跨境电商"相关技能出现频率明显更高。这提示我们做地域分析时应该分城市统计,而不是简单汇总全国数据。
另一个实用技巧:把"掌握/熟悉/精通"等程度词与技能组合统计,可以生成这样的实用建议:"当你的Python经验达到3年以上时,在简历中用'精通Python'比用'熟悉Python'获得面试邀约的概率高37%"——这样的具体数据对求职者特别有价值。