python3爬虫系列08之新版动态智联爬取和存取数据库进行可视化分析
本篇是面向新版动态智联爬虫,数据存储到Mysql数据库,最后使用pyecharts读取并可视化分析。
在这之前,上一篇说的是
python3爬虫系列07之动态网页Json 数据,爬虫要怎么搞?
里面的实战是使用requests+json爬虫:根据输入词爬取豆瓣热门影片。
以及对json的分析和对文件的操作工具类:
json对象或json数组操作以及读写各类txt,csv,html,xls文件的工具类
1.前言
最近我查了一些现在的很多博客,慕课,腾讯课堂留下的关于爬取智联招聘岗位的代码,大部分都是老历史的,这个第一代版本的爬虫已经失效。
近期智联招聘的网站风格变化较快,这对于想爬取数据的人来说有些难受。
因此,在前人基础上,我重构了针对智联招聘网站的最新结构进行数据抓取的代码。
废话不多说,开始。
2.网页分析
(图是后配的,多少有些出入,但是不影响。)
进入智联招聘官网,在搜索界面输入‘java工程师’,(或者python,或者其他xxxx),然后界面跳转,
https://sou.zhaopin.com/?jl=551&sf=0&st=0&et=2&kw=java%E5%B7%A5%E7%A8%8B%E5%B8%88&kt=3
按F12查看网页源码,点击network
选中XHR,然后刷新网页。
可以看到一些Ajax请求, 找到画红线的XHR文件,点击可以看到网页的一些信息。
如图,点击Preview,可以看到我们所需要的信息就存在result中,这信息基本是json格式,有些是列表;
其次,在Header中有Request URL,就是真正的网页请求的地址。
那么如果要翻页的话,怎么办呢?
就需要通过找寻Request URL 的特点来分析具体变化的参数,和构造一个请求网址。
例如:
第一页:
https://fe-api.zhaopin.com/c/i/sou?pageSize=90&cityId=530&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=python&kt=3&_v=0.12973194&x-zp-page-request-id=9bf58a63b73746ea9fd0cb8bd75560b9-1572848879239-667477&x-zp-client-id=0470c445-5e49-43bc-b918-0330e0ead9ee
第二页:
https://fe-api.zhaopin.com/c/i/sou?start=90&pageSize=90&cityId=530&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=python&kt=3&_v=0.12973194&x-zp-page-request-id=9bf58a63b73746ea9fd0cb8bd75560b9-1572848879239-667477&x-zp-client-id=0470c445-5e49-43bc-b918-0330e0ead9ee
第三页:
https://fe-api.zhaopin.com/c/i/sou?start=180&pageSize=90&cityId=530&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=python&kt=3&_v=0.12973194&x-zp-page-request-id=9bf58a63b73746ea9fd0cb8bd75560b9-1572848879239-667477&x-zp-client-id=0470c445-5e49-43bc-b918-0330e0ead9ee
我们通过不同页面的URL对比,可以看到变化的参数是:
start 、cityId 、kw
对应,一猜就知道
起始页,城市名,岗位关键词
这样,我们就可以拼接URL,发起正确的翻页请求了。
其次,选择一个请求的URL,截取一段响应请求的json数据:
比如:
{“number”: “CC208131613J00164800114”, “jobName”: “python工程师”, “city”: “北京-顺义区”, “company”: “中都物流有限公司”, “welfare”: [“包吃”, “七险一金”, “交通补助”, “绩效奖金”, “通讯补助”], “workingExp”: “3-5年”, “salary”: “15K-20K”, “eduLevel”: “本科”}
(图片是后补的,但不影响字段分析)
可以从返回的字段中,选出我们需要的数据字典:
-
number 编号
-
jobName 岗位名称
-
city 城市地区
-
company 公司名称
-
workingExp 工作经验
-
salary 薪资范围
-
eduLevel 学历
好了,通过上述的分析,我们就知道了请求的URL格式,需要的参数,以及要提取的字段名称了。
3.撸码环节
下面我们通过Python爬虫来爬取上面的信息;
相关的解释统统放到代码中。
首先是要传入我们定义的参数:
地区、岗位名、页数
import requests
from urllib.parse import urlencode # 解决编码问题
import json
import pymysql
if __name__=='__main__':
cityName = str(input('请输入查找的地区:'))
keyWord = str(input('请输入查找的职位关键字:'))
needPage = int(input('请输入要爬取的页数(页/90条):'))
# 控制爬取的页数
for i in range(needPage):
main(offset=90*i) # 分析url知首页是90开始的,翻页是其倍数。
def main(offset):
json_page = get_page(offset,cityName,keyWord) # 发送请求,获得json数据
contentList = get_information(json_page) # 提取json数据对应的字段内容
for content in contentList: # 循环持久化
write_to_file(content)
#save_data_sql(content) # 在数据库新建表以后在打开这个
然后开始循环,发送页面请求:
# 起始页,城市名,岗位词
def get_page(offset,cityName,keyWord):
# 有反爬,添加一下header
headers = {
'User - Agent': 'Mozilla / 5.0(Windows NT 6.1;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 73.0.3683.103Safari / 537.36'
}
# 构建参数组
params = {
'start': offset,
'pageSize': '90',
'cityId': cityName,
'salary': '0,0',
'workExperience': '-1',
'education': '-1',
'companyType': '-1',
'employmentType': '-1',
'jobWelfareTag': '-1',
'kw': keyWord,
'kt': '3',
'_v': '0.12973194',
'x-zp-page-request-id': '9bf58a63b73746ea9fd0cb8bd75560b9-1572848879239-667477',
'x-zp-client-id': '0470c445-5e49-43bc-b918-0330e0ead9ee'
}
base_url = 'https://fe-api.zhaopin.com/c/i/sou?'
url = base_url + urlencode(params) # 拼接url,要进行编码。
print('爬取的URL为:',url)
try:
resp = requests.get(url,headers=headers,timeout=5)
print(resp.text)
if 200 == resp.status_code: # 状态码判断
print(resp.json())
return resp.json()
except requests.ConnectionError:
print('请求出错')
return None
获得json数据,然后开始提取我们要的字段信息:
def get_information(json_page):
if json_page.get('data'):
results = json_page.get('data').get('results')
print(results)
for result in results:
yield { #yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。
'number':result.get('number'), # 编号
'jobName': result.get('jobName'), #岗位名称
'city': result.get('city').get('display'), # 城市地区
'company': result.get('company').get('name'), # 公司名字
# 'welfare':result.get('welfare'), #福利信息
'workingExp':result.get('workingExp').get('name'), # 工作经验
'salary':result.get('salary'), #薪资范围
'eduLevel':result.get('eduLevel').get('name')#学历
}
print('success!')
提取完毕以后呢,就要循环持久化保存了:
# 本地备份爬取的数据
def write_to_file(content):
#print('dict:',type(content))
with open('result.txt','a',encoding='utf-8') as f:
#print(type(json.dumps(content)))
f.write(json.dumps(content,ensure_ascii=False)+'\n') #将字典或列表转为josn格式的字符串
好了,完毕,运行一下。
结果如图:
各种各样的招聘信息:
好了,本篇关于python3爬虫系列08之新版动态智联爬虫和存取数据库进行可视化分析的第一部分,爬取智联招聘的内容就到这里了,这样我们就把智联招聘上对应的岗位信息抓取下了,并且存到了一个txt文件中。
什么?要源码?
嘿嘿~~~别急啊,咱们python3爬虫系列08之新版动态智联爬虫和存取数据库进行可视化分析,总有三个部分,接下来一篇是把爬取的数据保存到MySQL数据库中去,读取出来操作等等。。。