开发者社区> gorapids> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

前程无忧爬虫源码及分析(一)

简介: 一、网页分析     1.1 关键字页面(url入口)         首先在前程无忧网站上检索关键词"大数据":         跳转到如下url: https://search.51job.com/list/000000,000000,0000,00,9,99,%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE,2,1.
+关注继续查看

一、网页分析

    1.1 关键字页面(url入口)

        首先在前程无忧网站上检索关键词"大数据":

        跳转到如下url: https://search.51job.com/list/000000,000000,0000,00,9,99,%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=

        在这个url中,'%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE'很明显为某种编码格式,我们知道'大数据'的UTF-8为'E5A4A7 E695B0 E68DAE',加上'%'变为16进制编码,即'%E5%A4%A7%E6%95%B0%E6%8D%AE',这'25'又是什么鬼?百度得到到关键词'二次编码',%25的url编码即为符号'%',所以'%25E5'即为'%E5'。不过我好奇的是,既然'%'已经是URI中的特殊转义字符,为啥还要多此一举地进行二次编码呢。再查,发现'%'在URI中可能会引起程序解析的歧义,百分号本身就用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码

        做一个实验,我们将该url截取下来,用'销售'中文的utf-8编码代替其中的编码,看看发生了什么。

        再回过头去看在网站入口搜索框进去的'大数据'页面:

        这是二次编码过的,再在url里改成中文名:

        好吧,二次编码与否并不影响效果。

        接下来来比较不同页数URL之间的联系。提取'大数据'关键词前三页url:

        将前两页进行对比:

        只有一个符号不同,再比较二、三页:

        也是一个数字的差异,改数字即为页码。所以对于页数url我们可以得出如下结论:

'https://search.51job.com/list/000000,000000,0000,00,9,99,关键词 ,2,页数.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='

        因此入口url模块代码如下:

  1. if __name__ == '__main__':  
  2.     key = '销售'  
  3.     urls = ['https://search.51job.com/list/000000,000000,0000,00,9,99,'+ key + ',2,{}.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='.format(i) for i in range(1,50)]  
  4.     for url in urls:  
  5.         getUrl(url)  

 

    1.2 岗位详情url

        由于我们需要的是岗位详情页面的信息,所以我们要找出页面所有岗位的url。

        打开开发者工具,找到岗位名称所在标签,在属性里发现了该页面的url:

        又发现每一条招聘信息都在<div class="el">…</div>里:

所以通过如下xpath将url提取出来:

  1. //*[@id="resultList"]/div/p/span/a/@href  

 

    1.3 岗位信息提取

        进入某一岗位具体信息url,打开开发者选项,在信息所在标签上右击,提取所需信息的xpath。

  1. title = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/h1/text()')  
  2. salary = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/strong/text()')  
  3. company = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[1]/a[1]/text()')  
  4. place = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[1]')  
  5. exp = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[2]')  
  6. edu = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[3]')  
  7. num = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[4]')  
  8. time = selector.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[5]')  
  9. comment = selector.xpath('/html/body/div[3]/div[2]/div[3]/div[1]/div/p/text()')  
  10. url = res.url  

    跑一遍看看,

        咦,怎么岗位要求这么多null?点一个进去看看

        嗯,<div>标签下咋又出现了<div>,真是乱来(笑)。看来得换个法子了,把这个父<div>标签下的中文全部带走。这儿需要用到xpath的steing()函数。将上述方法改造,得到新的xpath:

  1. string(/html/body/div[3]/div[2]/div[3]/div[1]/div)  

    又能跑起来了,不过把该<div>里一些其他信息也带进来了,比如岗位分类等。

 

 

二、一些细节

    2.1 编码问题

        虽然没有系统的学过编码,但是在与不同网页、不同的操作系统打交道的过程中也略知一二了。与前些天爬过的智联招聘不同,前程无忧网页用的是GBK编码,所以需要注意编码格式。而且还有一个小问题:

        对,报错了,'\ufffd'无法被转码。从网上找来的解释称:

在通过GBK从字符串获取字节数组时,由于一个Unicode转换成两个byte,如果此时用ISO-8859-1或用UTF-8构造字符串就会出现两个问号。

