1.采集数据网站:51job前程无忧

为避免打广告嫌疑,自行前往官网查看

2.分析网站查询方式:

总体来说分为4种 ,如下图:

即按职位,分为全国和某省市;按公司名称,分为全国和某省市

3.先按全文(即职位)搜索,输入岗位,地点

最中确定链接为

"https://search.51job.com/list/"+地区编码+",000000,0000,00,9,99,"+"按全文输入的职位内容"

但是要注意的是,当我们在 全文中输入中文时,链接就有点不一样了

仔细观察,有经验的话,会觉得这是最常见的url编码加密,但是仔细看又有点不一样,我们将销售拿出来借助代码加密:

from urllib.parse import quote,unquoteprint(quote("销售"))

两者对比,发现除了进行url编码外,还稍微动了点手脚,每个%后面加了个25,我们直接replace就行了

print(quote("销售").replace("%","%25"))

现在两者参数一样了。

4.链接破解了,下面对网站数据进行分析:

F12检查元素和查看源码分析,数据都加载在页面中,直接提取就行了

请求第一页时顺便获取到总页数

type1,search_text,add = self.choose_type_add()if type1 == "1":encode_search_text = quote(str(search_text)).replace("%","%25")url = self.bash_url.replace("#","000000").replace("$",str(encode_search_text))#获取总页数url = url.replace("page_num","1")res = requests.get(url)res.encoding = "gbk"total_page = re.findall(r'<span class="td">共(\d+)页.*?</span>',res.text,re.S)print(total_page)

其他没什么问题,直接xpath定位即可

整体代码

# -*- coding: UTF-8 -*-
'''
@Author :Jason
51job数据采集
'''import requests
import csv
from lxml import etree
from urllib.parse import quote_plus,quote,unquote
import re
import random
from time import sleepclass get_51job(object):def __init__(self):#这个url前面是固定的+ 地区+ 写死 + 输入词 + 页数 +固定部分self.bash_url = "http://search.51job.com/list/"+"#"+",000000,0000,00,9,99,"+"$"+",2,"+"page_num"+".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="self.proxies = random.choice([{"HTTP": "http://我的代理"},])self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36'}def choose_type_add(self):type1 = input("搜全文输入1,搜公司输入2:")if type1 == "1":search_text = input("请输入想要查询的职位等信息:")add = input("请输入需要查询的地区:")else:search_text = input("请输入想要查询的公司信息:")add = input("请输入需要查询的地区:")return type1,search_text,adddef get_html(self):type1,search_text,add = self.choose_type_add()if type1 == "1":with open('51job职位详情表.csv', 'a', newline='') as f:f = csv.writer(f)f.writerow(('职位', '公司', '工作地点', '薪水', '发布日期', '职位链接', '公司链接'))encode_search_text = quote(str(search_text)).replace("%","%25")start_url = self.bash_url.replace("#","000000").replace("$",str(encode_search_text))#获取总页数url = start_url.replace("page_num","1")res = requests.get(url)res.encoding = "gbk"total_page = re.findall(r'<span class="td">共(\d+)页.*?</span>',res.text,re.S)# print(total_page)if total_page:for page_num in range(0,int(total_page[0])):res = requests.get(start_url.replace("page_num",str(page_num+1)))sleep(2)res.encoding = "gbk"parseHtml = etree.HTML(res.text)position_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/p/span[1]/a/@title')company_name_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[1]/a/@title')address_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[2]/text()')salary_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[3]')release_date_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[4]/text()')job_url_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/p/span[1]/a/@href')company_url_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[1]/a/@href')try:for i,p in enumerate(position_list):print(p)with open('51job职位详情表.csv', 'a', newline='') as f:f = csv.writer(f)f.writerow((position_list[i],company_name_list[i],address_list[i],salary_list[i].text,release_date_list[i],job_url_list[i],company_url_list[i]))except Exception as e:print(e)finally:passelse:print("没有相关职位!")else:#这个是搜公名字with open('51job公司职位详情表.csv', 'a', newline='') as f:f = csv.writer(f)f.writerow(('职位', '公司', '工作地点', '薪水', '发布日期', '职位链接', '公司链接'))encode_search_text = quote(str(search_text)).replace("%", "%25")start_url = self.bash_url.replace("#", "000000").replace("$", str(encode_search_text))# 获取总页数url = start_url.replace("page_num", "1")print(url)res = requests.get(url)res.encoding = "gbk"total_page = re.findall(r'<span class="td">共(\d+)页.*?</span>', res.text, re.S)print(total_page)if total_page:for page_num in range(0, int(total_page[0])):res = requests.get(start_url.replace("page_num", str(page_num+1)))sleep(2)res.encoding = "gbk"parseHtml = etree.HTML(res.text)position_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/p/span[1]/a/@title')company_name_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[1]/a/@title')address_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[2]/text()')salary_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[3]')release_date_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[4]/text()')job_url_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/p/span[1]/a/@href')company_url_list = parseHtml.xpath('//div[@class="dw_table"]//div[@class="el"]/span[1]/a/@href')try:print(position_list)for i, p in enumerate(position_list):with open('51job公司职位详情表.csv', 'a', newline='') as f:f = csv.writer(f)f.writerow((position_list[i], company_name_list[i], address_list[i],salary_list[i].text, release_date_list[i], job_url_list[i],company_url_list[i]))except Exception as e:print(e)finally:passelse:print("没有找到相关信息")if __name__ == "__main__":job51 = get_51job()job51.get_html()

