博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Python爬取智联招聘信息做职业规划
阅读量:5875 次
发布时间:2019-06-19

本文共 5090 字,大约阅读时间需要 16 分钟。

  上学期在实验室发表时写了一个爬取智联招牌信息的爬虫。

操作流程大致分为:信息爬取——数据结构化——存入数据库——所需技能等分词统计——数据可视化

  1.数据爬取

 

1 job = "通信工程师" #以爬取通信工程师职业为例 2 leibie = '1' 3 url_job = [] 4  5 for page in range(99): 6     x = str(page) #爬取的页码 7     p = str(page+1) 8     print("正在抓取第一"+p+"页...\n") #提示 9     url = "http://sou.zhaopin.com/jobs/searchresult.ashx?in=210500%3B160400%3B160000%3B160500%3B160200%3B300100%3B160100%3B160600&jl=上海%2B杭州%2B北京%2B广州%2B深圳&kw="+job+"&p="+x+"&isadv=0" #url地址,此处为示例,可更据实际情况更改10     r = requests.post(url) #发送请求11     data = r.text12     pattern=re.compile('ssidkey=y&ss=201&ff=03" href="(.*?)" target="_blank"',re.S) #正则匹配出招聘信息的URL地址13     tmp_job = re.findall(pattern,data)14     url_job.extend(tmp_job) #加入队列

 

 

上面代码以上海、杭州、北京、广州、深圳的“通信工程师”为例实现爬取了智联招聘上每一则招聘信息的URL地址。

(示例)在智联招聘上如下图所示的招聘地址:

  2.数据结构化

获得URL之后,就通过URL,发送get请求,爬取每一则招聘的数据,然后使用Xpath或者正则表达式把所有数据结构化,代码如下:

1 for x in url_job: 2     print(x) 3     d = requests.post(x) #发送post请求 4     zhiwei = d.text 5     selector = etree.HTML(zhiwei) #获得招聘页面源码 6     name = selector.xpath('//div[@class="inner-left fl"]/h1/text()') #匹配到的职业名称 7     mone = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[1]/strong/text()') #匹配到该职位的月薪 8     adress = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[2]/strong/a/text()') #匹配工作的地址 9     exp = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[5]/strong/text()') #匹配要求的工作经验10     education = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[6]/strong/text()') #匹配最低学历11     zhiweileibie = selector.xpath('//div[@class="terminalpage clearfix"]/div[@class="terminalpage-left"]/ul[@class="terminal-ul clearfix"]/li[8]/strong/a/text()') #匹配职位类别12 13     match = re.compile('
(.*?)
',re.S)#此处为匹配对职位的描述,并且对其结构化处理14 description = re.findall(match,zhiwei)15 des = description[0]16 des = filter_tags(des) #filter_tags此函数下面会讲到17 des = des.strip()18 des = des.replace(' ','')19 des = des.rstrip('\n')20 des = des.strip(' \t\n')21 try: #尝试判断是否为最后一则22 name = to_str(name[0])23 mone = to_str(mone[0])24 adress = to_str(adress[0])25 exp = to_str(exp[0])26 education = to_str(education[0])27 zhiweileibie = to_str(zhiweileibie[0])28 des = to_str(des)29 except Exception as e:30 continue

 

上面代码中使用了filter_tags函数,此函数的目的在于把HTML代码替换实体,并且去掉各种标签、注释和换行空行等,该函数代码如下:

1 def filter_tags(htmlstr): 2     #先过滤CDATA 3     re_cdata=re.compile('//
]*//\]\]>',re.I) #匹配CDATA 4 re_script=re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I)#Script 5 re_style=re.compile('<\s*style[^>]*>[^<]*<\s*/\s*style\s*>',re.I)#style 6 re_br=re.compile('
')#处理换行 7 re_h=re.compile('
]*>')#HTML标签 8 re_comment=re.compile('
')#HTML注释 9 s=re_cdata.sub('',htmlstr)#去掉CDATA10 s=re_script.sub('',s) #去掉SCRIPT11 s=re_style.sub('',s)#去掉style12 #s=re_br.sub('\n',s)#将br转换为换行13 s=re_h.sub('',s) #去掉HTML 标签14 s=re_comment.sub('',s)#去掉HTML注释15 #去掉多余的空行16 blank_line=re.compile('\n+')17 s=blank_line.sub('\n',s)18 # s=replaceCharEntity(s)#替换实体19 return s

  3.存入数据库

