【大数据实战】招聘网站职位分析
通过采集招聘网站大数据职位信息、利用数据清洗、数据分析、结巴分词、数据挖掘完成整体项目的开发工
作。任务包含爬取招聘网站大数据职位信息、使用 BeautifulSoup 清洗职位信息网页、使用 PySpark 对智联数
据进行分析、对招聘职位信息进行探索分析、使用结巴分词对岗位描述进行分词并将关键词统计、利用
Echarts 将职位分析结果进行可视化、建立职位模型对应聘人员进行相似度的计算。
一、爬取招聘网站大数据职位信息
使用 urllib.request.urlopen(urllib.request.Request(url))获取主页源网页信息,用 Beautiful Soup
对主页源网页信息进行解析,获取招聘网页的 URL,在用
urllib.request.urlopen(urllib.request.Request(URL))获取招聘网页的信息,并保存。
二、使用 BeautifulSoup 清洗职位信息网页
Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象
可以归纳为 4 种:Tag、NavigableString、BeautifulSoup、Comment。
三、使用 PySpark 对智联数据进行分析
Spark 数据处理方式主要有三种:RDD、DataFrame、Spark SQL 三者的主要差异在于是否定义
SchemaRDD 的数据未定义 Schema(也就是未定义字段名及数据类型)。使用上必须有 Map/Reduce 的
概念,需要高级别的程序设计能力。但是功能也最强,能完成所有 Spark 功能。Spark DataFrame 建立时
必须定义 Schema(定义每一个字段名与数据类型)Spark SQL 是由 DataFrame 衍生出来的,我们必须先
建立 DataFrame,然后通过登录 Spark SQL temp table,就可以使用 Spark SQL 语法了。
四、对招聘职位信息进行探索分析
matplotlib 是基于 Python 语言的开源项目,旨在为 Python 提供一个数据绘图包。使用 matplotlib
分析招聘信息中,经验、薪资、学历等的分布
五、使用结巴分词对岗位描述进行分词并将关键词统计
jieba“结巴”中文分词:做的最好的 Python 中文分词组件,使用 jiaba 分词切割岗位描述文档,对
涉及到的关键技术(英文单词)进行词频统计,设计 Mysql 中的表,将统计的数据存入 Mysql 中。
六、利用 Django Echarts 将职位分析结果进行可视化
Django Echarts 实现一个可视化字符云,利用字符云的形式展示数值的占比。
七、建立职位模型对应聘人员进行相似度的计算
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型。首先对文本预处理(分词、去停用词),
然后使用 LDA 模型向量化文本,计算计算相似度。
任务要求:
一、爬取招聘网站大数据职位信息
爬取智联招聘网页
实验目的
1.了解什么是爬虫
2.常见的爬虫框架
3.爬虫架构
4.爬取策略
实验原理
1.网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成
一个互联网内容的镜像备份。
(通用的爬虫框架)
网络爬虫的基本工作流程如下:
(1)首先选取目标 URL;
(2)将目标 URL 放入待抓取 URL 队列;
(3)从待抓取 URL 队列中取出待抓取在 URL,解析 DNS,并且得到主机的 ip,并将 URL 对应的网页下
载下来,存储进已下载网页库中。此外,将这些 URL 放进已抓取 URL 队列。
(4)分析已抓取 URL 队列中的 URL,分析其中的其他 URL,并且将 URL 放入待抓取 URL 队列,从而进
入下一个循环。
2.在爬虫系统中,待抓取 URL 队列是很重要的一部分。待抓取 URL 队列中的 URL 以什么样的顺序排
列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些 URL 排列顺
序的方法,叫做抓取策略。下面重点介绍几种常见的抓取策略:
(1)深度优先遍历策略
深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后
再转入下一个起始页,继续跟踪链接。它的遍历的路径:A-F-G E-H-I B C D,如下图:
(2)宽度优先遍历策略
宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取 URL 队列的末尾。也就
是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此
网页中链接的所有网页。它的遍历路径:A-B-C-D-E-F G H I
(3)反向链接数策略
反向链接数是指一个网页被其他网页链接指向的数量。反向链接数表示的是一个网页的内容受到其他
人的推荐的程度。因此,很多时候搜索引擎的抓取系统会使用这个指标来评价网页的重要程度,从而
决定不同网页的抓取先后顺序。
(4)Partial PageRank 策略
Partial PageRank 算法借鉴了 PageRank 算法的思想:对于已经下载的网页,连同待抓取 URL 队列中
的 URL,形成网页集合,计算每个页面的 PageRank 值,计算完之后,将待抓取 URL 队列中的 URL
按照 PageRank 值的大小排列,并按照该顺序抓取页面。
(5)OPIC 策略
该算法实际上也是对页面进行一个重要性打分。在算法开始前,给所有页面一个相同的初始现金(cash)。
当下载了某个页面 P 之后,将 P 的现金分摊给所有从 P 中分析出的链接,并且将 P 的现金清空。对于
待抓取 URL 队列中的所有页面按照现金数进行排序。
(6)大站优先策略
对于待抓取 URL 队列中的所有网页,根据所属的网站进行分类。对于待下载页面数多的网站,优先下
载。这个策略也因此叫做大站优先策略。
实验环境
Linux Ubuntu 16.04
Python 3.5
PyCharm
实验内容
爬取智联招聘全国大数据方向的招聘信息
实验步骤
1.打开 Pycharm,选择 Create New Project,创建名为 ZhiLian 的项目。
Location 处填写/data/ZhiLian,Interpreter 处选择 3.6.0 at~/Anaconda 4/bin/python。
2.打开 ZhiLian 项目,右键选择 New=>Python File,创建名为 BigData 的 Python 文件。
3.打开 BigData.py 文件,现在我们编写代码,爬取智联招聘网站大数据方向的招聘数据。
导入程序所用的外包
view plain copy
1. import urllib
2. from urllib.parse import *
3. from bs4 import BeautifulSoup
4. import string
5. import random
6. import pandas as pd
7. import os
4.将爬虫伪装成浏览器,防止网站针对爬虫的限制:
view plain copy
1. headers = [
2.
"Mozilla/5.0 (Windows NT 6.1; Win64; rv:27.0) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:27.0) Gecko/20100101 Fi
rfox/27.0"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (K
HTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:10.0) Gecko/20100101 Fi
rfox/10.0"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (K
HTML, like Gecko) Chrome/21.0.1180.110 Safari/537.36"
"Mozilla/5.0 (X11; Ubuntu; Linux i686 rv:10.0) Gecko/20100101 Fi
rfox/27.0"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, l
ike Gecko) Chrome/34.0.1838.2 Safari/537.36"
"Mozilla/5.0 (X11; Ubuntu; Linux i686 rv:27.0) Gecko/20100101 Fi
3.
4.
5.
6.
7.
8.
9.
rfox/27.0"
10.
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (K
HTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
11.
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
12.
]
5.模拟登陆获取网址
view plain copy
1. def get_content(url, headers,str):
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
'''''
@url:需要登录的网址
@headers:模拟的登陆的终端
*********************模拟登陆获取网址********************
'''
random_header = random.choice(headers)
req = urllib.request.Request(url)
req.add_header("User-Agent", random_header)
req.add_header("Get", url)
req.add_header("Host", "{0}.zhaopin.com".format(str))
req.add_header("refer", "http://{0}.zhaopin.com/".format(str))
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
try:
html = urllib.request.urlopen(req)
contents = html.read()
# print(contents)
# 判断输出内容 contents 是否是字节格式
if isinstance(contents, bytes):
# 转成字符串格式
contents = contents.decode('utf-8')
else:
print('输出格式正确,可以直接输出')
##输出的是字节格式,需要将字节格式解码转成’utf-8‘
return (contents)
except Exception as e:
print(e)
6.获取全部子网页地址
view plain copy
1. def get_links_from(job, city, page):
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
'''''
@job:工作名称
@city:网址中城市名称
@page:表示第几页信息
@urls:所有列表的超链接,即子页网址
****************此网站需要模拟登陆**********************
返回全部子网页地址
'''
urls = []
for i in range(page):
url='http://sou.zhaopin.com/jobs/searchresult.ashx?jl={0}&k
w={1}&p={2}&isadv=0'.format(str(city),str(job),i)
url = quote(url, safe=string.printable)
info = get_content(url, headers,'sou')
soup = BeautifulSoup(info, "lxml") # 设置解析器为“lxml”
# print(soup)
link_urls = soup.select('td.zwmc a')
for url in link_urls:
urls.append(url.get('href'))
# print(urls)
13.
14.
15.
16.
17.
18.
19.
20.
7.获取招聘网页信息,并保存
view plain copy
'''''
获取招聘网页信息
'''
urls = get_links_from(job, city, page)
path='/data/zhilian/'
if os.path.exists(path)==False:
1. def get_recuite_info(job, city, page):
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
os.makedirs(path)
for url in urls:
print(url)
file=url.split('/')[-1]