Python爬虫小例子——爬取51job发布的工作职位


Posted in Python onJuly 10, 2020

概述

不知从何时起,Python和爬虫就如初恋一般,情不知所起,一往而深,相信很多朋友学习Python,都是从爬虫开始,其实究其原因,不外两方面:其一Python对爬虫的支持度比较好,类库众多。其二Pyhton的语法简单,入门容易。所以两者形影相随,不离不弃,本文主要以一个简单的小例子,简述Python在爬虫方面的简单应用,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

本例主要爬取51job发布的工作职位,用到的知识点如下:

  • 开发环境及工具:主要用到Python3.7 ,IDE为PyCharm
  • requests类库:本类库封装了python的内置模块,主要用于网络的请求和获取数据,可以支持不同形式的请求。
  • BeautifulSoup库:主要用于解析获取的数据,包括Html,Xml,Json等不同的格式。
  • 数据持久化:主要是将内存中的数据,保存到数据库或者文件中。

爬虫的基本步骤

爬虫的基本步骤,如下图所示:

Python爬虫小例子——爬取51job发布的工作职位

爬取目标

如有要爬取相关内容,首先要对爬取的目标进行分析,了解其目录结构,才能进行解析。本例主要爬取51job中的工作列表,如下所示:

Python爬虫小例子——爬取51job发布的工作职位

核心源码

1.获取数据

定义一个函数get_data,用于发起请求并获取数据,如下所示:

headers中的User-Agent主要用于模拟浏览器,不然会被反爬虫程序屏蔽,http状态码为418,意思是被网站的反爬程序返回的。

encoding是要爬取的网站的编码为gbk,如果不加,会产生乱码,默认为utf-8

def get_data(req_url):
  """获取数据"""
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Accept-Language': 'zh-Hans-CN, zh-Hans;q=0.5'
  }
  resp = requests.get(req_url, headers=headers)
  resp.encoding = 'gbk' # 不加会产生中文乱码
  if resp.status_code == 200:
    return resp.text
  else:
    return None

2.解析数据

定义一个函数parse_data,用于解析获取到的内容,如下所示:

采用BeautifulSoup,将返回的文本,解析成html对象,并获取对应的内容。本例主要获取工作的列表

def parse_data(resp_html):
  """解析数据,并返回列表"""
  soup = BeautifulSoup(resp_html, features='html.parser')
  job_table = soup.find('div', attrs={'class': 'dw_table'})
  # print(job_table)
  job_list = job_table.find_all('div', attrs={'class': 'el'})
  # print(job_list)
  # 循环列表,去掉第一个title和最后一个
  res_list = []
  for job in job_list[1: -1]:
    job_name = job.find('p', attrs={'class': "t1"}).find('span').find('a').get_text()
    job_name = job_name.replace('\r\n', '').strip()
    job_company = job.find('span', attrs={'class': "t2"}).find('a').get_text()
    job_addr = job.find('span', attrs={'class': "t3"}).get_text()
    job_salary = job.find('span', attrs={'class': "t4"}).get_text()
    job_time = job.find('span', attrs={'class': "t5"}).get_text()
    # print('工作信息:', job_name, '---', job_company, '---', job_addr, '---', job_salary, '---', job_time)
    res_item = {
      '工作名称': job_name,
      '公司': job_company,
      '工作地址': job_addr,
      '薪资水平': job_salary,
      '发布时间': job_time
    }
    res_list.append(res_item)
  return res_list

3.保存数据

定义一个函数save_data,用于将获取到的内容保存到json文件中,如下所示:

with函数 可以自动进行释放。因包含中文,所以json文件的编码为utf-8,否则会出现乱码

def save_data(res_list):
   """保存数据"""
   with open('jobs.json', 'w', encoding='utf-8') as f:
     res_list_json = json.dumps(res_list, ensure_ascii=False)
     f.write(res_list_json)

