php爬拉钩数据,拉勾网数据两种爬取
写在前面:
拉勾网数据爬取是一个蛮经典的爬虫案例 ,由于被频繁被爬取的原因 ,网站经过不断更新 ,加入了一些反爬技术 。例如:参数的加密 、AJAX异步加载JSON数据 。对于入门爬虫的新手来说 ,还是有一些困难 。这里用到selenium和post请求两种方式解析网页 ,希望可以帮到你们 。
分析网页:
这里我们以 数据分析 该职位为例 : 链接
数据在网页一般会分为两种加载方式 : 在原网页内与不在原网页内 。判断的方法可以复制网页内要爬取的一些数据 ,然后右击网页 ——查看源代码 , 看一看是否可以找到 。:
picture_1
按ctrl + f 输入复制的的数据发现并没有存在原网页内 。
那么可以推断出 , 我们要爬取的数据是通过AJAX异步加载JSON数据到网页的 。
那我们需要在网页后台找到那个json数据 ,我用的是chrom浏览器 ,右击 ——检查 :
picture_2
在picture_1中 选择 network --- XHR (如果没有数据的话,重新加载一下网页) ,可以在左边看到四个json链接 。因为我们要爬取的是职位 ,很快我们就可以确定目标url ,picture_3验证了准确性 :
picture_3
在picture_3中我们可以很清楚的看见这是一个json格式的数据 ,通过分析 ,可以找到数据在result下面 :
picture_4
通过对比picture_5发现就是我们要爬取的数据 。
picture_5
编写爬虫:
picture_6
下面我们构造headers :
my_headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Host':'www.lagou.com',
'Referer':'https://www.lagou.com/jobs/list_{}?labelWords=sug&fromSearch=true&suginput='.format(position_id),
'X-Anit-Forge-Code':'0',
'X-Anit-Forge-Token': 'None',
'X-Requested-With':'XMLHttpRequest'
}
其中的referer可以看到 ,我用format函数加入了一个参数 ,便于爬取不同城市的数据 , 如果你只打算爬取一个城市这里可以不加 ,只使用浏览器上带的参数 。
提交的 data:
my_data = {
'first': 'true',
'pn':num,
'kd':position
}
picture_7
从picture中可以看出需要post数据主要有三个 ,其中 pn:为页码数 ,kd:为职位名称 。因此 ,我将这两个参数的值设置为变量 num和position ,便于接下来的post页码和不同职位的实现 。
def get_json(url,num,position,position_id):
#print(position)
'''''从网页获取JSON,使用POST请求,加上头部信息'''
my_headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Host':'www.lagou.com',
'Referer':'https://www.lagou.com/jobs/list_{}?labelWords=sug&fromSearch=true&suginput='.format(position_id),
'X-Anit-Forge-Code':'0',
'X-Anit-Forge-Token': 'None',
'X-Requested-With':'XMLHttpRequest'
}
my_data = {
'first': 'true',
'pn':num,
'kd':position}
res = requests.post(url, headers = my_headers, data = my_data)
res.raise_for_status()
res.encoding = 'utf-8'
# 得到包含职位信息的字典
page = res.json()
return page
这是带headers和data完整的post请求 , 其中函数由四个参数 ,url为刚刚我们找出的那个链接 。num是页码 ,这里我们先设置为起始页码1 。position为职位名称 ,position_id为职位代号 。我们可以从headers的referen中看出 :https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=sug&fromSearch=true&suginput=shujufenxi 在list_到?中的职位名称被加密出现, 所以我构造了一个字典 :
def getCity():
return [
{"苏州":"%E8%8B%8F%E5%B7%9E"},
{"深圳":"%E6%B7%B1%E5%9C%B3"},
{"上海":"%E4%B8%8A%E6%B5%B7"},
{"杭州":"%E6%9D%AD%E5%B7%9E"},
{"南京":"%E5%8D%97%E4%BA%AC"},
]
def getLanguage():
return [
#"python",
{"数据分析":"%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90"},
{"图像处理":"%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86"},
{"":""},
{"":""},
{"":""},
]
将需要爬取的城市 、职位所对应的加密码一一对应 。
get_json函数返回了json数据 ,包括了职位总数 ,这样我们就可以构造一个函数 ,而且拉勾网 一页最多显示15个职位 ,计算出我们爬取职位的总页数了 。
def get_page_num(count):
'''''计算要抓取的页数'''
# 每页15个职位,向上取整
res = math.ceil(count/15)
# 拉勾网最多显示30页结果
if res > 30:
return 30
else:
return res
计算出页数之后 , 我们就可以通过一个循环 ,带着可变参数反复post数据:
for n in range(1,num+1):
# 对每个网页读取JSON, 获取每页数据
page = get_json(url,n,position,position_id)
try:
jobs_list = page['content']['positionResult']['result']
except:
continue
page_info = get_info_to_mongodb(jobs_list)
res_list.extend(page_info)
查看返回的结果 ,这里我通过构造一个含有dict的list便于存入mongodb ,看个人需求 :
picture_8.png
picture_9.png
通过看原网页的数据 , 我们发现数据已经被爬取先来了 一共19个职位 ,共分两页
php爬拉钩数据,拉勾网数据两种爬取相关推荐
- docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别
前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...
- WPF中在XAML中实现数据类型转换的两种方法
WPF中在XAML中实现数据类型转换的两种方法 原文:WPF中在XAML中实现数据类型转换的两种方法 熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在 ...
- 归一化mysql函数_数据归一化和两种常用的归一化方法
数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...
- 数据集成的两种架构:ELT和ETL
数据集成的两种架构:ELT和ETL 集成是数据工程师要做的工作之一.一般来说,数据工程师的工作包括了数据的ETL和数据挖掘算法的实现.算法实现 可以理解,就是通过数据挖掘算法,从数据仓库中找到&quo ...
- 数据增加的两种方法(二)
数据增加的两种方法(二) 开发工具与关键技术:SQL Server 2014.数据增加的两种方法(二) 作者:袁何恩 撰写时间:2019年7月26日 今天,我要和大家分享的技术是新增数据的两种方法. ...
- Android页面数据传递的两种方式
在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...
- 计算机中数的存储和处理都使用二进制对吗,计算机中的数据可分为两种类型:数字和字符,它们最终都要转换为二进制代码进行存储和处理。对于人们习惯的十进制数字,通常用____进行转换。...
计算机中的数据可分为两种类型:数字和字符,它们最终都要转换为二进制代码进行存储和处理.对于人们习惯的十进制数字,通常用____进行转换. 更多相关问题 [单选] 电力线路巡视检查周期,定期巡视每月至少 ...
- 跨页数据传递的两种方式
选择具有PostBackUrl属性的三个控件Button.LinkButton.ImageButton.PostBackUrl属性的值就是投递的页面URL. 要在接收页面按对象的方式接收投递页面的表单 ...
- cxgrid中纵横单元格合并_逆向查询合并单元格中的数据,这两种方法你值得拥有...
有同事询问了一个问题,说下面的这种表格,我有部门和人员的清单列表,如果我想根据人员清单去查询其所在的部门要怎么实现呢? 因为部门列的数据内容是经过合并的,如果我们直接使用Vlookup进行查找,查找 ...
- python 读取csv_Python实现CSV数据的读取--两种方法实现
原博文 2016-08-22 16:42 − 方法一: 方法二: ... 相关推荐 2019-12-08 09:48 − CSV csv文件格式是一种通用的电子表格和数据库导入导出格式.最近我调用RP ...
最新文章
- 如何查看和关闭异常SQL进程
- Elasticsearch学习总结(02-28 - 03-04)
- python【蓝桥杯vip练习题库】ALGO-231多阶乘计算
- 来个“云”毕业典礼,这些装扮太硬核了!
- 开发里程碑计划_项目里程碑你真的会用了吗?(干货)
- linux树形目录结构存放,Linux目录结构
- 颠覆传统,仅银行卡大小充电宝,10000mAh可登机,手机党出门随身必备!
- 关于计算机网络的未来综述,计算机网络综述
- Spring3.1.0+Quartz1.8.6整合实现计划任务
- SPSS数据分析之描述性统计、区间估计与假设检验【操作详解】
- 在CentOs 5.1中使用rpm安装NGINX+php+mysql(二)
- ecshop商品下面显示销售量
- 如何使用Snagit修剪视频?
- VS2013中为C++程序生成lib和dll文件
- 网站建设经验分享:如何设计及运营网站
- 利用adsl拨号服务器VPS构建代理IP池
- 直线一级倒立摆数学建模与控制仿真
- 如何在Windows 11上的WSL2做到GPU直通,并用Deepracer本地训练炸干电脑的资源(显卡降价了,618等等党还等什么,一起来加入Deepracer的比赛学习交流吧)
- Android Studio统一依赖管理Composing builds
- linux usb声卡 无声音,记一次解决在Ubuntu 18.04下声卡没有声音的经历
热门文章
- oracle中的或者是什么,oracle中=是什么意思呢?
- 恩,今天把git和sublime结合了一下。。然后看了下《西部世界》
- memory exhausted mysql 42000 1064
- python学习-获取时光网电影TOP100电影信息
- 【转】数据恢复WINHEX教程
- 【Flutter小记3】Android打开前置或广角摄像头的同时打开闪光灯方案
- 从外包月薪5K到阿里月薪15K,大厂面试必备技能
- c语言释放malloc空间,C语言内存分配与释放
- Combating Spyware in the Enterprise
- 编译原理 3.28 课堂作业