一、网页分析

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",不能恢复,若再通过String-UTF-8〉ByteArray-GBK〉String,则会出现杂码,如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源代码地址

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

前程无忧爬虫源码及分析(一)相关推荐

  1. 智联招聘爬虫源码分析(一)

    最近一直在关注秋招,虽然还没轮到我,不过提前准备总是好的.近期听闻今年秋招形势严峻,为了更好的准备将来的实习.工作,我决定在招聘网站上爬取一些与数据有关的岗位信息,借以给自己将来的职业道路选择提供参考 ...

  2. Java爬虫饿了么商铺证书_美团、饿了么、百度外卖三大外卖平台的店铺、菜品数据爬虫源码...

    美团.饿了么.百度外卖三大外卖平台的店铺.菜品数据爬虫源码 百度外卖: 1.TakeAwayService.java 根据起始的gps坐标(百度加密后的),进行地图的轮询,用redis进行了一个深度的 ...

  3. 唯美少女网页爬虫源码

    唯美少女网页爬虫源码 # -*- coding: utf-8 -*- """ @author: tanderick """ import r ...

  4. 2023必须收藏的16个Python接单平台,做私活爽歪歪!附100个爬虫源码,拿去吧你

    一.python爬虫做副业 主要是爬取网站.小程序或者APP的数据,对数据进行分析与处理,或者直接向客户提供爬虫程序与技术支持. 当初学会Python那会儿,有朋友来介绍我去接私活,是为一家公司做网站 ...

  5. 分享16个Python接单平台,做私活爽歪歪!(附100个爬虫源码)

    一.python爬虫是可以做副业的,主要是爬取网站.小程序或者APP的数据,对数据进行分析与处理,或者直接向客户提供爬虫程序与技术支持. 当初学会Python那会儿,有朋友来介绍我去接私活,是为一家公 ...

  6. 爬虫系列之新浪微博爬虫源码weibospider_v2

    1 爬取某个话题的所有的评论 2 爬取某个博主的所有微博的评论 3 爬取某个博主的所有粉丝的用户信息,位置信息 以"迪丽热巴的微博"为案例,爬取热巴的所有微博,所有微博评论,所有粉 ...

  7. 城市生活知识图谱 ①百度贴吧爬虫源码,长沙吧,长沙美食吧

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.数据格式 二.网站分析 三.源码 总结 前言 本文发布时间为2022年1月7日,超过一定日期,代码可能无法运行. ...

  8. python爬虫源码怎么使用_Python爬虫具体应该怎么使用?

    1.首先,什么时候我们需要爬虫呢? 当我们需要某网站上的海量数据的时候,会发现,如果人工去把几百页,每页几十条到几百条的数据一条一条地复制下来,就太费时费力了,甚至根本就不可能.但是你做研究却需要这样 ...

  9. python爬虫源码附注解_Python小白写的三个入门级的爬虫(附代码和注释)

    Python小白写的三个入门级的爬虫(附注释) 写在前面的话:作者目前正在学习Python,还是一名小白,所以注释可以会有些不准确的地方,望谅解. 这三个小爬虫不是很难,而且用处可能也不大,主要还是锻 ...

最新文章

  1. android button 添加事件_2019最新Android常用开源库总结
  2. fiddler设置抓取https请求后打开网页总是报“你的连接不是私密链接”的解决办法
  3. 3种常用的防盗链的方式
  4. MFC 字符串截取成数组 wcstok
  5. sysbench压力工具报错:
  6. JavaScript、Ajax、jQuery全部知识点,5分钟速懂!
  7. # 20165208 2017-2018-2 《Java程序设计》第三周错题总结
  8. 一次数据库优化的对话
  9. Exponentially Weighted Averages
  10. 51单片机十字交通灯程序设计
  11. 普中科技51单片机——keil的介绍和PZ-ISP无法烧录问题
  12. java完全自学手册pdf,高级Java开发必看
  13. Spring Tool Suite 4(STS)的下载安装
  14. 这款完全开源可自主DIY的小程序商城太强大了,直接可给客户搭建赚米
  15. msp430中如何连续对位进行取反_【万泉河】论PLC编程中的高内聚与低耦合
  16. 天下武功唯快不破--速度要快
  17. 计算机默认桌面位置,怎么更改电脑桌面存储位置?
  18. 数据可视化 饼图_饼图之外的生活:合适工作的合适可视化效果
  19. 二十一世纪大学英语读写教程(第三册)学习笔记(原文)——4 - College Pressures(大学生的压力)
  20. [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)

热门文章

  1. ubuntu下安装npm
  2. React Create-React-App DVA 的后台管理UI
  3. mybatis中xml之trim属性
  4. 生产制造|产品繁多,物料明细不清晰,仓库究竟怎么管?
  5. 如何将.asd恢复为Word文档
  6. 2021年终总结:凛冬散尽,愿星河长明
  7. ios10越狱后无法通过ssh连接的问题
  8. kindeditor4.1.11版自定义插入网络视频代码(支持哔哩、优酷、爱奇艺、土豆、腾讯视频、56等视频网站)
  9. bzoj1415 [Noi2005]聪聪和可可【概率dp 数学期望】
  10. 使用Android-PickerView实现地址选择器时间选择器