hello呀,各位小伙伴,今天是五月的第二天,不知道大家是在家里wifi,空调,西瓜呢,还是在拥挤的景区看着人山人海!反正小编是穿着大裤衩,坐在马路边的沙滩上, 啜一口摆在身边的饮料,享受极了。
天实在太热了,前几天小编还裹着大棉袄,现在就穿上了短袖和大裤衩。燥热的天也给学习增加了一些情绪,让人难免有一丝浮躁,不管怎么样,我始终相信今天是人生中美好的一天。
看着在网上找的python教学视频,虽然两年前的资料还算比较新,但是最让人难受的莫过于技术更新迭代的代码不兼容问题,还有就是当初的爬取目标有所改版,这些问题 瞬间就有了让人想要放弃的心情。但是“千举万变,其道一也”,只要摸清门路,想必也不是什么难事的。
今天给大家分享的是利用python爬取腾讯招聘的代码,两年前的资料使用的是bs4选择器来进行爬取的,但是随着网站的更新改版只能请求接口来获取数据,反而降低了爬取的难度。过程如下:
首先输入:https://careers.tencent.com/,按F12审查元素,在搜索框里输入想要爬取的职位如:python,同时查看网络请求地址的变化。
双击该链接,在网址栏提取请求地址到编辑器做相应的数据分析。这里因网址太长不做张贴,仅以图片展示。
在链接中我们可以看到我们只需要对keywords,pageIndex,这两个主要参数进行处理就可以请求到我们想要的数据了,接下来让我们进入到代码编辑环节:
import requests
from bs4 import BeautifulSoup
import json
import time
import math
class Tencent(object):
def __init__(self,keyWords):
self.base_url = "https://careers.tencent.com/tencentcareer/api/post/Query?"
#职位要求的请求地址
self.detail_url = "https://careers.tencent.com/tencentcareer/api/post/ByPostId?"
#设置请求头
self.headers= {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
self.item_list = []
self.kw = keyWords
self.pageSize = 10
self.timestamp = math.ceil(time.time() * 1000)
#发送请求
def send_request(self,url,params={}):
#time.sleep(2)
response = requests.get(url,params=params,headers=self.headers)
return response.content.decode("utf-8")
#分析数据
def analysis_data(self,data):
#转化成py字典
arr = json.loads(data)['Data']['Posts']
#print(arr)
for i in arr:
dict = {}
print(i['PostId'])
dict['job_name'] = i['RecruitPostName']
dict['work_city'] = i['CountryName']+i['LocationName']
dict['Responsibility'] = i['Responsibility']
dict['LastUpdateTime'] = i['LastUpdateTime']
Requirement = self.sec_request(i['PostId'])
dict['Requirement'] = Requirement
self.item_list.append(dict)
#写入数据
def write_file(self, data):
# 将列表转换成 字符串str
data_str = json.dumps(self.item_list)
with open(self.kw+"job.json", "w") as f:
f.write(data_str)
#请求职位的详细要求
def sec_request(self,PostId):
#print(self.detail_url+PostId)
params = {
"timestamp": self.timestamp,
"postId": PostId,
}
job_detail = self.send_request(self.detail_url,params)
#print(json.loads(job_detail)['Data']['Requirement'])
return json.loads(job_detail)['Data']['Requirement']
#soup = BeautifulSoup(job_detail, "lxml")
#data_list = soup.select(".explain-item")
#print(data_list)
#调度方法
def start_work(self):
# timestamp=1588227498120
# &countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=
# &keyword=python&pageIndex=1&pageSize=10&language=zh-cn&area=cn
#print(timestamp)
#第一次请求看看返回多少数据
params = {
"pageSize":self.pageSize,
"keyword": self.kw,
"timestamp":self.timestamp,
"pageIndex":1,
}
arg = self.send_request(self.base_url, params)
# 将 JSON 对象转换为 Python 字典
#print(json.loads(arg)['Data']['Count'])
#print("--"*30)
#print(json.loads(arg)['Data']['Count']/self.pageSize)
TotalPage = math.ceil(json.loads(arg)['Data']['Count']/self.pageSize)
#print("--" * 30)
#print(TotalPage) TotalPage+1
for page in range(1,TotalPage):
params = {
"pageSize": self.pageSize,
"keyword": self.kw,
"timestamp": self.timestamp,
"pageIndex": page,
}
data_tmp = self.send_request(self.base_url, params)
#print(json.loads(data_tmp))
lastData = self.analysis_data(data_tmp)
self.write_file(lastData)
if __name__ == "__main__":
keyWords = input("请输入搜索的职位(如python):")
spider = Tencent(keyWords)
spider.start_work()
右击执行,输入你想要搜索的职位,程序执行成功后当前文件夹下就会生成一个职位对应的json文件,具体操作过程如图:
以上就是爬取招聘数据的代码,里面的代码有推导的过程,可能会显得有些臃肿,但是对于思路提供还是有一个参照的作用吧,觉得注释代码过于冗余的人可以把注释的内容删除就显得精简多了。