网页源码解析 - 智联招聘信息页面
根据招聘列表里面跳转过来的详细招聘信息页面。爬虫再根据这里进行关键信息提取。
相比于搜索列表页来说,这页内容很简单,而我们需要的也不多。
不过需要注意的是,这里在职业信息之外还需要额外收集企业信息。
虽然另外有专门的代码跳转到企业主页去搜集信息,但是阅读源码后发现,每家VIP企业都可以自己定制网页,因此获取基本信息不方便。
所以企业基本信息要在这一页就收集齐(基本信息和企业主页里是完全一样的)。
下面开始简单分析下各处源码。
职位的头信息
<div class="inner-left fl">
<h1>销售、销售总监阿尔卡特数据、语音交换机(金牌代理商)</h1>
<h2><a onclick="recordOutboundLink(this, 'terminalpage', 'tocompanylink3');" href="http://company.zhaopin.com/%E4%B8%8A%E6%B5%B7%E5%B7%A8%E4%BC%98%E4%BF%A1%E6%81%AF%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8_CC355086418.htm" target="_blank">上海巨优信息科技有限公司</a></h2>
<div style="" class="welfare-tab-box"> <span>五险一金</span><span>年底双薪</span><span>绩效奖金</span><span>年终分红</span><span>带薪年假</span><span>节日福利</span><span>通讯补贴</span><span>交通补助</span> </div>
</div>
可以直接用class*="inner-left"
对头信息进行定位,然后在其中用h1
标签为职位名称,h2
标签为公司名称,class="welfare-tab-box"
为福利信息。
职位基础信息
<ul class="terminal-ul clearfix">
<li><span>职位月薪:</span><strong>8001-10000元/月</strong></li>
<li><span>工作地点:</span><strong><a target="_blank" href="http://www.zhaopin.com/beijing/">北京</a></strong></li>
<li><span>发布日期:</span><strong><span id="span4freshdate">2015-12-12</span></strong></li>
<li><span>工作性质:</span><strong>全职</strong></li>
<li><span>工作经验:</span><strong>1-3年</strong></li>
<li><span>最低学历:</span><strong>大专</strong></li>
<li><span>招聘人数:</span><strong>1人 </strong></li>
<li><span>职位类别:</span><strong><a href="http://jobs.zhaopin.com/355086418250171.htm?ssidkey=y&ss=201&ff=03#"></a><a target="_blank" href="http://jobs.zhaopin.com/beijing/sj001/">销售经理</a></strong></li>
</ul>
基础信息定位很简单,class^="terminal-ul"
就够了。但是其中的每个信息没有标记,就只能用中文名称或者是顺序定位了。
信息内容全包含在strong
标签里。
企业基本信息
<div class="company-box">
<p class="company-name-t"><a rel="nofollow" href="http://company.zhaopin.com/%E4%B8%8A%E6%B5%B7%E5%B7%A8%E4%BC%98%E4%BF%A1%E6%81%AF%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8_CC355086418.htm" target="_blank">上海巨优信息科技有限公司</a></p>
<ul class="terminal-ul clearfix terminal-company mt20">
<li><span>公司规模:</span><strong>20-99人</strong></li>
<li><span>公司性质:</span><strong>民营</strong></li>
<li><span>公司行业:</span><strong><a target="_blank" href="http://jobs.zhaopin.com/beijing/in160100/">通信/电信运营、增值服务</a></strong></li>
<li><span>公司主页:</span><strong><a rel="nofollow" href="http://www.g-best.com.cn/" target="_blank">http://www.G-best.com.cn</a></strong></li>
<li>
<span>公司地址:</span><strong>
上海市徐汇区桂林路396号中核浦原科技园3号楼101室<br>
</strong>
</li>
</ul>
<!--是否是反馈通-->
<input type="hidden" id="displayRegionScopeId" name="displayRegionScopeId" value="0">
</div>
定位的话,直接找到class中含有terminal-company
的ul标签,然后按照li
标签的顺序或者按照中文文字匹配到企业基本信息。
职位描述信息
<div class="tab-inner-cont">
<!-- SWSStringCutStart -->
<div style="FONT-SIZE: 12px"><strong>任职要求:</strong></div><div style="FONT-SIZE: 12px"><br><div style="WORD-WRAP: break-word; FONT-FAMILY: Verdana; WORD-BREAK: break-all; LINE-HEIGHT: 18px; BACKGROUND-COLOR: rgb(255,255,255)">1、1年以上IT行业的售经验,以通讯产品及服务器产品为主;<br>2、熟悉Siemens,NEC, Panasonic,Alcatel等PBX 机型,具有VOIP组网的相关销售经验;具备专业客户销售技巧;擅长与客户交流并能迅速整合客户所需资源;</div><div style="WORD-WRAP: break-word; FONT-FAMILY: Verdana; WORD-BREAK: break-all; LINE-HEIGHT: 18px; BACKGROUND-COLOR: rgb(255,255,255)">3、熟悉思科、华为、Alcatel等数据交换机,具有相关销售经验;具备专业客户销售技巧;擅长与客户交流并能迅速整合客户所需资源; <br>4、具备良好人际交往、市场策划、方案演讲、商务谈判,有强烈的赢单欲望,乐于陌生人交流,善于沟通,性格稳重、勤奋,能够承受较大销售业绩压力。<br>5、有销售同类语音交换机PBX、数据交换机 产品经验者优先。</div></div><div style="FONT-SIZE: 12px"><br><strong>岗位职责:</strong></div><div style="FONT-SIZE: 12px"><br>1、负责本地区维护老客户,拓展新市场,建立与扩大销售网络,提升销售业绩,完成总部或分公司交付的销售任务; <br>2、建立和维护本地区的客户关系,树立良好的公司口碑和品牌形象;<br>3、负责项目投标的运作,包括商务文件的起草和整个标书的制作与审定;负责商务合同的起草、签署和项目收款工作;<br>4、高标准地为客户提供优质服务和妥善处理客户投诉,以提高客户的满意度;<br>5、不断学习新知识与新技术,提升自身的专业能力与职业素质;</div><div style="FONT-SIZE: 12px"> </div><div style="FONT-SIZE: 12px"><strong>工作地点:</strong> 北京</div>
<!-- SWSStringCutEnd -->
<b>工作地址:</b>
<h2>
北京市丰台区南三环西路16号搜宝商务中心2号楼2608室
<a href="javascript:fnOpenMiniMap('','','北京','31.167743','121.417537');" onclick="dyweTrackEvent('bjobsdetail14gb', 'showjobmap');" class="see-map">查看职位地图</a>
</h2>
<p>
<button id="applyVacButton1" class="button-small" title="申请职位" onclick="zlzp.searchjob.ajaxApplyBrig3('1');dyweTrackEvent('bjobsdetail14gb','directapply_middle');"></button>
</p>
</div>
这个也好说,直接找到class="tab-inner-cont"
,然后自动排除所有标签,只获取文本信息就够了。
需要注意的是,源码里有2个class为tab-inner-cont
的div,第1个是职位描述,第2个是企业简介。
企业简介
<div class="tab-inner-cont" style="display:none;">
<h5><a rel="nofollow" href="http://company.zhaopin.com/%E4%B8%8A%E6%B5%B7%E5%B7%A8%E4%BC%98%E4%BF%A1%E6%81%AF%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8_CC355086418.htm" onclick="recordOutboundLink(this, 'terminalpage', 'tocompanylink4');" target="_blank">上海巨优信息科技有限公司</a><a target="_blank" class="color-blue fr see-other-job" href="http://company.zhaopin.com/%E4%B8%8A%E6%B5%B7%E5%B7%A8%E4%BC%98%E4%BF%A1%E6%81%AF%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8_CC355086418.htm" rel="nofollow" onclick="recordOutboundLink(this, 'terminalpage', 'tocompanylink2');">该公司其他职位</a></h5>
<p></p>
<div style="FONT-SIZE: 12px"> 上海巨优信息科技有限公司是一家专业的企业通信设备供应商及产品服务商,提供包括语音、数据、多媒体等各类专网设备。公司为各种类型的企业提供适用的通信及数据网络融合方案:宾馆、医院、大、中型企业、小型商务办公、政府机关等。<br> 巨优信息是法国阿尔卡特朗讯公司企业通信系统全国金牌代理商,同时也是华为、HP、思科等IT国际知名品牌的核心合作伙伴。</div><div style="FONT-SIZE: 12px"> 公司拥有一支经阿尔卡特认证的工程师团队,其中多名工程师同时拥有思科、华为的认证证书。专业的管理、专业的人才,构建了专业的客户培训服务体系,专业的品质与完善的服务保障体系为公司赢得了长期友好合作的客户伙伴。公司技术部以其雄厚的技术实力、丰富的方案实施经验为用户提供多种类型的语音通信、组网、IP统一通信、数据网络等方案的设计与集成服务,并为用户提供端到端的全面解决方案。<br> 我司自成立以来,业务发展迅速,业务已分布至全国各地,有效地增强了我司在中国大陆地区的客户综合服务能力。集售前、售中、售后服务于一身的营销服务网络,为用户提供了全面周到的专业化服务。与此同时,我司拥有遍布全国各地的客户资源及核心合作伙伴,并且造就了出色的销售团队。<br> 巨优科技与世界最先进通讯技术同步,为国内商业用户提供一流的产品技术及服务品质,我们的理念是“客户至上、勇于创新、精诚合作、尽职尽责!” <br> 巨优科技一贯秉承“创新、开拓、最佳性价比的产品;诚挚服务快速成长性的市场;矢志成为一流的通信公司”的宗旨,不断推出符合市场发展趋势的特色产品,信守不断创新和帮助客户成功的核心价值观。 <br> </div>
<p></p>
<h3></h3>
<p>
</p>
</div>
上面说过了,职位描述的class也为tab-inner-cont
,所以获取的时候按顺序取值就好了。
网页源码解析 - 企业主页
智联招聘的企业主页分为2种:普通主页和VIP主页。VIP主页是智联招聘里唯一能够让企业自己定制的页面了。
这也就形成了千奇百怪的源码,分析起来并不容易。不过好在企业的基本信息,在招聘页面就已经获得了。
剩下唯一需要的信息就是企业的所有招聘信息
了,也是非常重要的地方。
招聘信息在2种不同主页中,在源码中也分为了2种构建方式:
普通主页:正常的tag循环陈列
VIP 主页:在javascript中以list列表变量形式储存,并动态显示出来。
不过说回来,这也是不确定的解析,因为变化太多了,我只是随机打开了一些页面参考,不能代表全部。其实,最好的方法是在搜索页面直接按公司名称搜索,就得到他所有的招聘信息了。
那么下面开始进行2种源码的分析。
普通企业主页
<div class="part4 positionList" id="morecity">
<h3>
<span class="jobNameT">职位名称</span>
<span class="comNameT">公司名称</span>
<span class="jobPayT">职位月薪</span>
<span class="jobAddrT">工作地点</span>
<span class="publishTimeT">发布日期</span>
</h3>
<!--1个职位详情对应一个类名为positionListContent的div-->
<div class="positionListContent" id="positionlist_530">
<div class="positionListContent1">
<span class="jobName"><a href="http://jobs.zhaopin.com/552256928252361.htm" target="_blank">数据库工程师</a></span>
<span class="comName">民信阿里信息咨询(北京)有限公司</span>
<span class="jobPay">15001-20000元</span>
<span class="jobAddr">北京</span>
<span class="publishTime">2015-12-12</span>
<div class="clearFloat"></div>
</div>
<div class="cLeft">
<span>地点:北京</span>
<span>公司性质:民营</span>
<span>公司规模:1000-9999人</span>
<span>经验:3-5年</span>
<span>学历:本科</span>
<span>职位月薪:15001-20000元</span>
<p>
岗位职责:
1、公司核心数据库的管理,保证数据库正常运转和数据的安全;包括安装、配置、升级,数据备份、恢复,性能监控分析调优等;
2、参与开发设计,负责数据结构设计;
3、负责公司数据仓库的建设。 任职要求:
1、具有三年以上MySQL工作经验;
2、精通MySQL数据库的运行机制和体系架构;
3、精...
</p>
</div>
</div>
可以看到,大容器是class中含有positionList
的div。其中每条招聘信息都是class="positionListContent"
的div,职位链接其实非常好找,找到class="jobName"
的span标签获取其下a链接的href地址就好了。
VIP企业主页
实际上VIP企业主页也不全都是以下的构建方式,发现了一些少数的大公司,会完全不一样,通过代码来看,是真没什么办法的。。。
<SCRIPT language=JavaScript>
var arrJobList =
[
["高级前端工程师(js开发)","http://jobs.zhaopin.com/147164943250563.htm?ssidkey=y&ff=02&ss=101","北京","530","软件/互联网开发/系统集成","160000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250563000"],["php开发工程师(接受应届生)","http://jobs.zhaopin.com/147164943250562.htm?ssidkey=y&ff=02&ss=101","北京","530","软件/互联网开发/系统集成","160000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250562000"],["课程顾问(销售类,月薪6000-15000,提供意向资源,地点西二旗)","http://jobs.zhaopin.com/147164943250696.htm?ssidkey=y&ff=02&ss=101","北京","530","咨询/顾问/调研/数据分析","2140000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250696000"],["C++开发工程师(pc端,接受应届生)","http://jobs.zhaopin.com/147164943250785.htm?ssidkey=y&ff=02&ss=101","北京","530","软件/互联网开发/系统集成","160000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250785000"],["高级人事专员(偏企业文化方向)","http://jobs.zhaopin.com/147164943250700.htm?ssidkey=y&ff=02&ss=101","北京","530","人力资源","5002000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250700000"],["管理培训生(渠道区域经理方向)","http://jobs.zhaopin.com/147164943250452.htm?ssidkey=y&ff=02&ss=101","北京","530","销售管理","7001000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250452000"],["营销管理培训生(课程顾问方向)","http://jobs.zhaopin.com/147164943250084.htm?ssidkey=y&ff=02&ss=101","北京","530","销售业务","4010200","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250084000"],["咨询客服(欢迎优秀应届毕业生)","http://jobs.zhaopin.com/147164943250080.htm?ssidkey=y&ff=02&ss=101","北京","530","客服/售前/售后技术支持","4000000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250080000"],["班主任","http://jobs.zhaopin.com/147164943250128.htm?ssidkey=y&ff=02&ss=101","北京","530","教育/培训","2090000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250128000"],["数据库管理员","http://jobs.zhaopin.com/147164943250208.htm?ssidkey=y&ff=02&ss=101","北京","530","IT运维/技术支持","200500","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250208000"],["管理培训生(校区营销主任方向)","http://jobs.zhaopin.com/147164943250200.htm?ssidkey=y&ff=02&ss=101","北京","530","销售管理","7001000","北京简单科技有限公司","14716494","2015-12-12","0","CC147164943J90250200000"],["网站产品经理","http://jobs.zhaopin.com/147164943250679.htm?ssidkey=y&ff=02&ss=101","北京","530","互联网产品/运营管理","160200","北京简单科技有限公司","14716494","2015-12-11","0","CC147164943J90250679000"],
["空","空","空","空","空","空","空","空","空","空","空"]
];
var HotJobs = ",,";
var ShowDeptInfo = ",,";
var ShowJobInfo = ",,";
function BuildJlist(){
var SHTML,EHTML,JobHTML;
SHTML = "<table width=\"100%\" align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
EHTML = "</table>";
JobHTML = "<tr>";
var numJob = 0;
for (var i = 0; i <= arrJobList.length-2; i++){
if ( ((ShowJobInfo==",,")?true:(ShowJobInfo.search(arrJobList[i][10])>=0)) && ((ShowDeptInfo==",,")?true:(ShowDeptInfo.search(arrJobList[i][7])>=0)) ) {
JobHTML = JobHTML + "<td width=\"100%\"><table width=\"94%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"table-layout:fixed;border-collapse:collapse;\"><tr><td class=\"jobclass\" style=\"overflow:hidden;text-overflow:ellipsis;\" title=\""+""+" "+arrJobList[i][0]+" "+""+"\"><nobr>>> "+""+"<a href=\""+arrJobList[i][1]+"\" target=\"_blank\">"+arrJobList[i][0]+"</a> "+""+isvip(arrJobList[i][9])+ishot(arrJobList[i][10])+"<\/td><\/tr><\/table><\/td>";
numJob++;
if (numJob%1==0){
JobHTML = JobHTML + "<\/tr>";
}
}
}
if(numJob%1!=0){
JobHTML = JobHTML + "<\/tr>";
}
JobHTML = SHTML + JobHTML + EHTML;
document.getElementById("joblist").innerHTML = JobHTML;
}
</SCRIPT>
可以看到,该企业所有的招聘信息都存在Javascript脚本中的叫arrJobList
的变量里了。变量的格式为:arrJobList=[[第1条招聘信息],[第2条招聘信息]]
,是列表嵌套列表。而每条招聘信息数据的内容为:["职位名称","招聘网址","所在地点","城市代码","行业名称","行业代码","企业名称","企业代码","发布日期","0","未知编号"]
其实这个地方,难点就在于怎么在python中获取Javascript脚本中的变量……