如何爬取招聘网站竞争分析并进行分析

抱歉, 您访问的页面不存在或已删除
秒之后将进入猎聘招聘首页...从拉勾网爬取招聘数据 分析深圳数据分析师的职业前景 - 为程序员服务
从拉勾网爬取招聘数据 分析深圳数据分析师的职业前景
通过对局部地区某一岗位的总体分析,找出该地区该职位的职业发展前景规律。本文基于拉勾上2016年12月到2017年1月深圳地区数据分析师招聘数据,为这一行业的朋友作为参考;虽然数据略为过时,但变化也不大,规律依然适用。
1、数据分析师主要还是开发类职业。开发类的职位,无论是市场需求还是薪资都是无可撼动的最高。
2、地区方面:如果你要在深圳找数据分析师的岗位,请去南山区,优先去科技园附近。
3、薪资方面,20K是业内中等水平;
4、学历方面,除非你直接攻读相关专业的博士,否则本科足矣;
5、技能方面:Hadoop和Spark这类大数据基础框架是市场最为重视的,因此Java是最为需要的语言。Python是首选的语言。
6、公司选择方面:数据表明大公司的需求和薪资都显著性强于小公司。
第一部分:Python拉勾爬虫
拉勾因其结构化的数据比较多因此过去常常被爬,所以在其多次改版之下变得难爬。不过只要清楚它的原理,依然比较好爬。其机制主要就是AJAX异步加载JSON数据,所以至少在搜索页面里翻页url不会变化,而且数据也不会出现在源代码里。
,用Chrome检查打开。在XHR中可以看到一个以postionAjax.json开头的脚本,打开Preview看一下,可以看到:
可以发现这些数据与前端的数据一致,此时我们已经找到了数据入口,就可以开始爬了。
在Headers里可以查看请求方式:
Request Header:
Request URL:
Request Method:POST
Status Code:200 OK
Remote Address:106.75.72.62:443
从Request Header中可以看到,是用POST提交表单方式查询的(所以如果你直接点开Request URL你会发现数据不对,因为没有提交表单数据)。
那么我们就可以在Python中构造请求头以及提交表单数据来访问:
import requests
import time
from sqlalchemy import create_engine
import pandas as pd
from random import choice
import json
import numpy
engine=create_engine(#这里填你自己数据库的参数#) # 连接数据库
dl = pd.read_sql("proxys",engine)
def get_proxy(dl):
n = choice(range(1, len(dl.index)))
proxy = {"http":"http://%s:%s" %(dl["ip"][n],dl["port"][n]),
"https": "http://%s:%s" % (dl["ip"][n], dl["port"][n])}
return(proxy)
def get_header():
headers = {
"User-Agent": ""Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1; SV1; AcooB .NET CLR 1.1.4322; .NET CLR 2.0.50727)"",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Content-Type": "application/x-www-form- charset=UTF-8",
"Referer": "/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88?px=default&city=%E6%B7%B1%E5%9C%B3&district=%E5%8D%97%E5%B1%B1%E5%8C%BA",
"X-Requested-With": "XMLHttpRequest",
"Host": "",
"Connection":"keep-alive",
"Cookie":"user_trace_token=21-0beba08bd330fd2c9c72; LGUID=22-a3b749ae-d2c1-11e5-8a48- tencentSig=; pgv_pvi=; index_location_city=%E5%85%A8%E5%9B%BD; SEARCH_ID=c684cbd7b62bf; JSESSIONID=8C779BD6B74AF3CE40CE5F2; TG-TRACK-CODE=index_ Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=,,,; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=; _ga=GA1.2..; LGRID=02-691cb0a5-e3ab-11e6-bdc0-ce",
"Origin": "",
"Upgrade-Insecure-Requests":"1",
"X-Anit-Forge-Code": "0",
"X-Anit-Forge-Token": "None",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,q=0.8"
return(headers)
def get_form(i):
data={"first":"false","pn":i,"kd":"数据分析师"}
return(data)
districts = ["南山区","福田区","宝安区","龙岗区","龙华新区","罗湖区","盐田区","大鹏新区"]
pagenos = [22,10,1,4,1,2,1,1]
url_lists = ["/jobs/positionAjax.json?px=default&city=深圳&district=%s&needAddtionalResult=false"%area for area in districts]
s = requests.Session()
s.keep_alive = False
s.adapters.DEFAULT_RETRIES = 10
def get_jobinfo(i,j): # i表区号,j表页数
if i &= 8 or j & pagenos[i]:
return("索引超标!")
resp=s.post(url_lists[i], data=get_form(j), headers=get_header())
resp.encoding="utf-8"
max_num = len(json.loads(resp.text)["content"]["positionResult"]["result"])
for k in range(max_num):
json_data=json.loads(resp.text)["content"]["positionResult"]["result"][k]
df = pd.DataFrame(dict(
approve=json_data["approve"],
businessZones=json_data["businessZones"],
companyId=json_data["companyId"],
companyLabelList=json_data["companyLabelList"],
companyShortName=json_data["companyShortName"],
companySize=json_data["companySize"],
createTime=json_data["createTime"],
education=json_data["education"],
financeStage=json_data["financeStage"],
firstType=json_data["firstType"],
industryField=json_data["industryField"],
jobNature=json_data["jobNature"],
positionAdvantage=json_data["positionAdvantage"],
positionId=json_data["positionId"],
positionName=json_data["positionName"],
salary=json_data["salary"],
secondType=json_data["secondType"],
workYear=json_data["workYear"],
scrapy_time=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))),index=[0])
df.to_sql(con = engine, name = "job_info", if_exists = 'append', flavor = "mysql",index=False)
print("第%d区,第%d页,第%d个出错了!"%(i,j,k))
以上这个函数就可以通过提交区和页数,返回当前页的职位数。
其实AJAX返回JSON数据的方式也有好处,数据都是规整的,不必花太多时间精力在数据清洗上。
至于职位详情的内容是写在源代码里的,这些用常规爬虫方法即可。
不过注意要加延时,拉勾的反爬虫措施还是比较严的,不加延时爬一小会儿就会被封IP。
第二部分:数据分析报告
各区职位数
从拉勾爬取的数据拉勾,在深圳,对数据分析师需求量最大的地区为南山区,其次为福田区。这个当地的互联网企业分布有很大的关系,众所周知,深圳的互联网企业集中在南山区和福田区;
各区域板块职位数
第一类别频数
第二类别频数
不同公司阶段招聘数量
全部职位平均薪资总体分布
不同类别职位薪资分布
不同阶段公司平均薪资
不同学历对薪资的影响
公司规模对薪资的影响
数据分析师的技术要求
高薪岗位top20
综合人气排名
在现今的市场认知中,
数据分析师主要还是开发类职业。开发类的职位,无论是市场需求还是薪资都是无可撼动的最高
。因此所以如果你不会编程,或者不想作一个程序员(比如我),那么应该重新思考一下职业规划。
你要在深圳找数据分析师的岗位,请去南山区,优先去科技园附近
如果你去找工作,HR问你期望薪资,你就说20K,因为这是业内的中等水平(这是考虑了最高薪资,不过考虑到大部分的最高薪资只是一个幌子,因此20K当然是虚高:))。30K基本就到了数据分析师的天花板,而这个天花板一般要5年以上的时间达到。
当然要找一个20K的工作也不是那么轻松。你首先要自己具备实力。对于学历,除非你直接攻读相关专业的博士,否则本科足矣,读个硕士作用并不大(尤其是国内的硕士),三年时间转化成工作经验价值更大。
至于技术方面,Hadoop和Spark这类大数据基础框架是市场最为重视的,因此Java是最为需要的语言
(这主要还是因为大部分的公司不知道数据工程师和数据分析师的区别,或者大部分的公司仍处于基础建设阶段,离数据挖掘、分析和应用还有不少距离)。
对于懂行的数据分析师来说,Python是首选的语言,毕竟全能;当然R也是越来越流行和被重视;SAS也不错,金融行业很需要。
无论是工程师还是分析师,
数据库和SQL始终是重要的基础技能。
当你足够牛的时候,就是你来挑选市场了。去大公司还是小公司?去大公司。数据表明大公司的需求和薪资都显著性强于小公司。在移动互联网收尾,人工智能兴起的大数据时代,没有数据、没有资金、没有技术的小公司实在难有作为。
当然拉勾的数据既不全面,也不一定都靠谱(事实上许多HR的招聘需求都是抄来抄去)。因此,以上所有结论一定有某种程度的偏差,仅供参考。
转载请注明来自36大数据():
关注大数据和大数据应用_大数据第一科技网
原文地址:, 感谢原作者分享。
您可能感兴趣的代码招聘兼职爬网站数据| - 实现网
浏览 398 次
已有11人投递Python爬虫框架Scrapy实战之批量抓取招聘信息
作者:HanTangSongMing
字体:[ ] 类型:转载 时间:
网络爬虫又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者,是按照一定的规则,自动抓取万维网信息的程序或者脚本。这篇文章主要介绍Python爬虫框架Scrapy实战之批量抓取招聘信息,有需要的朋友可以参考下
网络爬虫抓取特定网站网页的html数据,但是一个网站有上千上万条数据,我们不可能知道网站网页的url地址,所以,要有个技巧去抓取网站的所有html页面。Scrapy是纯Python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便~
&& Scrapy 使用wisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求。整体架构如下图所示:
&&& 绿线是数据流向,首先从初始URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。
我假定你已经安装了Scrapy。假如你没有安装,你可以参考这篇文章。
在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容
1. 创建一个新的Scrapy Project
2. 定义你需要从网页中提取的元素Item
3.实现一个Spider类,通过接口完成爬取URL和提取Item的功能
4. 实现一个Item PipeLine类,完成Item的存储功能
我将会用腾讯招聘官网作为例子。
Github源码:
目标:抓取腾讯招聘官网职位招聘信息并保存为JSON格式。
首先,为我们的爬虫新建一个工程,首先进入一个目录(任意一个我们用来保存代码的目录),执行:
scrapy startprojectitzhaopin
最后的itzhaopin就是项目名称。这个命令会在当前目录下创建一个新目录itzhaopin,结构如下:
├── itzhaopin
│&& ├── itzhaopin
│&& │&& ├── __init__.py
│&& │&& ├── items.py
│&& │&& ├── pipelines.py
│&& │&& ├── settings.py
│&& │&& └── spiders
│&& │&&&&& └── __init__.py
│&& └── scrapy.cfg
scrapy.cfg: 项目配置文件
items.py: 需要提取的数据结构定义文件
pipelines.py:管道定义,用来对items里面提取的数据做进一步处理,如保存等
settings.py: 爬虫配置文件
spiders: 放置spider的目录
在items.py里面定义我们要抓取的数据:
from scrapy.item import Item, Field
class TencentItem(Item):
name = Field()
# 职位名称
catalog = Field()
# 职位类别
workLocation = Field()
# 工作地点
recruitNumber = Field()
# 招聘人数
detailLink = Field()
# 职位详情页链接
publishTime = Field()
# 发布时间
实现Spider
Spider是一个继承自scrapy.contrib.spiders.CrawlSpider的Python类,有三个必需的定义的成员
name: 名字,这个spider的标识
start_urls:一个url列表,spider从这些网页开始抓取
parse():一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容,同时需要返回下一个需要抓取的网页,或者返回items列表
所以在spiders目录下新建一个spider,tencent_spider.py:
import json
from scrapy.selector import Selector
from scrapy.spider import Spider
from scrapy.spider import BaseSpider as Spider
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor as sle
from itzhaopin.items import *
from itzhaopin.misc.log import *
class TencentSpider(CrawlSpider):
name = "tencent"
allowed_domains = [""]
start_urls = [
"/position.php"
rules = [ # 定义爬取URL的规则
Rule(sle(allow=("/position.php\?&start=\d{,4}#a")), follow=True, callback='parse_item')
def parse_item(self, response): # 提取数据到Items里面,主要用到XPath和CSS选择器提取网页数据
items = []
sel = Selector(response)
base_url = get_base_url(response)
sites_even = sel.css('table.tablelist tr.even')
for site in sites_even:
item = TencentItem()
item['name'] = site.css('.l.square a').xpath('text()').extract()
relative_url = site.css('.l.square a').xpath('@href').extract()[0]
item['detailLink'] = urljoin_rfc(base_url, relative_url)
item['catalog'] = site.css('tr & td:nth-child(2)::text').extract()
item['workLocation'] = site.css('tr & td:nth-child(4)::text').extract()
item['recruitNumber'] = site.css('tr & td:nth-child(3)::text').extract()
item['publishTime'] = site.css('tr & td:nth-child(5)::text').extract()
items.append(item)
#print repr(item).decode("unicode-escape") + '\n'
sites_odd = sel.css('table.tablelist tr.odd')
for site in sites_odd:
item = TencentItem()
item['name'] = site.css('.l.square a').xpath('text()').extract()
relative_url = site.css('.l.square a').xpath('@href').extract()[0]
item['detailLink'] = urljoin_rfc(base_url, relative_url)
item['catalog'] = site.css('tr & td:nth-child(2)::text').extract()
item['workLocation'] = site.css('tr & td:nth-child(4)::text').extract()
item['recruitNumber'] = site.css('tr & td:nth-child(3)::text').extract()
item['publishTime'] = site.css('tr & td:nth-child(5)::text').extract()
items.append(item)
#print repr(item).decode("unicode-escape") + '\n'
info('parsed ' + str(response))
return items
def _process_request(self, request):
info('process ' + str(request))
return request
实现PipeLine
PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。
PipeLine只有一个需要实现的方法:process_item,例如我们将Item保存到JSON格式文件中:
pipelines.py
from scrapy import signals
import json
import codecs
class JsonWithEncodingTencentPipeline(object):
def __init__(self):
self.file = codecs.open('tencent.json', 'w', encoding='utf-8')
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
def spider_closed(self, spider):
self.file.close(
到现在,我们就完成了一个基本的爬虫的实现,可以输入下面的命令来启动这个Spider
scrapy crawl tencent
爬虫运行结束后,在当前目录下将会生成一个名为tencent.json的文件,其中以JSON格式保存了职位招聘信息。
部分内容如下:
{"recruitNumber": ["1"], "name": ["SD5-资深手游策划(深圳)"], "detailLink": "", "publishTime":
[""], "catalog": ["产品/项目类"], "workLocation": ["深圳"]}
{"recruitNumber": ["1"], "name": ["TEG13-后台开发工程师(深圳)"], "detailLink": "",
"publishTime": [""], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["2"], "name": ["TEG12-数据中心高级经理(深圳)"], "detailLink": "",
"publishTime": [""], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["1"], "name": ["GY1-微信支付品牌策划经理(深圳)"], "detailLink": "",
"publishTime": [""], "catalog": ["市场类"], "workLocation": ["深圳"]}
{"recruitNumber": ["2"], "name": ["SNG06-后台开发工程师(深圳)"], "detailLink": "",
"publishTime": [""], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["2"], "name": ["OMG01-腾讯时尚视频策划编辑(北京)"], "detailLink": "",
"publishTime": [""], "catalog": ["内容编辑类"], "workLocation": ["北京"]}
{"recruitNumber": ["1"], "name": ["HY08-QT客户端Windows开发工程师(深圳)"], "detailLink": "",
"publishTime": [""], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["5"], "name": ["HY1-移动游戏测试经理(上海)"], "detailLink": "", "publishTime": [""], "catalog": ["技术类"], "workLocation": ["上海"]}
{"recruitNumber": ["1"], "name": ["HY6-网吧平台高级产品经理(深圳)"], "detailLink": "", "publishTime": [""], "catalog": ["产品/项目类"], "workLocation": ["深圳"]}
{"recruitNumber": ["4"], "name": ["TEG14-云存储研发工程师(深圳)"], "detailLink": "", "publishTime": [""], "catalog": ["技术类"], "workLocation": ["深圳"]}
{"recruitNumber": ["1"], "name": ["CB-薪酬经理(深圳)"], "detailLink": "", "publishTime": [""], "catalog": ["职能类"], "workLocation": ["深圳"]}
以上全部内容就是通过Python爬虫框架Scrapy实战之批量抓取招聘信息的全部内容,希望对大家有所帮助,欲了解更多编程知识,请锁定我们的网站,每天都有新的内容发布。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具分享一个51job爬虫,按城市批量获取招聘信息包含地理坐标,需要数据的可以看一下 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
下载51job招聘信息的爬虫程序
1.程序使用NodeJS编写,运行安装nodejs
2.下载的数据存储在文本文档中以&字符为分隔符,一条招聘信息为一行数据。
3.下载51job招聘信息,jobid,companyid 公司简介,岗位简介,经纬度等
可根据自身需要修改url参数实现分类下载招聘数据。
地区查询一次下载整个地区的数据,程序中默认将查询半径设radius置公里)旨在获取该地区的所有数据。但是数据最多返回10w条,向北京这样城市超过10w条数据因此需要设置多个中心点然后去重。
下载参数设置在config,json中
&address&:&中关村&,
//搜索中心
&jobarea&:&010000&,
//搜索城市代码
& startpage&:0
//下载起始页码,默认为0 在下载出错时修改该值,改完出错时中断的页码,实现继续上次中断下载
windows下启动,修改下载参数,双击startapp.cmd 开始下载
城市代码表:
&a name=&SelectMapArea& codestr=&010000& city=&北京& href=&javascript:void(0);&&北京&/a&&/span&
&a name=&SelectMapArea& codestr=&050000& city=&天津& href=&javascript:void(0);&&天津&/a&
&a name=&SelectMapArea& codestr=&230300& city=&大连& href=&javascript:void(0);&&大连&/a&
&a name=&SelectMapArea& codestr=&230200& city=&沈阳& href=&javascript:void(0);&&沈阳&/a&
&a name=&SelectMapArea& codestr=&240200& city=&长春& href=&javascript:void(0);&&长春&/a&
&a name=&SelectMapArea& codestr=&220200& city=&哈尔滨& href=&javascript:void(0);&&哈尔滨&/a&
&a name=&SelectMapArea& codestr=&160200& city=&石家庄& href=&javascript:void(0);&&石家庄&/a&
&/td&
&/tr&
&td class=&normalfont& nowrap=&nowrap& valign=&top&&&strong&华东地区:&/strong&&/td&
&a name=&SelectMapArea& codestr=&020000& city=&上海& href=&javascript:void(0);&&上海&/a&
&a name=&SelectMapArea& codestr=&070200& city=&南京& href=&javascript:void(0);&&南京&/a&
&a name=&SelectMapArea& codestr=&070300& city=&苏州& href=&javascript:void(0);&&苏州&/a&
&a name=&SelectMapArea& codestr=&080200& city=&杭州& href=&javascript:void(0);&&杭州&/a&
&a name=&SelectMapArea& codestr=&080300& city=&宁波& href=&javascript:void(0);&&宁波&/a&
&a name=&SelectMapArea& codestr=&150200& city=&合肥& href=&javascript:void(0);&&合肥&/a&
&a name=&SelectMapArea& codestr=&120200& city=&济南& href=&javascript:void(0);&&济南&/a&
&a name=&SelectMapArea& codestr=&120300& city=&青岛& href=&javascript:void(0);&&青岛&/a&
&a name=&SelectMapArea& codestr=&110200& city=&福州& href=&javascript:void(0);&&福州&/a&
&a name=&SelectMapArea& codestr=&110300& city=&厦门& href=&javascript:void(0);&&厦门&/a&
&br/&
&a name=&SelectMapArea& codestr=&130200& city=&南昌& href=&javascript:void(0);&&南昌&/a&
&a name=&SelectMapArea& codestr=&070400& city=&无锡& href=&javascript:void(0);&&无锡&/a&
&a name=&SelectMapArea& codestr=&070500& city=&常州& href=&javascript:void(0);&&常州&/a&
&/td&
&/tr&
&td class=&normalfont& nowrap=&nowrap&&&strong&华南-华中:&/strong&&/td&
&a name=&SelectMapArea& codestr=&030200&
city=&广州& href=&javascript:void(0);&&广州&/a&
&a name=&SelectMapArea& codestr=&040000&
city=&深圳& href=&javascript:void(0);&&深圳&/a&
&a name=&SelectMapArea& codestr=&030800&
city=&东莞& href=&javascript:void(0);&&东莞&/a&
&a name=&SelectMapArea& codestr=&180200&
city=&武汉& href=&javascript:void(0);&&武汉&/a&
&a name=&SelectMapArea& codestr=&190200&
city=&长沙& href=&javascript:void(0);&&长沙&/a&
&a name=&SelectMapArea& codestr=&170200&
city=&郑州& href=&javascript:void(0);&&郑州&/a&
&/td&
&/tr&
&td class=&normalfont& nowrap=&nowrap&&&strong&西北-西南:&/strong&&/td&
&a name=&SelectMapArea& codestr=&200200& city=&西安& href=&javascript:void(0);&&西安&/a&
&a name=&SelectMapArea& codestr=&090200& city=&成都& href=&javascript:void(0);&&成都&/a&
&a name=&SelectMapArea& codestr=&060000& city=&重庆& href=&javascript:void(0);&&重庆&/a&
&a name=&SelectMapArea& codestr=&250200& city=&昆明& href=&javascript:void(0);&&昆明&/a&
&/td&
&/tr&
codestr即为参数中的jobarea
address为 原网站
中心即可。
数据导入excel示例
把代码分享一下嘛 ^_^
帖子第一行Github链接
不过 node_modules 不用传到 github 上吧
这东西是给完全不懂node的人写的,所以就传上去了!
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的

我要回帖

更多关于 怎么爬取招聘网站简历 的文章

 

随机推荐