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

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

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

 

一、原理

    通过Python的requests库,向网站服务器发送请求,服务器返回相关网页的源码,再通过正则表达式等方式在网页源码中提取出我们想要的信息。

 

二、网页分析

    2.1岗位详情url

        在智联招聘网站中搜索'大数据',跳转到大数据岗位页面,接下来我们点开开发者选项,刷新页面,在Network面板的XHR中发现了这样一个数据包:

XHR: XHR为向服务器发送请求和解析服务器响应提供了流畅的接口,能够以异步方式从服务器取得更多信息,意味着用户单击后,可以不必刷新页面也能取得新数据

        在新的页面打开后:

        这个页面里出现的所有的岗位信息都在里面了:岗位名称、公司名称、薪水、地区、详情界面的url都在该json里。但是这些信息都不是最重要的,我需要岗位要求以及岗位职责的要求。

        将该json解析,得到如下结构的json数据:

        code的值为HTTP的响应码,200表示请求成功。而results数组则是该页面岗位信息的数据。点开第一条数据(results的第一个元素):

        页面中出现的所有数据,以及相关的超链接都在这儿。其中,我们需要的是指向岗位详情界面的超链接——'positionURL'。点击该链接,进去该岗位信息详情页面:

        好了,我们需要的信息出现了,不过为了简化页面分析的操作,以及尽可能地不被反爬,我决定选择移动适配的页面。

        再打开开发者选项,在该岗位详情页面,刷新:

        在<meta>中找到'mobile-agent',提取后面的url——'url=//m.zhaopin.com/jobs/CZ745244850J00020982209/',打开:

        真清爽!

    2.2 Xpath定位

        XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言

    分析该网页的源代码,寻找我们所需信息的位置:

    岗位名称、月薪、公司、地区、学历、年限信息都在'//*[@id="r_content"]/div[1]/div/div[1]/div[1]/'下。

  1. title = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[1]/h1/text()')  
  2. pay = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[1]/div[1]/text()')  
  3. place = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[3]/div[1]/span[1]/text()')  
  4. campanyName = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[2]/text()')  
  5. edu = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[3]/div[1]/span[3]/text()')  

 

岗位要求与岗位职责在同一个<div>标签里:

    也爬出来:

  1. comment = selector.xpath('//*[@id="r_content"]/div[1]/div/article/div/p/text()')  

好了,最复杂的部分搞定。

 

三、JSON数据包地址

    我们将前三页的数据包地址比对一下就能看出问题:

  1. https://fe-api.zhaopin.com/c/i/sou?pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E5%A4%A7%E6%95%B0%E6%8D%AE&kt=3&_v=0.14571817&x-zp-page-request-id=ce8cbb93b9ad4372b4a9e3330358fe7c-1541763191318-555474  
  2. https://fe-api.zhaopin.com/c/i/sou?start=60&pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E5%A4%A7%E6%95%B0%E6%8D%AE&kt=3&_v=0.14571817&x-zp-page-request-id=ce8cbb93b9ad4372b4a9e3330358fe7c-1541763191318-555474  
  3. https://fe-api.zhaopin.com/c/i/sou?start=120&pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E5%A4%A7%E6%95%B0%E6%8D%AE&kt=3&_v=0.14571817&x-zp-page-request-id=ce8cbb93b9ad4372b4a9e3330358fe7c-1541763191318-555474  
  4. https://fe-api.zhaopin.com/c/i/sou?start=180&pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E5%A4%A7%E6%95%B0%E6%8D%AE&kt=3&_v=0.14571817&x-zp-page-request-id=ce8cbb93b9ad4372b4a9e3330358fe7c-1541763191318-555474  

1.我们可以看出第一页的url结构与后面的url结构有明显的不同。

2.非首页的url有明显的规律性。

3.'kw=*&kt'里的字符为'大数据'的UTF-8编码。

 

所以我们对数据包有如下的操作:

  1. if __name__ == '__main__':  
  2.     key = '大数据'  
  3.     
  4.     url = 'https://fe-api.zhaopin.com/c/i/sou?pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=' + key + '&kt=3&lastUrlQuery=%7B%22pageSize%22:%2260%22,%22jl%22:%22489%22,%22kw%22:%22%E5%A4%A7%E6%95%B0%E6%8D%AE%22,%22kt%22:%223%22%7D'  
  5.     infoUrl(url)  
  6.     
  7.     urls = ['https://fe-api.zhaopin.com/c/i/sou?start={}&pageSize=60&cityId=489&kw='.format(i*60)+key+'&kt=3&lastUrlQuery=%7B%22p%22:{},%22pageSize%22:%2260%22,%22jl%22:%22489%22,%22kw%22:%22java%22,%22kt%22:%223%22%7D'.format(i) for i in range(1,50)]  
  8.     for url in urls:  
  9.         infoUrl(url)  

 

四、源码结构

    1、截取整个结果界面的JSON数据包,从中提取出各个招聘栏的url。

    2、进入招聘详细信息页面,提取移动端url。

    3、进入移动端界面,抓取需要的信息。

 

