写在前面:

拉勾网数据爬取是一个蛮经典的爬虫案例 ,由于被频繁被爬取的原因 ,网站经过不断更新 ,加入了一些反爬技术 。例如:参数的加密 、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爬拉钩数据,拉勾网数据两种爬取相关推荐

  1. docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别

    前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...

  2. WPF中在XAML中实现数据类型转换的两种方法

    WPF中在XAML中实现数据类型转换的两种方法 原文:WPF中在XAML中实现数据类型转换的两种方法 熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在 ...

  3. 归一化mysql函数_数据归一化和两种常用的归一化方法

    数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...

  4. 数据集成的两种架构:ELT和ETL

    数据集成的两种架构:ELT和ETL 集成是数据工程师要做的工作之一.一般来说,数据工程师的工作包括了数据的ETL和数据挖掘算法的实现.算法实现 可以理解,就是通过数据挖掘算法,从数据仓库中找到&quo ...

  5. 数据增加的两种方法(二)

    数据增加的两种方法(二) 开发工具与关键技术:SQL Server 2014.数据增加的两种方法(二) 作者:袁何恩 撰写时间:2019年7月26日 今天,我要和大家分享的技术是新增数据的两种方法. ...

  6. Android页面数据传递的两种方式

    在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...

  7. 计算机中数的存储和处理都使用二进制对吗,计算机中的数据可分为两种类型:数字和字符,它们最终都要转换为二进制代码进行存储和处理。对于人们习惯的十进制数字,通常用____进行转换。...

    计算机中的数据可分为两种类型:数字和字符,它们最终都要转换为二进制代码进行存储和处理.对于人们习惯的十进制数字,通常用____进行转换. 更多相关问题 [单选] 电力线路巡视检查周期,定期巡视每月至少 ...

  8. 跨页数据传递的两种方式

    选择具有PostBackUrl属性的三个控件Button.LinkButton.ImageButton.PostBackUrl属性的值就是投递的页面URL. 要在接收页面按对象的方式接收投递页面的表单 ...

  9. cxgrid中纵横单元格合并_逆向查询合并单元格中的数据,这两种方法你值得拥有...

    ​有同事询问了一个问题,说下面的这种表格,我有部门和人员的清单列表,如果我想根据人员清单去查询其所在的部门要怎么实现呢? 因为部门列的数据内容是经过合并的,如果我们直接使用Vlookup进行查找,查找 ...

  10. python 读取csv_Python实现CSV数据的读取--两种方法实现

    原博文 2016-08-22 16:42 − 方法一: 方法二: ... 相关推荐 2019-12-08 09:48 − CSV csv文件格式是一种通用的电子表格和数据库导入导出格式.最近我调用RP ...

最新文章

  1. 如何查看和关闭异常SQL进程
  2. Elasticsearch学习总结(02-28 - 03-04)
  3. python【蓝桥杯vip练习题库】ALGO-231多阶乘计算
  4. 来个“云”毕业典礼,这些装扮太硬核了!
  5. 开发里程碑计划_项目里程碑你真的会用了吗?(干货)
  6. linux树形目录结构存放,Linux目录结构
  7. 颠覆传统,仅银行卡大小充电宝,10000mAh可登机,手机党出门随身必备!
  8. 关于计算机网络的未来综述,计算机网络综述
  9. Spring3.1.0+Quartz1.8.6整合实现计划任务
  10. SPSS数据分析之描述性统计、区间估计与假设检验【操作详解】
  11. 在CentOs 5.1中使用rpm安装NGINX+php+mysql(二)
  12. ecshop商品下面显示销售量
  13. 如何使用Snagit修剪视频?
  14. VS2013中为C++程序生成lib和dll文件
  15. 网站建设经验分享:如何设计及运营网站
  16. 利用adsl拨号服务器VPS构建代理IP池
  17. 直线一级倒立摆数学建模与控制仿真
  18. 如何在Windows 11上的WSL2做到GPU直通,并用Deepracer本地训练炸干电脑的资源(显卡降价了,618等等党还等什么,一起来加入Deepracer的比赛学习交流吧)
  19. Android Studio统一依赖管理Composing builds
  20. linux usb声卡 无声音,记一次解决在Ubuntu 18.04下声卡没有声音的经历

热门文章

  1. oracle中的或者是什么,oracle中=是什么意思呢?
  2. 恩,今天把git和sublime结合了一下。。然后看了下《西部世界》
  3. memory exhausted mysql 42000 1064
  4. python学习-获取时光网电影TOP100电影信息
  5. 【转】数据恢复WINHEX教程
  6. 【Flutter小记3】Android打开前置或广角摄像头的同时打开闪光灯方案
  7. 从外包月薪5K到阿里月薪15K,大厂面试必备技能
  8. c语言释放malloc空间,C语言内存分配与释放
  9. Combating Spyware in the Enterprise
  10. 编译原理 3.28 课堂作业