拉勾因其结构化的数据比较多因此过去常常被爬,所以在其多次改版之下变得难爬。不过只要清楚它的原理,依然比较好爬。其机制主要就是AJAX异步加载JSON数据,所以至少在搜索页面里翻页url不会变化,而且数据也不会出现在源代码里。

数据解析

这是深圳地区的数据分析师页面,用Chrome检查打开。在XHR中可以看到一个以postionAjax.json开头的脚本,打开Preview看一下,可以看到:

可以发现这些数据与前端的数据一致,此时我们已经找到了数据入口,就可以开始爬了。

数据爬取

在Headers里可以查看请求方式:

Request Header:

Request URL:https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&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_%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": "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=%E5%85%A8%E5%9B%BD; 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。

基于python爬虫的岗位数据分析以拉勾网为例_Python拉勾爬虫——以深圳地区数据分析师为例...相关推荐

  1. 基于python爬虫的岗位数据分析以拉勾网为例_爬虫小实例-拉勾网数据分析岗位...

    原标题:爬虫小实例-拉勾网数据分析岗位 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数据分析挖 ...

  2. 基于Python热点新闻关键词数据分析系统

    温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目简介 利用网络爬虫技术从某新闻网站爬取最新的新闻数据,并进行版块分类,对某篇版块下的所有新闻进行中文分词, ...

  3. 基于Python的直播平台数据分析可视化系统

    温馨提示:文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :) 1. 项目简介 随着移动互联网和5G的快速发展,视频直播行业呈现出丰富多元的内容形态,覆盖更多的场景和受众,视频成为 ...

  4. 基于python的气象数据分析统计服_基于Python的风向风速数据分析的设计与实现

    基于 Python 的风向风速数据分析的设计与实现 李文倩 ; 刘婕 [期刊名称] < <信息通信> > [年 ( 卷 ), 期] 2019(000)009 [摘要] Pyth ...

  5. python微信好友分析_基于python实现微信好友数据分析(简单)

    一.功能介绍 本文主要介绍利用网页端微信获取数据,实现个人微信好友数据的获取,并进行一些简单的数据分析,功能包括: 1.爬取好友列表,显示好友昵称.性别和地域和签名, 文件保存为 xlsx 格式 2. ...

  6. python数据分析岗位_python拉勾数据职位分析

    简介:试着,做了一个拉勾网数据分析师职位的数据分析. 其实,虽然很想做数据分析师,但是是跨行,心里相当忐忑,做这个分析就相当于加深自己对数据分析这个行业的了解了. 思路 大致思路 起始 数据来源 本来 ...

  7. python数据获取就业方向_基于Python的就业岗位数据获取与预处理

    林长谋 黄玮 摘要:互联网数据获取及分析是当前数据科学的一個重要部分.该文针对互联网中就业岗位数据获取与分析的过程基于Python构建了网络爬虫.并在通爬虫获取网络数据的基础上,对所获得的就业岗位数据 ...

  8. 基于Python的电影影片数据分析

    摘 要 数据分析与可视化是当今数据分析的发展方向.大数据时代,数据资源具有海量特征.数据分析和可视化主要通过Python数据分析来实现.基于Python的数据分析可视化和技术实现是目前Python数据 ...

  9. 基于Python的气象时空数据分析教程

    目录 一.时空数据的常见格式 1. 常见格式的简介 2. 常见格式的读取 导入模块 读取nc数据 创建nc数据 绘制nc数据 绘制GeoTIFF数据 ​读取Shapefile数据 绘制Shapefil ...

最新文章

  1. python的简单编程-python入门脚本的简单示例
  2. mybatis.xml中sql编写规范
  3. Bootstrap3 栅格系统-栅格参数
  4. linux有关网络服务的接口,linux系统有关网络服务接口定义是哪个?
  5. 微信小程序自定义弹窗实例
  6. Cow Contest POJ - 3660(floyed求传递闭包)
  7. Class Imbalance Problem
  8. dba_tables 和 dba_segments 表中 blocks 的区别
  9. Tapestry5 开发过程中问题收集
  10. linux usb转串口驱动报错,USB转串口驱动编译出错
  11. easyui datagrid 点击其它 单元格,不让头列 checkbook 选中
  12. 2021年10月考试总结
  13. 正则新能源车牌和汽车牌混合验证
  14. 均值滤波,中值滤波,最大最小值滤波
  15. 开源动物园一日游!技术圈的这些“飞禽走兽”你认识多少?
  16. ssl证书默认端口是什么,ssl证书证书的作用
  17. win10增加matlab虚拟内存,详细教你win10如何增加虚拟内存
  18. 基于JAVA的局域网聊天软件的设计与实现(仿制QQ)
  19. 1056: 幸运数字 C语言
  20. 互联网公司招聘--京东--前端-2016年笔试题

热门文章

  1. iphone6 iphone6 plus 放大显示模式高分辨率模式问题
  2. Android下intent的setdata、settype和setdataandtype函数
  3. 全部编程皆为Web编程
  4. Tensor Decomposition
  5. ADempiere TableDirect类型的reference分析
  6. python 报错 bs4 FeatureNotFound: Couldn‘t find a tree builder with the features you requested: lxml
  7. golang 字节切片 数组 字符串 互转
  8. centos 7 单用户模式无法重置root密码 解决方法
  9. mysql char varchar text 对比
  10. linux makefile 宏定义