Python 爬取拉勾招聘信息

故事背景

最近有个好哥们啊浪迫于家里工资太低,准备从北方老家那边来深圳这边找工作,啊浪是学平面设计的知道我在深圳这边于是向我打听深圳这边平面设计薪资水平,当时我有点懵逼这个行业不熟悉啊咋搞呢,准备打开招聘网站先看看再说打开网站输入招聘职位发先量还挺大,这样慢慢看不行啊效率太低啦,咋是程序员啊直接把数据拉下来不就行啦于是有啦这篇博客。

技术实现

用到的库

import os
import json
import urllib
import requests

页面分析

数据地址:https://www.lagou.com/

当我在 chrom 中输入拉勾网站查看页面源码时发现页面上的数据并没有直接显示在源码上。推断可能是使用 AJAX 异步加载数据,当我打开 chrom 开发者工具在 network 中查看 XHR 时发现一个 https://www.lagou.com/jobs/positionAjax.json?city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false 请求点开 response 果然数据都在这个请求中返回。

返回的数据格式如下:

可以发现我们需要的数据都存放在 result 中,于是准备直接获取数据但是使用 request 去模拟请求发现每次都会被拦截。因为拉勾在不登录的情况下浏览器也能获取数据应该不是用户级别的拦截,猜想可能是在 cookie 层面做的限制,发现请求没有携带网站的 cookie 直接拦截

获取请参数

def get_request_params(city, city_num):req_url = 'https://www.lagou.com/jobs/list_{}/p-city_{}?&cl=false&fromSearch=true&labelWords=&suginput='.format(urllib.parse.quote(city), city_num)ajax_url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city={}&needAddtionalResult=false'.format(urllib.parse.quote(city))headers = headers = {"Accept": "application/json, text/javascript, */*; q=0.01","Referer": "https://www.lagou.com/jobs/list_{}/p-city_{}?px=default#filterBox".format(urllib.parse.quote(city), city_num),"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",}return req_url, ajax_url, headers

于是在 请求中加上 cookie, 代码如下:

def get_cookie(city):city_num = get_city_num_by_name(city)req_url, _, headers = get_request_params(city, city_num)s = requests.session()s.get(req_url, headers=headers, timeout=3)cookie = s.cookiesreturn cookie

虽然加入 cookie 后能获取到数据但每次都是第一页的数据且是固定职位的数据,当再次查看请求真实数据地址的链接发现请求中每次都会携带 query 参数如下:

于是增加请求参数获取:

def get_params(pn, kd):return {'first': 'true','pn': pn,'kd': kd}

虽然我们解决请求参数以及获取页面数,但是每次只能爬取固定城市的数据太僵硬啦,查找原因原来是我们在请求数据 url 中携带有 city_nun 这个参数,每个城市都有一个对应的数字

打开拉勾页面源码将页面拉到最底部会发现 cityNumMap,查找到这个我们就能控制获取想要的城市职位信息啦

最终实现

import os
import json
import urllib
import requests
from cityNumMap import city_num_mapdef validate_params(city, key_world):if not city or not key_world:raise Exception('输入参数不能为空')def get_city_num_by_name(city_name):city_num = city_num_map.get(city_name)if not city_name:raise BaseException('>>>你输入的城市名有误,请确认后在重新输入')return city_numdef get_request_params(city, city_num):req_url = 'https://www.lagou.com/jobs/list_{}/p-city_{}?&cl=false&fromSearch=true&labelWords=&suginput='.format(urllib.parse.quote(city), city_num)ajax_url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city={}&needAddtionalResult=false'.format(urllib.parse.quote(city))headers = headers = {"Accept": "application/json, text/javascript, */*; q=0.01","Referer": "https://www.lagou.com/jobs/list_{}/p-city_{}?px=default#filterBox".format(urllib.parse.quote(city), city_num),"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36",}return req_url, ajax_url, headersdef get_params(pn, kd):return {'first': 'true','pn': pn,'kd': kd}def get_cookie(city):city_num = get_city_num_by_name(city)req_url, _, headers = get_request_params(city, city_num)s = requests.session()s.get(req_url, headers=headers, timeout=3)cookie = s.cookiesreturn cookiedef get_page_info(city, key_world):params = get_params(1, key_world)city_num = get_city_num_by_name(city)_, ajax_url, headers = get_request_params(city, city_num)html = requests.post(ajax_url, data=params, headers=headers, cookies=get_cookie(city), timeout=5)result = json.loads(html.text)total_count = result.get('content').get('positionResult').get('totalCount')page_size = result.get('content').get('pageSize')page_remainder = total_count % page_sizetotal_size = total_count // page_sizeif page_remainder == 0:total_size = total_sizeelse:total_size = total_size + 1print('>>>该职位总计{}条数据'.format(total_size))return total_sizedef get_page_data(city, key_world, total_size):path = os.path.dirname(__file__)path = os.path.join(path, 'lagou.txt')f = open(path, mode='w+')city_num = get_city_num_by_name(city)_, ajax_url, headers = get_request_params(city, city_num)for i in range(1, total_size):print('>>>开始获取第{}页数据'.format(i))params = get_params(i, key_world)html = requests.post(ajax_url, data=params, headers=headers, cookies=get_cookie(city), timeout=5)result = json.loads(html.text)data = result.get('content').get('positionResult').get('result')page_size = result.get('content').get('pageSize')for i in range(page_size):company_name = data[i].get('companyFullName')company_size = data[i].get('companySize')company_label = data[i].get('companyLabelList')salary = data[i].get('salary')education = data[i].get('education')result_str = '{}&&{}&&{}&&{}&&{}\n'.format(company_name, company_size, company_label, salary, education)f.write(result_str)print('>>>数据获取完成')if __name__ == "__main__":city = input('>>>请输入你要搜索职位的城市:').strip()kb = input('>>>请输入你要搜索的职位:').strip()validate_params(city, kb)total_size = get_page_info(city, kb)get_page_data(city, kb, total_size)

