PythonPython应用集

58招聘数据爬取准备: 源码分析

2015-12-15  本文已影响1028人  Solomon_Xie

通过各种点击观察,发现58同城的URL构造挺特殊的。
根据互联网协议和规则,一般查询参数都直接在cgi后加参数,如cgi?key=abc&page=1这样的。
但是58喜欢赶潮,除了关键词key之外,一些重要的查询参数(职业、行业、页码等)都在URL的目录中构造,而不是作为参数。这个技术我不太懂-_-!,大概是服务器对URL进行分析再获取参数吧,这个不重要。
(注:我是用python开发,刚入门,目前正在用BeautifulSoup扩展,所以经常提到一些相关术语。另外,定位方法我建议采用CSS选择器,语法是通用的。)

招聘搜索页源码分析

下面是我将几乎全部搜索条件都加上的全链接:
*http://bj.58.com/haidian/tech/pve_5363_244_pve_5754_1476_pve_5356_6_pve_5357_6/?key=%E6%95%B0%E6%8D%AE&minxinzi=3000_4999&postdate=20151209_20151216&param6693=8&PGTID=0d303655-0047-792b-50b1-e40ba04c7e85&ClickID=1 *
好的,根据这个链接,以及各种尝试出来的判断,URL的结论如下:

页码:

页码超出搜索结果的总页码时,会显示省略号。
但是结果再多,也只能显示到70页,和智联招聘差不多(到90页)。

包含招聘结果的大框架

页面唯一重要的列表信息,都包括在了这个框架中:

<div id="infolist" class="tablist cleft" tongji_id="ZP_job_list_div_items">
    <dl logr="p_1_33416242837515_24319259084094_0_1_ses^composite^0" _pos="1" sortid="503338211" class="">一条招聘信息</dl>
</div>

框架定位关键是<div>id="infolist",而结果列表中每一条的定位关键为<dl>标签包含logr属性,且规律为logr="p_?_????_ses^composite??"

逐行结果的代码解析

每一条信息的源码如下(量比较大):

<dl logr='p_1_33416242837515_24319259084094_0_1_ses^composite^0' _pos="1"  sortid='503338211'>
    <dd class="w46">
        <i infoid='24319259084094'></i>
        <input type="hidden" uid='33416242837515_0_0' name="uid"/>
    </dd>
    <dt>
        <a href='http://bj.58.com/chaoshishangye/24319259084094x.shtml' urlparams='psid=164836665190074319829635832&entinfo=24319259084094_0'  target="_blank" class="t"  _t='common'>数据处理员</a>
        <span class="hoverinfobox" style="display: none;">
         <div id="arrow">
            <em></em>
            <span></span>
        </div>
        <div id="tipsbox" class="tipsbox">
            <div class="xboxcontent" class="tipsbox">
                <div class="titbar"><h2>山东正元数字城市建设有限公司麻城项目</h2></div>
                <ul class="zhanshi clearfix">
                    <li class="mar30">
                        <span>招聘职位:</span>全职招聘
                    </li>
                    <li>
                        <span>招聘人数:</span>若干                </li>
                    <li class="mar30"> 
                        <span>工作经验:</span>不限                </li>
                    <li>
                        <span>学历要求:</span>不限
                    </li>
                    <!-- 
                    <li class="mar30">
                        <span>工作地点:</span>北京
                     </li> -->
                     <li class="mar30">
                        <span>转正工资:</span>1000-2000元
                     </li>
                </ul>
                <p>
                    有积极的态度和人际关系,能吃苦耐劳,文化水平高中以上。
                </p>
            </div>
        </div>
    </span>
    <span tag="bbbindcpc" url='http://bj.58.com/chaoshishangye/24319259084094x.shtml' name="zaixian_33416242837515"></span>
    </dt>
    <dd class="w271">
        <a href='http://qy.58.com/33416242837515/' urlparams='psid=164836665190074319829635832&entinfo=24319259084094_0' target="_blank" class="fl" title="山东正元数字城市建设有限公司麻城项目">山东正元数字城市建设有限公司麻...</a>
    </dd>
    <dd class="w96">  北京   </dd>
    <dd class="w68">   12-13    </dd>