五、源码

  1. ''''' 
  2.     智联招聘——爬虫源码————2018.11 
  3. '''  
  4. import requests  
  5. import re  
  6. import time  
  7. from lxml import etree  
  8. import csv  
  9. import random  
  10.     
  11. fp = open('智联招聘.csv','wt',newline='',encoding='UTF-8')  
  12. writer = csv.writer(fp)  
  13. '''''地区,公司名,学历,岗位描述,薪资,福利,发布时间,工作经验,链接'''  
  14. writer.writerow(('职位','公司','地区','学历','岗位','薪资','福利','工作经验','链接'))  
  15.     
  16. def info(url):  
  17.     res = requests.get(url)  
  18.     u = re.findall('<meta name="mobile-agent" content="format=html5; url=(.*?)" />', res.text)  
  19.     
  20.     if len(u) > 0:  
  21.         u = u[-1]  
  22.     else:  
  23.         return  
  24.     
  25.     u = 'http:' + u  
  26.     
  27.     headers ={  
  28.         'User-Agent''Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'  
  29.     }  
  30.     
  31.     res = requests.get(u,headers=headers)  
  32.     selector = etree.HTML(res.text)  
  33.     
  34.     # # 岗位名称  
  35.     title = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[1]/h1/text()')  
  36.     # # 岗位薪资  
  37.     pay = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[1]/div[1]/text()')  
  38.     # # 工作地点  
  39.     place = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[3]/div[1]/span[1]/text()')  
  40.     # # 公司名称  
  41.     companyName = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[2]/text()')  
  42.     # # 学历  
  43.     edu = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[3]/div[1]/span[3]/text()')  
  44.     # # 福利  
  45.     walfare = selector.xpath('//*[@id="r_content"]/div[1]/div/div[3]/span/text()')  
  46.     # # 工作经验  
  47.     siteUrl = res.url  
  48.     workEx = selector.xpath('//*[@id="r_content"]/div[1]/div/div[1]/div[3]/div[1]/span[2]/text()')  
  49.     # # 岗位详细  
  50.     comment = selector.xpath('//*[@id="r_content"]/div[1]/div/article/div/p/text()')  
  51.     writer.writerow((title, companyName, place, edu, comment, pay, walfare, workEx, siteUrl))  
  52.     print(title, companyName, place, edu, comment, pay, walfare, workEx, siteUrl)  
  53.     
  54. def infoUrl(url):  
  55.     res = requests.get(url)  
  56.     selector = res.json()  
  57.     code = selector['code']  
  58.     if code == 200:  
  59.         data = selector['data']['results']  
  60.         for i in data:  
  61.             href = i['positionURL']  
  62.             info(href)  
  63.             time.sleep(random.randrange(1,4))  
  64.     
  65. if __name__ == '__main__':  
  66.     key = '大数据'  
  67.     
  68.     url = 'https://fe-api.zhaopin.com/c/i/sou?pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=' + key + '&kt=3&lastUrlQuery=%7B%22pageSize%22:%2260%22,%22jl%22:%22489%22,%22kw%22:%22%E5%A4%A7%E6%95%B0%E6%8D%AE%22,%22kt%22:%223%22%7D'  
  69.     infoUrl(url)  
  70.     
  71.     urls = ['https://fe-api.zhaopin.com/c/i/sou?start={}&pageSize=60&cityId=489&kw='.format(i*60)+key+'&kt=3&lastUrlQuery=%7B%22p%22:{},%22pageSize%22:%2260%22,%22jl%22:%22489%22,%22kw%22:%22java%22,%22kt%22:%223%22%7D'.format(i) for i in range(1,50)]  
  72.     for url in urls:  
  73.         infoUrl(url)  

 

Ps.因为某些原因,我打算每个月爬取智联招聘、51job的岗位信息一次,源码、优化都会以博客的形式写出来,欢迎关注~

 

源码地址:智联招聘_爬虫源码

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
4天前
|
数据采集 存储 数据库
简单描述一下爬虫的工作原理。
```markdown 爬虫工作原理:发送HTTP请求至目标网站,接收响应并解析网页内容,提取所需信息,存储数据。此过程循环进行,处理限制与复杂情况,遵循法规。📚🤖 ```
21 8
|
4天前
|
数据采集 开发者
如何编写有效的爬虫代码来避免网站的反爬虫机制?
如何编写有效的爬虫代码来避免网站的反爬虫机制?
25 1
|
数据采集 存储 搜索推荐
搜索引擎爬虫的工作原理是什么?底层原理是什么?
搜索引擎爬虫的工作原理是什么?底层原理是什么?
286 0
|
数据采集 JSON 前端开发
爬虫基本原理
爬虫的基本原理
|
数据采集 存储 监控
|
数据采集 Web App开发
|
数据采集 JSON 监控
爬虫的简介
这无数个“网络爬虫”会在较短的时间内大量地访问 12306 网站以获得车票信息,当发现有票时,便会在极短的时间内订购车票。举个形象点的例子,这无数个“网络爬虫”便是你的分身,这些分身不知疲倦地访问 12306 网站以获得车票信息,当发现有票时,便会帮你订购车票。由上述描述我们得知,爬虫是一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。
150 0
|
数据采集 JavaScript 前端开发
Python爬虫:爬虫基本原理
Python爬虫:爬虫基本原理
133 0
|
数据采集 XML JSON
图解爬虫,用几个最简单的例子带你入门Python爬虫
爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python。之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序。本篇博客将以Python语言,用几个非常简单的例子带大家入门Python爬虫。
232 0
|
数据采集 Python
python编程-29:Scrapy爬虫基本使用
python编程-29:Scrapy爬虫基本使用
117 0
python编程-29:Scrapy爬虫基本使用