实现效果

在本地执行 pythin3 lagou.py 输入查找的地址以及职位会在当前同级目录下生成 lagou.txt 文件存储数据结果

部分结果数据

项目地址:完整代码

Python 爬取拉勾招聘信息相关推荐

  1. python爬取boss直聘招聘信息_年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备...

    原标题:年底啦,利用Python爬取Boss直聘的招聘信息,为明年跳槽做准备 前言 为什么都说程序员的薪资高,但是刚开始入职的你,薪资并不是自己想象中的那样,首先是你的工作经验不足,其次就是需要不断的 ...

  2. python爬取boss直聘招聘信息_Python 爬取boss直聘招聘信息!

    原标题:Python 爬取boss直聘招聘信息! 1.一些公共方法的准备 获取数据库链接: importpymysql ''' 遇到不懂的问题?Python学习交流群:821460695满足你的需求, ...

  3. python 爬取拉钩数据

    Python通过Request库爬取拉钩数据 爬取方法 数据页面 建表存储职位信息 解析页面核心代码 完整代码 结果展示 爬取方法 采用python爬取拉钩数据,有很多方法可以爬取,我采用的是通过Re ...

  4. python 爬取拉钩网数据

    python 爬取拉钩网数据 完整代码下载:https://github.com/tanjunchen/SpiderProject/blob/master/lagou/LaGouSpider.py # ...

  5. 使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)

    使用python爬取BOSS直聘岗位数据并做可视化 结果展示 首页 岗位信息 岗位详情 薪资表 学历需求 公司排名 岗位关键词 福利关键词 代码展示 爬虫代码 一.导入库 二.爬取数据 1.爬取数据代 ...

  6. python关于二手房的课程论文_基于python爬取链家二手房信息代码示例

    基本环境配置 python 3.6 pycharm requests parsel time 相关模块pip安装即可 确定目标网页数据 哦豁,这个价格..................看到都觉得脑阔 ...

  7. Python爬取安居客经纪人信息

    Python爬取安居客经纪人信息 Python2.7.15 今天我们来爬取安居客经纪人的信息.这次我们不再使用正则,我们使用beautifulsoup.不了解的可以先看一下这个文档,便于理解.http ...

  8. Python爬取药监局化妆品管理信息发现的问题

    Python爬取药监局化妆品管理信息 **1.json格式本质上是字符串!!! 今天在爬取国家药监局化妆品管理信息的时候,发现"json数据本质上是字符串",以前我还以为json本 ...

  9. 爬取BOSS直聘信息并进行清理和可视化分析(python小白)

    年底了,学习数据分析快四个月了.为了尽快找到一份数据分析相关的工作,计划把BOSS直聘上的相关职位都爬取下来分析分析,也好检验一下最近的学习成果.python新手,代码写的乱,将就看吧.首先,对给BO ...

最新文章

  1. centos transmission 无法开启登录验证
  2. Ubuntu 16.04使用root 帐号开启 SSH 登录
  3. ActiveMQ简介与安装
  4. MAX13085E/MAX485 _中文翻译
  5. C++中 Map的了解与基本用法(代码演示+自我总结+map中一对多的用法)
  6. javascript Function()
  7. postman使用指南
  8. 命名空间:不只是代码封装
  9. Oracle命令--查询语句
  10. ECshop商城程序常见的97个小问题汇总
  11. 中国智能燃气表行业发展态势分析及投资风险评估报告2022-2028年版
  12. 腾讯云:服务器资源池化技术发展趋势
  13. 2016年俄罗斯M2M市场达100亿俄罗斯卢布
  14. 谷歌colab平台简单使用及读取自己的数据集
  15. 《动手学深度学习》(七) -- 边界框和锚框
  16. 步进电机驱动控制总结(一)
  17. Python 医学知识图谱问答系统(一),建立医学知识图谱,基于neo4j知识图谱的医学问答体系
  18. 史上最小白之CNN 以及 TextCNN详解
  19. 中恒达软件测试,天线测试系统-恒达微波.PDF
  20. Markdown文本目录生成、页内跳转(附详细示例)

热门文章

  1. C语言isalpha函数介绍、示例和实现
  2. 代码发芽网 代码高亮核心模块(Pygments)升级到最新版(1.0 dev 20080727)
  3. SpringBoot使用junit测试
  4. YbtOJ「动态规划」第4章 树形DP
  5. android root权限注册,安卓root权限获取的方法【图文教程】
  6. stockgo数据爬取-业绩预告
  7. php模拟关注微博,PHP基于laravel框架获取微博数据之一 模拟新浪微博登录
  8. 自建svn服务器,svn服务器搭建
  9. 区块链是什么?有什么用?
  10. 电子商务有哪几种模式