若是通过ISO-8859-1构造可以再通过上面所说的错上加错恢复(即再通过从ISO-8859-1解析,用GBK构造);

若是通过UTF-8构造则会产生Unicode字符"\uFFFD",不能恢复,若再通过StringUTF-8ByteArrayGBKString,则会出现杂码,如a锟斤拷锟斤拷

        而在Unicode中,\uFFFD为占位符,当从某语言向Unicode转化时,如果在某语言中没有该字符,得到的将是Unicode的代码"\uffffd"。

        针对这种情况,在打开文件时可设置一个参数——errors:设置不同错误的处理方案,默认为 'strict',意为编码错误引起一个UnicodeError。所以我们需要为该参数换一个值:ignore,当遇到编码问题市直接无视。

  1. fp = open('51job.csv','wt',newline='',encoding='GBK',errors='ignore')  
  2. writer = csv.writer(fp)  
  3. '''''title,salary,company,place,exp,edu,num,time,comment,url'''  
  4. writer.writerow(('职位','薪水','公司','地区','经验','学历','数量','时间','要求','url'))  

 

    2.2 网页结构问题

        电脑端的结构太多了…数据抓取率也低,代码还得改改,还是移动适配又好看又好爬。

 

三、源代码

    因为在写这篇博客的时候,发现了一些之前没发现的问题,并且有了优化的想法,所以就不把代码贴过来了,就留github 吧,这些天再把这个项目改进一下。

    源代码地址:51job源代码地址

    相关:智联招聘源代码讲解

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
基于Python的爬虫演示示例-以电影网站为例
爬取的数据最终会存到MYSQL服务器的表中,可以写程序将数据展示出来。注意的时会对IP进行限制封号,200条为限,超过IP会被限制,可以换一个IP进行抓去。主要研究爬虫的基本使用规范和语法,相对较为简单,供大家学习参考
21 0
List集合源码分析
  ArrayList底层数据结构是一个数组,查询元素速度快,增删速度稍慢   (1)DEFAULT_CAPACITY: 表示数组的初始大小,默认10   (2)size: 表示当前数组的大小
14 0
Java容器 | 基于源码分析List集合体系
List集合体系应该是日常开发中最常用的API,而且通常是作为面试压轴问题(JVM、集合、并发),集合这块代码的整体设计也是融合很多编程思想,对于程序员来说具有很高的参考和借鉴价值。
12 0
所谓的php短视频源码,这是一个伪命题
所谓的php短视频源码,这是一个伪命题
981 0
C#HttpHelper爬虫类源码分享--苏飞版
C#HttpHelper实现了C#HttpWebRequest抓取时无视编码,无视证书,无视Cookie,并且实现的代理的功能,使用它您可以进行Get和Post请求,可以很方便 的设置Cookie,证书,代理,编码问题您不用管,因为类会自动为您识别网页的编码。
2149 0
智联招聘爬虫源码分析(一)
最近一直在关注秋招,虽然还没轮到我,不过提前准备总是好的。近期听闻今年秋招形势严峻,为了更好的准备将来的实习、工作,我决定在招聘网站上爬取一些与数据有关的岗位信息,借以给自己将来的职业道路选择提供参考。
1394 0
5.简单python爬虫——爬取新闻页
#python爬虫实例 爬取新闻 #爬取新浪新闻首页中所有的新闻,爬到本地(http://news.sina.com.cn/) #实现过程,先爬首页,通过正则表达式获取所有新闻链接,然后依次爬各新闻,并存储到本地 import urllib.
1554 0
【自然框架】之鼠标点功能现(一):单表的增删改查(即上次5月23日活动的一个主题)【Demo、源码下载】
简单的需求,点点鼠标就可以了,那么复杂的需求呢?还是要写代码,哈哈。 不要被我误导了哦,关于什么时候写代码的问题,请看这里:http://www.cnblogs.com/jyk/archive/2009/06/21/1507594.html    单表的增删改查         我有一个梦想,那就是不用敲代码,只需要点点鼠标,就可以实现客户的需求。
942 0
+关注
gorapids
大数据专业在读
13
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载