上面的代码已经帮我们实现根据数据表中设置的字段清洗好杂乱无章的数据了,之后只要在循环中把结构化的数据存入数据库即可。

具体代码如下:

1 conn = pymysql.connect(host='127.0.0.1',user='root',passwd='××××××',db='zhiye_data',port=3306,charset='utf8') 2 cursor=conn.cursor() 3  4 sql='INSERT INTO `main_data_3` (`name`,`mone`,`adress`,`exp`,`education`,`zhiweileibie`,`description`,`leibie`,`company_range`,`company_kind`) VALUES(\''+name+'\',\''+mone+'\',\''+adress+'\',\''+exp+'\',\''+education+'\',\''+zhiweileibie+'\',\''+des+'\',\''+leibie+'\',\'a\',\'b\');'#%(name,mone,adress,exp,education,zhiweileibie,des,leibie) 5  6     #print(sql) 7     try: 8         cursor.execute(sql) 9         conn.commit()10         print (cursor.rowcount)11     except Exception as e:12         print (e)13 cursor.close()14 conn.close()

存入数据库中的具体数据示例如下图:

 

  4.数据统计

首先对职位的描述进行分词统计,以便分析出该职业所需要的技能。

对职位描述进行分词我先使用的是SAE的分词服务,示例代码(PHP)如下(仅供参考):

1     public function get() 2     { 3         $h = D('hotword'); 4         $data = $h->get_des(); 5  6         foreach ($data as $k => $v) { 7             $content = POST("http://segment.sae.sina.com.cn/urlclient.php?encoding=UTF-8&word_tag=1","context=".$v['description']); 8             $text = json_decode($content,true); 9             if (empty($text[0]['word_tag'])) {10                 exit;11             }12             $sta = $h->hotword_save($text);13             dump($sta);14         }15     }

向服务地址发送post请求,会以JSON格式返回具体的分析结果。存入数据库(如下图):

对每个词的出现频率进行统计,去掉一些无关的和通用的词之后就是所需职业技能的关键词。

然后我也对各个地区各个职业的月薪、数量等也进行栏统计。

下面放几张结果的示例图(不清晰的截图,,,见谅哈):

 

下图为不同职业对学历要求的统计图

下图为Python开发出现最多的技能词

下图为C开发出现最多的技能词

最后的分析我这里就不多说了,聪明的人看图都应该能看懂了哈。

posted on
2017-02-22 22:55 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/linuxzxy/p/6431443.html

你可能感兴趣的文章
1、Windows下安装mysql-8.0.12及修改初始密码
查看>>
Confluence 6 数据库表-空间(Spaces)
查看>>
后端技术杂谈11:十分钟理解Kubernetes核心概念
查看>>
消灭毛刺!HBase2.0全链路offheap效果拔群
查看>>
如何用 Python 脚本批量下载 Google 图像?
查看>>
[转]两种高性能I/O设计模式(Reactor/Proactor)的比较
查看>>
Mac OS X 使用virtualenv
查看>>
64位ubuntu运行32位应用缺少libmpfr.so.1
查看>>
中文自然语言处理工具集:分词,相似度匹配
查看>>
JavaScript禁用页面刷新
查看>>
自动驾驶出租车三年后“引爆”激光雷达?Velodyne正潜心打造ASIC版车规级
查看>>
阿里云CentOS搭建系统
查看>>
git rebase
查看>>
TeaWeb v0.1.1 发布,优化缓存策略和其他细节
查看>>
svn 服务器搭建 (Linux)
查看>>
SpringBlade 2.0.1 发布,兼容jdk11与openjdk,增加Saber代码生成功能
查看>>
Cisco ISO 计划命令 kron实现配置定时自动备份
查看>>
rpm 相关问题
查看>>
PE结构讲解--section table 和 section
查看>>
主DNS服务-反向解析
查看>>