python3爬虫系列08之新版动态智联爬取和存取数据库进行可视化分析
本篇是面向新版动态智联爬虫,数据存储到Mysql数据库,最后使用pyecharts读取并可视化分析。
在这之前,上一篇说的是
python3爬虫系列07之动态网页Json 数据,爬虫要怎么搞?
里面的实战是使用requests+json爬虫:根据输入词爬取豆瓣热门影片。
以及对json的分析和对文件的操作工具类:
json对象或json数组操作以及读写各类txt,csv,html,xls文件的工具类
1.前言
最近我查了一些现在的很多博客,慕课,腾讯课堂留下的关于爬取智联招聘岗位的代码,大部分都是老历史的,这个第一代版本的爬虫已经失效。
近期智联招聘的网站风格变化较快,这对于想爬取数据的人来说有些难受。
因此,在前人基础上,我重构了针对智联招聘网站的最新结构进行数据抓取的代码。
废话不多说,开始。
2.网页分析
(图是后配的,多少有些出入,但是不影响。)
进入智联招聘官网,在搜索界面输入‘java工程师’,(或者python,或者其他xxxx),然后界面跳转,
/?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-/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-/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-/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 requestsfrom urllib.parse import urlencode # 解决编码问题import jsonimport pymysqlif __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):# 有反爬,添加一下headerheaders = {'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-/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数据库中去,读取出来操作等等。。。