唯一可能还需要做的就是做个地区的映射,暂时就不做了。需要的话可以自己去建个

此版本爬取日期为2019-12-23

声明: 采集仅源自个人兴趣爱好,数据集仅供个人使用,不涉及商用,侵权联系删除。

爬虫-招聘系列1----51Job相关推荐

  1. 爬虫-招聘系列2----boss某直聘

    1.采集数据网站:boss直聘 为避免打广告嫌疑,自行前往官网查看 2.网站分析 搜索条件较上一篇51要多一点,但是提交参数原理都是一样的 那么我们就下抓取职位为python,范围为全国的数据,其他也 ...

  2. Python爬虫 抓取大数据岗位招聘信息(51job为例)

    简单介绍一下爬虫原理.并给出 51job网站完整的爬虫方案. 爬虫基础知识 数据来源 网络爬虫的数据一般都来自服务器的响应结果,通常有html和json数据等,这两种数据也是网络爬虫的主要数据来源. ...

  3. Python爬虫,爬取51job上有关大数据的招聘信息

    Python爬虫,爬取51job上有关大数据的招聘信息 爬虫初学者,练手实战 最近在上数据收集课,分享一些代码. 分析所要爬取的网址 https://search.51job.com/list/000 ...

  4. Python Scrapy爬虫框架爬取51job职位信息并保存至数据库

    Python Scrapy爬虫框架爬取51job职位信息并保存至数据库 -------------------------------- 版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC ...

  5. Python2爬虫学习系列教程

    http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...

  6. Python爬虫学习系列教程

    大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫 ...

  7. Python爬虫学习系列教程-----------爬虫系列 你值的收藏

    静觅 » Python爬虫学习系列教程:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把 ...

  8. Python 爬虫学习 系列教程

    Python爬虫 --- 中高级爬虫学习路线 :https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时,可以把图片保存到本地在打开查看... Pyth ...

  9. scrapy爬虫学习系列七:scrapy常见问题解决方案

    scrapy爬虫学习系列七:scrapy常见问题解决方案 参考文章: (1)scrapy爬虫学习系列七:scrapy常见问题解决方案 (2)https://www.cnblogs.com/zhaoji ...

最新文章

  1. flash模拟EEROM
  2. 【cocos2d-js官方文档】九、cc.loader
  3. django中使用celery简单介绍
  4. Sms中关于操作系统的部署之上
  5. TCP/IP协议模型详解
  6. java model.put_深入理解Java内存模型(一)——基础
  7. 一阶系统单位阶跃响应的特点_一阶系统的阶跃响应有什么特点
  8. 【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
  9. .NET 实现自定义ContextUser的Identity和Principal实现自定义用户信息,权限验证。
  10. sphinx结合scws的mysql全文检索
  11. MySQL学习(一、概述和表的基本操作)
  12. Python 编写自动化工具
  13. 汇编语言属于计算机科学,汇编语言是一种依赖于计算机的低级程序设计语言吗...
  14. 用Visio画流程图
  15. 水溶性花青素连接剂1617497-19-4,diSulfo-Cyanine5 alkyne,二磺酸花青素Cy5炔基
  16. jsp层级选择器_jQuery 选择器
  17. 亚马逊SP-API申请 PII权限申请 ERP开发 开发人员注册
  18. 嵌入式Linux从入门到精通之第八节:GTK+详解
  19. (李嘉诚)教你投资理财
  20. 【Java面试】Linux

热门文章

  1. SpringCloud微服务Zuul网关动态路由
  2. 2022-2028年中国静脉留置针行业市场现状分析及未来前景规划报告
  3. Mysql的原理解析
  4. 温馨提示: 高考信号屏蔽到底是个什么鬼?
  5. 新概念英语 1234 外语教学与研究出版社 培生教育出版中国有限公司
  6. 森大厦和teamLab前所未见的数字艺术博物馆开门迎客
  7. 美术理科生能报计算机专业吗,理科艺术生有哪些专业 理科生能报的大学
  8. Redis五大基本类型三种特殊数据类型事务操作(悲观锁,乐观锁)
  9. php mysql表的增删改查,PHP 之Mysql增删改查操作案例
  10. 逆行时间的 精神。。。病