可以发现这些数据与前端的数据一致,此时我们已经找到了数据入口,就可以开始爬了。
在 Headers 里可以查看请求方式:
Request Header:
Request URL:https://www.lagou.com/jobs/positionAjax.json?city = 深圳 & needAddtionalResult=false
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(compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser;.NET CLR 1.1.4322;.NET CLR 2.0.50727)"",
- "Accept": "application/json, text/javascript, */*; q=0.01",
- "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
- "Referer": "https://www.lagou.com/jobs/list_数据分析师?px=default&city=深圳&district=南山区",
- "X-Requested-With": "XMLHttpRequest",
- "Host": "www.lagou.com",
- "Connection": "keep-alive",
- "Cookie": "user_trace_token=20160214102121-0be42521e365477ba08bd330fd2c9c72; LGUID=20160214102122-a3b749ae-d2c1-11e5-8a48-525400f775ce; tencentSig=9579373568; pgv_pvi=3712577536; index_location_city=全国; SEARCH_ID=c684c55390a84fe5bd7b62bf1754b900; JSESSIONID=8C779B1311176D4D6B74AF3CE40CE5F2; TG-TRACK-CODE=index_hotjob; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1485318435,1485338972,1485393674,1485423558; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1485423598; _ga=GA1.2.1996921784.1455416480; LGRID=20170126174002-691cb0a5-e3ab-11e6-bdc0-525400f775ce",
- "Origin": "https://www.lagou.com",
- "Upgrade-Insecure-Requests": "1",
- "X-Anit-Forge-Code": "0",
- "X-Anit-Forge-Token": "None",
- "Accept-Encoding": "gzip, deflate, br",
- "Accept-Language": "zh-CN,zh;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 = ["https://www.lagou.com/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) : try: 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) except: 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 的招聘需求都是抄来抄去)。因此,以上所有结论一定有某种程度的偏差,仅供参考。
来源: http://www.36dsj.com/archives/89137