4.整体调用步骤

依次调用定义的三个函数,如下所示:

if __name__ == '__main__':
  """如果是主程序自己调用"""
  req_url = 'https://search.51job.com/list/040000,000000,0000,00,9,99,java,2,1.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='
  # 获取数据
  resp_html = get_data(req_url)
  # print(html)
  # 解析数据
  res_list = parse_data(resp_html)
  # 保存数据
  save_data(res_list)

爬取结果展示

爬取的结果保存在jobs.json文件中,如下所示:

[
 {
  "工作名称": "Java架构师",
  "公司": "深圳市钻木信息技术有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1.8-3万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java实习生 6k起",
  "公司": "深圳市智玩创新科技有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "6-8千/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java实习生6k起",
  "公司": "深圳市康姆达科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "6-8千/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市网新新思软件有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1.5-1.7万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市睿服科技有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1.3-1.7万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发经理",
  "公司": "深圳市聚惠企业登记代理有限公司",
  "工作地址": "深圳-龙华新区",
  "薪资水平": "1-3万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "高级JAVA",
  "公司": "深圳易加油信息科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1.5-2.1万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "深圳市绿联科技有限公司",
  "工作地址": "深圳-龙华新区",
  "薪资水平": "2-3万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市博悦科创科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "易普森智慧健康科技(深圳)有限公...",
  "工作地址": "深圳",
  "薪资水平": "1.5-2.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳易世通达科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1.2-1.8万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "苏州今融加科技有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1.5-2万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java后端开发工程师",
  "公司": "深圳市长隆科技有限公司",
  "工作地址": "深圳-龙岗区",
  "薪资水平": "1.5-2万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市元诺智能系统有限公司",
  "工作地址": "深圳-龙华新区",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "java 有物流类经验",
  "公司": "深圳市欧恩德技术有限公司",
  "工作地址": "深圳-罗湖区",
  "薪资水平": "0.8-1.1万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师-2020校园招聘",
  "公司": "金蝶软件(中国)有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "0.8-1.6万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "丰疆智能科技股份有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "2.5-3万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA软件开发工程师",
  "公司": "深圳市吉星时代科技有限公司",
  "工作地址": "深圳-龙岗区",
  "薪资水平": "2-3万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA 高级软件工程师",
  "公司": "相通网络技术有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1.5-3万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA开发工程师(接受应届生)",
  "公司": "深圳市智岩科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "0.8-1万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java后台开发工程师",
  "公司": "深圳市炬驰科技发展有限公司",
  "工作地址": "深圳",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市韶音科技有限公司",
  "工作地址": "深圳-宝安区",
  "薪资水平": "0.8-1万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA 开发工程师",
  "公司": "深圳市优博讯科技股份有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市有豆科技有限公司",
  "工作地址": "深圳-宝安区",
  "薪资水平": "1.8-3万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Saas平台架构师(Java方向)",
  "公司": "深圳市智布互联纺织科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1.7-2.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发实习生",
  "公司": "云软科技",
  "工作地址": "深圳-宝安区",
  "薪资水平": "6-9千/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "深圳市阿尔法智汇科技有限公司",
  "工作地址": "深圳-宝安区",
  "薪资水平": "2-4万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java 全栈开发工程师",
  "公司": "深圳市杰纳斯科技有限公司",
  "工作地址": "深圳-宝安区",
  "薪资水平": "1-3.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "中高级java工程师",
  "公司": "北京联创智融信息技术有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1.3-1.8万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "得实信息科技(深圳)有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "0.6-1万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市联创科技集团有限公司",
  "工作地址": "深圳-龙岗区",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "中级JAVA(J13824)",
  "公司": "银雁科技服务集团股份有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "java工程师",
  "公司": "深圳市安思疆科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "0.8-1.6万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA 高级开发工程师",
  "公司": "汇才保险代理(深圳)有限公司",
  "工作地址": "深圳-罗湖区",
  "薪资水平": "1.5-2万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师(直连)",
  "公司": "深圳市天泰国际航空旅行社有限公司...",
  "工作地址": "深圳",
  "薪资水平": "2-4万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA工程师",
  "公司": "深圳市开度贸易有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "0.8-1.2万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "后台开发Leader(JAVA方向)",
  "公司": "深圳金世纪保险经纪有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "3-4万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市中深力人力资源管理有限公司...",
  "工作地址": "深圳-南山区",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "研祥高科技控股集团有限公司",
  "工作地址": "深圳-光明新区",
  "薪资水平": "0.9-1.8万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java(证券不加班)",
  "公司": "上海华腾软件系统有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1.8-2.2万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "深圳大美商业地产管理有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "1.5-2万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "资深/高级Java工程师",
  "公司": "未来穿戴(深圳)有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "3-4万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "深圳市太阳星通信科技有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "0.8-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java高级开发工程师",
  "公司": "深圳市蓝鹰立德软件咨询有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1.5-1.8万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA(高级、架构)",
  "公司": "深圳市几米物联有限公司",
  "工作地址": "深圳-宝安区",
  "薪资水平": "2.2-3.2万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "JAVA开发工程师",
  "公司": "江苏康尚生物医疗科技有限公司",
  "工作地址": "深圳-宝安区",
  "薪资水平": "1-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "java架构师",
  "公司": "深圳市泓齐网络科技有限公司",
  "工作地址": "深圳",
  "薪资水平": "1.5-1.8万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "深圳市智?科技有限公司",
  "工作地址": "深圳-福田区",
  "薪资水平": "0.9-1.5万/月",
  "发布时间": "06-13"
 },
 {
  "工作名称": "Java开发工程师",
  "公司": "上海舟恩信息技术有限公司",
  "工作地址": "深圳-南山区",
  "薪资水平": "1.4-1.9万/月",
  "发布时间": "06-13"
 }
]