</dl>

其中,一条信息的确认方式有3中:

获取每条招聘信息的基本内容

  1. 企业ID:定位在<i infoid='24319259084094'></i>
<a href='http://bj.58.com/chaoshishangye/24319259084094x.shtml' urlparams='psid=164836665190074319829635832&entinfo=24319259084094_0'  target="_blank" class="t"  _t='common'>数据处理员</a>` 

需要注意的是,详情url尽量结合hrefurlparams参数一起构造,不过不放在一起也无所谓。

<dd class="w271"> <a href='http://qy.58.com/33416242837515/' urlparams='psid=164836665190074319829635832&entinfo=24319259084094_0' target="_blank" class="fl" title="xxxx有限公司xx项目">xxxx有限公司...</a></dd>`

判断是否为推广信息

如果一行信息内包括这条,那么就是推广信息:

<a class="tuiguang" title="58同城建议您优选选择精准推广" rel="nofollow" target="_blank" href="http://e.58.com/zhaopin/jingzhun.html#go">精准</a>

通过<a>标签的class="tuiguang"来定位。
如果是正常消息,则没有这个链接,且只显示文本的“今天”或者是“12-12”这种具体日期。

获取当前页码及下一页链接

这一步其实是非常重要的!直接关系到是否抓瞎。
首先,58的设置是这样的:
58最多只显示70页信息,每页45条。强行打开70页以上的页面,或者超过当前结果的总页数,都会显示新信息较少,我们为您推荐以下相关信息:
我们先来看源码,然后再处理。

<div class="pagerout">
    <div class="pager" tongji_id="ZP_job_list_div_next">
        <a class="prv" href="/job/pn7/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0"> 
            <span>上一页</span ></a> 
        <a href="/job/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>1</span></a>
        <a href="/job/pn2/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>2</span></a>
        <a href="/job/pn3/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>3</span></a>
                ...
        <a href="/job/pn4/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>4</span></a>
        <a href="/job/pn5/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>5</span></a>
        <a href="/job/pn6/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>6</span></a>
        <a href="/job/pn7/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>7</span></a>
            <strong><span>8</span></strong>
        <a href="/job/pn9/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>9</span></a>
        <a href="/job/pn10/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>10</span></a>
        <a href="/job/pn11/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>11</span></a>
        <a href="/job/pn12/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>12</span></a>
        <a class="next" href="/job/pn9/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0">
            <span>下一页</span></a>
        <a href="/job/?key=%E6%95%B0%E6%8D%AE&cmcskey=%E6%95%B0%E6%8D%AE&final=1&specialtype=gls&canclequery=isbiz%3D0" class="recently">
            <span>最新信息</span></a>
    </div>
</div>

从上面我们可以这样得到些信息:

  1. 上一页链接:div[class="pagerout"] a[class="prv"],获取其href属性值就好了。如果没有,表示正在第一页。

判断搜索结果是否读完

通过测试发现,根据结果数量的不同,除了正常外汇产生以下结果:

  1. 显示新信息较少,我们为您推荐以下相关信息:一般是因为超过了应有的页码了。这样的信息通过源码找到<dt class="shortMsg">新信息较少,我们为您推荐以下相关信息:</dt>就可以了。
  2. 显示很抱歉,没有找到符合已选条件的信息。\n建议您:,这是因为搜索条件太苛刻没有符合条件的。这样的,通过源码找到:
<i class="ico report"></i><p>很抱歉,没有找到符合已选条件的信息。<br />建议您:</p>

招聘详细页源码分析

这个页面比较简单,除了企业联系方式是动态加载的图片外都比较好定位抓取。不过联系方式也对我没什么太大用就不费那功夫了。

精简招聘信息

是被包含在头文件中用来给搜索引擎搜索用的,所以是精华中的精华哈哈。如下:

<meta name="description" content="[最新招聘信息]诚聘诚聘数据分析师5000+1人,工作地点位于北京海淀中关村,公司规模100-499人,薪资待遇5000-8000元,工作经验1-2年,学历要求大专,招聘岗位职责: 建立公司数据分析的系统,组织数据分析报表的整合和规范、优化; 建立公司数据管理、查询的各项规章制度; 建立公司每日、周、月、季、年度数据分析报表模板; 研究数据分析的方法,做到报表制作, 100)" />

只要通过<meta name="description"定位,获取其content属性值`就好了。

获取招聘基本信息

所有的信息都包含在了<div class="wb-main">...</div>框架中。能够找到的信息如下:

  1. 职位名称:
<div class="compMsg clearfix">
    <ul>
        <li>
            <span>行业:</span>
            <a href="http://qy.58.com/bj_264/" target="_blank" >广告/创意</a>
        </li>
        <li>
            <span>性质: </span>私营
        </li>
        <li class="scale">
            <span>规模: </span>100-499人
        </li>
        <li class="joinday" style="display: none;">
            <span>入驻时长:</span>174天
        </li>
    </ul>
</div>

写累了,直接上BeautifulSoup格式的css选择器的查找语法,分别为:
所在行业 =div[class*=compMsg] ul li a[href]找到,
企业性质 = div[class*=compMsg] ul li nth-of-type(2),
企业规模 = div[class*=compMsg] ul li nth-of-type(3)或者li[class="scale"],
入驻时间 = div[class*=compMsg] ul li nth-of-type(4)li[class="joinday"]

获取联系信息

都包含在这个div中:

<div class="contact mt25" id="lianxi" tongji_id="ZP_job_detail_div_contact">...</div>

然后可以找到这些信息:

  1. 联系人:<span class="conTip">王经理 <span>(联系我时请说明是在58同城上看到的)</span></span>,定位方法:div[class="conTip"]
<a class="map" href="javascript:setbg('诚聘数据分析师',430,240,'http://qy.58.com/mapdetail.html?lat=116.337795%2C39.977523&name=%E5%B7%A5%E4%BD%9C%E5%9C%B0%E7%82%B9');"><i></i>查看地图</a>

获取企业介绍

企业信息都包含在这里面:

<div class="compIntro" id="gongsi">...</div>

定位方式为:直接div[class="compIntro"]#gongsi获取所有文字内容就是企业介绍了。

企业主页源码分析

58还真是方便,再牛的企业都是一模一样的简单网页。不过还好,这也方便获取数据了。
这个页面极其简单,但是有一点需要注意,数据是用表格动态呈现的,每种信息的位置并不固定,是根据企业有没有这个信息才显示出来的。所以在信息定位上,尽量避免用序号,只能用中文匹配了。。需要获取的数据如下:

  1. 卫星定位:在头文件中,如<meta name="location" content="province=北京;city=北京; coord=116.404,39.915">。找到<meta name="location" />获取coord属性值就好了。

企业信用档案页面URL及源码分析

这个页面不知道入口在哪里?偶然看到的,然后心里大呼——哇塞!哈哈
虽然找不到入口或者查询页面,但是发现其实看懂URL就很简单了,必要格式如下:
http://credit.vip.58.com/usercredit?userId=企业ID
那么这时候刚才获取的企业ID就起作用了。手工输入了一下,ID对的话每家企业都能出来。
建立了档案的企业——会显示巨详细的信息!连法人代表、注册资本、详细地址全都有。
没建立档案的企业——也会显示页面,但信息处全都是空白。
下面就简单分析下基本信息的获取。

获取企业营业执照信息

表格基本上是固定位置的,因为大家营业执照都一样嘛哈哈~
首先获取信息框架:div[class="zzxx_ta"] table,然后再到这个框架里操作,就简单多了。
下面是信息定位分析:

  1. 公司名称:td[class="tdbg"] + td的第1项或span[class="headTitle"]

获取企业其他信息

  1. 企业简介:div[class="briefIntro"]
上一篇 下一篇

猜你喜欢

热点阅读