Python爬虫——爬取Python岗位的那些事
本文目标
获取 Ajax 请求,解析 JSON 中所需字段
数据保存到 Excel 中
数据保存到 MySQL, 方便分析
简单分析
五个城市 Python 岗位平均薪资水平
Python 岗位要求学历分布
Python 行业领域分布
Python 公司规模分布
查看页面结构
我们输入查询条件以 Python 为例,其他条件默认不选,点击查询,就能看到所有 Python 的岗位了,然后我们打开控制台,点击网络标签可以看到如下请求:
从响应结果来看,这个请求正是我们需要的内容。后面我们直接请求这个地址就好了。从图中可以看出 result 下面就是各个岗位信息。
到这里我们知道了从哪里请求数据,从哪里获取结果。但是 result 列表中只有第一页 15 条数据,其他页面数据怎么获取呢?
分析请求参数
我们点击参数选项卡,如下:
发现提交了三个表单数据,很明显看出来 kd 就是我们搜索的关键词,pn 就是当前页码。first 默认就行了,不用管它。剩下的事情就是构造请求,来下载 30 个页面的数据了。
构造请求,并解析数据
构造请求很简单,我们还是用 requests 库来搞定。首先我们构造出表单数据 data = {‘first’: ‘true’, ‘pn’: page, ‘kd’: lang_name} 之后用 requests 来请求url地址,解析得到的 Json 数据就算大功告成了。由于拉勾对爬虫限制比较严格,我们需要把浏览器中 headers 字段全部加上,而且把爬虫间隔调大一点,我后面设置的为 10-20s,然后就能正常获取数据了。
import requestsdef get_json(url, page, lang_name):headers = {'Host': 'www.lagou.com','Connection': 'keep-alive','Content-Length': '23','Origin': 'https://www.lagou.com','X-Anit-Forge-Code': '0','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'application/json, text/javascript, */*; q=0.01','X-Requested-With': 'XMLHttpRequest','X-Anit-Forge-Token': 'None','Referer': 'https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'}data = {'first': 'false', 'pn': page, 'kd': lang_name}json = requests.post(url, data, headers=headers).json()list_con = json['content']['positionResult']['result']info_list = []for i in list_con:info = []info.append(i.get('companyShortName', '无'))info.append(i.get('companyFullName', '无'))info.append(i.get('industryField', '无'))info.append(i.get('companySize', '无'))info.append(i.get('salary', '无'))info.append(i.get('city', '无'))info.append(i.get('education', '无'))info_list.append(info)return info_list
获取所有数据
了解了如何解析数据,剩下的就是连续请求所有页面了,我们构造一个函数来请求所有 30 页的数据。
def main():lang_name = 'python'wb = Workbook()conn = get_conn()for i in ['北京', '上海', '广州', '深圳', '杭州']:page = 1ws1 = wb.activews1.title = lang_nameurl = 'https://www.lagou.com/jobs/positionAjax.json?city={}&needAddtionalResult=false'.format(i)while page < 31:info = get_json(url, page, lang_name)page += 1import timea = random.randint(10, 20)time.sleep(a)for row in info:insert(conn, tuple(row))ws1.append(row)conn.close()wb.save('{}职位信息.xlsx'.format(lang_name))if __name__ == '__main__':main()
完整代码
import random import timeimport requests from openpyxl import Workbook import pymysql.cursorsdef get_conn():'''建立数据库连接'''conn = pymysql.connect(host='localhost',user='root',password='root',db='python',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)return conndef insert(conn, info):'''数据写入数据库'''with conn.cursor() as cursor:sql = "INSERT INTO `python` (`shortname`, `fullname`, `industryfield`, `companySize`, `salary`, `city`, `education`) VALUES (%s, %s, %s, %s, %s, %s, %s)"cursor.execute(sql, info)conn.commit()//如果大家对Python感兴趣的话,可以加一下我们的学习交流抠抠群哦:649825285,免费领取一套学习资料和视频课程哟~ def get_json(url, page, lang_name):'''返回当前页面的信息列表'''headers = {'Host': 'www.lagou.com','Connection': 'keep-alive','Content-Length': '23','Origin': 'https://www.lagou.com','X-Anit-Forge-Code': '0','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'application/json, text/javascript, */*; q=0.01','X-Requested-With': 'XMLHttpRequest','X-Anit-Forge-Token': 'None','Referer': 'https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'}data = {'first': 'false', 'pn': page, 'kd': lang_name}json = requests.post(url, data, headers=headers).json()list_con = json['content']['positionResult']['result']info_list = []for i in list_con:info = []info.append(i.get('companyShortName', '无')) # 公司名info.append(i.get('companyFullName', '无'))info.append(i.get('industryField', '无')) # 行业领域info.append(i.get('companySize', '无')) # 公司规模info.append(i.get('salary', '无')) # 薪资info.append(i.get('city', '无'))info.append(i.get('education', '无')) # 学历info_list.append(info)return info_list # 返回列表def main():lang_name = 'python'wb = Workbook() # 打开 excel 工作簿conn = get_conn() # 建立数据库连接 不存数据库 注释此行for i in ['北京', '上海', '广州', '深圳', '杭州']: # 五个城市page = 1ws1 = wb.activews1.title = lang_nameurl = 'https://www.lagou.com/jobs/positionAjax.json?city={}&needAddtionalResult=false'.format(i)while page < 31: # 每个城市30页信息info = get_json(url, page, lang_name)page += 1time.sleep(random.randint(10, 20))for row in info:insert(conn, tuple(row)) # 插入数据库,若不想存入 注释此行ws1.append(row)conn.close() # 关闭数据库连接,不存数据库 注释此行wb.save('{}职位信息.xlsx'.format(lang_name))if __name__ == '__main__':main()
Python爬虫——爬取Python岗位的那些事相关推荐
- 在当当买了python怎么下载源代码-python爬虫爬取当当网
[实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...
- python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例
这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...
- python爬虫数据分析可以做什么-python爬虫爬取的数据可以做什么
在Python中连接到多播服务器问题,怎么解决你把redirect关闭就可以了.在send时,加上参数allow_redirects=False 通常每个浏览器都会设置redirect的次数.如果re ...
- python爬虫爬取csdn博客专家所有博客内容
python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 #coding:utf-8import urlli ...
- python网易云_用python爬虫爬取网易云音乐
标签: 使用python爬虫爬取网易云音乐 需要使用的模块 只需要requests模块和os模块即可 开始工作 先去网易云音乐网页版找一下你想要听的歌曲点击进去.按键盘F12打开网页调试工具,点击Ne ...
- 使用Python爬虫爬取网络美女图片
代码地址如下: http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip instal ...
- python如何爬取网站所有目录_用python爬虫爬取网站的章节目录及其网址
认识爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟 ...
- 运用Python爬虫爬取一个美女网址,爬取美女图
运用Python爬虫爬取一个美女网址,爬取美女图 要运用到的python技术: 导入库 1.request 发送请求,从服务器获取数据 2.BeautifulSoup 用来解析整个网页的源代码 imp ...
- Python爬虫|爬取喜马拉雅音频
"GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...
最新文章
- 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 BasicMessageChannel 通信 )
- 为什么应该用record来定义DTO(续)
- java桥_java 泛型--桥方法
- WinCE EBOOT中的BootPart分析
- mvn install java版本,maven的打包命令--assemblyinstall和maven update之后jdk版本变回1.5的问题...
- 快毕业才发现自己找不到工作,为什么实习经历如此重要?
- Visual C++ MFC/ATL开发-提高篇
- 我写了一个“文本转手写”神器来搞定作业!
- 2018年IEEE Fellow名单:32位中国学者入选,清华成最大赢家
- php7从基础到商业实战,TP5从基础到项目实战全套
- sphinx下的max_matches取值对SetLimits的影响
- Redis 解决了哪些问题?
- MPC5744P-时钟模块
- 打开catia界面全是白色怎么办_别输在细节上!CATIA零件表面写字技巧
- html5中的function,js中function函数的使用方法
- element-ui tree全部展开和全部折叠
- 交叉编译xorg-server
- 加速Pytorch安装的速度
- 股票大作手回忆录(读书笔记)
- 信奥中的数学:加法原理和乘法原理