进一步思考

本例可以进一步优化的空间,如下所示:

  • 本次爬虫只是单次爬取,数据量相对小,如果要爬取大量数据的时候,则需要使用多线程相关的知识。
  • 基础的爬虫,只能爬取静态渲染的内容,如果是异步动态渲染的数据,如何爬取呢?
  • 将爬取的结果保存到数据库如何操作呢?

以上就是Python爬虫小例子——爬取51job发布的工作职位的详细内容,更多关于Python爬虫爬取工作职位的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python单链表实现代码实例
Nov 21 Python
Python操作SQLite简明教程
Jul 10 Python
Python实现从百度API获取天气的方法
Mar 11 Python
Django的session中对于用户验证的支持
Jul 23 Python
python通过opencv实现批量剪切图片
Nov 13 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
django小技巧之html模板中调用对象属性或对象的方法
Nov 30 Python
Python实现的ftp服务器功能详解【附源码下载】
Jun 26 Python
Python:二维列表下标互换方式(矩阵转置)
Dec 02 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 28 Python
Python 如何对文件目录操作
Jul 10 #Python
Python下划线5种含义代码实例解析
Jul 10 #Python
Python 没有main函数的原因
Jul 10 #Python
如何教少儿学习Python编程
Jul 10 #Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 #Python
django form和field具体方法和属性说明
Jul 09 #Python
浅谈Python里面None True False之间的区别
Jul 09 #Python
You might like
php中使用array_filter()函数过滤空数组的实现代码
2014/08/19 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
js中判断对象是否为空的三种实现方法
2013/12/23 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
谈谈node.js中的模块系统
2020/09/01 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
学Python 3的理由和必要性
2019/11/19 Python
Python time库基本使用方法分析
2019/12/13 Python
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
一道SQL面试题
2012/12/31 面试题
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
大学生考试作弊检讨书
2014/09/21 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
2014年招生工作总结
2014/11/26 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书