session = HTMLSession()
class TXSpider(object):
def __init__(self):
起始的请求地址
self.start_url = ‘https://careers.tencent.com/tencentcareer/api/post/Query’
起始的翻页页码
self.start_page = 1
翻页条件
self.is_running = True
准备工作地点大列表
self.addr_list = []
准备岗位种类大列表
self.category_list = []
def parse_start_url(self):
“”"
解析起始的url地址
:return:
“”"
条件循环模拟翻页
while self.is_running:
构造请求参数
params = {
捕捉当前时间戳
‘timestamp’: str(int(time.time() * 1000)),
‘countryId’: ‘’,
‘cityId’: ‘’,
‘bgIds’: ‘’,
‘productId’: ‘’,
‘categoryId’: ‘’,
‘parentCategoryId’: ‘’,
‘attrId’: ‘’,
‘keyword’: ‘’,
‘pageIndex’: str(self.start_page),
‘pageSize’: ‘10’,
‘language’: ‘zh-cn’,
‘area’: ‘cn’
}
headers = {
‘user-agent’: random.choice(USER_AGENT_LIST)
}
response = session.get(url=self.start_url, headers=headers, params=params).json()
“”“调用解析响应方法”“”
self.parse_response_json(response)
“”“翻页递增”“”
self.start_page += 1
“”“翻页终止条件”“”
if self.start_page == 20:
self.is_running = False
“”“翻页完成,开始生成分析图”“”
self.crate_img_four_func()
def crate_img_four_func(self):
“”"
生成四张图方法
:return:
“”"
统计数量
data = {} # 大字典
addr_dict = {} # 工作地址字典
cate_dict = {} # 工作属性字典
for k_addr, v_cate in zip(self.addr_list, self.category_list):
if k_addr in data:
大字典统计工作地址数据
data[k_addr] = data[k_addr] + 1
地址字典统计数据
addr_dict[k_addr] = addr_dict[k_addr] + 1
else:
data[k_addr] = 1
addr_dict[k_addr] = 1
if v_cate in data:
大字典统计工作属性数据
data[v_cate] = data[v_cate] + 1
工作属性字典统计数据
cate_dict[v_cate] = data[v_cate] + 1
else:
data[v_cate] = 1
cate_dict[v_cate] = 1
第一张图:根据岗位地址和岗位属性二者数量生成折线图
146,147两行代码解决图中中文显示问题
plt.rcParams[‘font.sans-serif’] = [‘SimHei’]
plt.rcParams[‘axes.unicode_minus’] = False
由于二者数据数量不统一,在此进行切片操作
x_axis_data = [i for i in addr_dict.values()][:5]
y_axis_data = [i for i in cate_dict.values()][:5]
print(x_axis_data, y_axis_data)
plot中参数的含义分别是横轴值,纵轴值,线的形状,颜色,透明度,线的宽度和标签
plt.plot(y_axis_data, x_axis_data, ‘ro-’, color=‘#4169E1’, alpha=0.8, linewidth=1, label=‘数量’)
显示标签,如果不加这句,即使在plot中加了label='一些数字’的参数,最终还是不会显示标签
plt.legend(loc=“upper right”)
plt.xlabel(‘地点数量’)
plt.ylabel(‘工作属性数量’)
plt.savefig(‘根据岗位地址和岗位属性二者数量生成折线图.png’)
plt.show()
第二张图:根据岗位地址数量生成饼图
“”“工作地址饼图”“”
addr_dict_key = [k for k in addr_dict.keys()]
addr_dict_value = [v for v in addr_dict.values()]
plt.rcParams[‘font.sans-serif’] = [‘Microsoft YaHei’]
plt.rcParams[‘axes.unicode_minus’] = False
plt.pie(addr_dict_value, labels=addr_dict_key, autopct=‘%1.1f%%’)
plt.title(f’岗位地址和岗位属性百分比分布’)
plt.savefig(f’岗位地址和岗位属性百分比分布-饼图’)
plt.show()
第三张图:根据岗位地址和岗位属性二者数量生成散点图
这两行代码解决 plt 中文显示的问题
plt.rcParams[‘font.sans-serif’] = [‘SimHei’]
plt.rcParams[‘axes.unicode_minus’] = False
输入岗位地址和岗位属性数据
production = [i for i in data.keys()]
tem = [i for i in data.values()]
colors = np.random.rand(len(tem)) # 颜色数组
plt.scatter(tem, production, s=200, c=colors) # 画散点图,大小为 200
plt.xlabel(‘数量’) # 横坐标轴标题
plt.ylabel(‘名称’) # 纵坐标轴标题
plt.savefig(f’岗位地址和岗位属性散点图’)
plt.show()
第四张图:根据岗位地址和岗位属性二者数量生成柱状图
import matplotlib;matplotlib.use(‘TkAgg’)
plt.rcParams[‘font.sans-serif’] = [‘SimHei’]
plt.rcParams[‘axes.unicode_minus’] = False
zhfont1 = matplotlib.font_manager.FontProperties(fname=‘C:\Windows\Fonts\simsun.ttc’)
name_list = [name for name in data.keys()]
num_list = [value for value in data.values()]
width = 0.5 # 柱子的宽度
index = np.arange(len(name_list))
plt.bar(index, num_list, width, color=‘steelblue’, tick_label=name_list, label=‘岗位数量’)
plt.legend([‘分解能耗’, ‘真实能耗’], prop=zhfont1, labelspacing=1)
for a, b in zip(index, num_list): # 柱子上的数字显示
plt.text(a, b, ‘%.2f’ % b, ha=‘center’, va=‘bottom’, fontsize=7)
plt.xticks(rotation=270)
plt.title(‘岗位数量和岗位属性数量柱状图’)
plt.ylabel(‘次’)
plt.legend()
plt.savefig(f’岗位数量和岗位属性数量柱状图-柱状图’, bbox_inches=‘tight’)
plt.show()
def parse_response_json(self, response):
“”"
解析响应
:param response:
:return:
“”"
获取岗位信息大列表
json_data = response[‘Data’][‘Posts’]
判断结果是否有数据
if json_data is None:
没有数据,设置循环条件为False
self.is_running = False
反之,开始提取数据
else:
循环遍历,取出列表中的每一个岗位字典
通过key取value值的方法进行采集数据
for data in json_data:
工作地点
LocationName = data[‘LocationName’]
往地址大列表中添加数据
self.addr_list.append(LocationName)
工作属性
CategoryName = data[‘CategoryName’]
往工作属性大列表中添加数据
self.category_list.append(CategoryName)
岗位名称
RecruitPostName = data[‘RecruitPostName’]
岗位职责
Responsibility = data[‘Responsibility’]
发布时间
LastUpdateTime = data[‘LastUpdateTime’]
岗位地址
PostURL = data[‘PostURL’]
构造保存excel所需要的格式字典
data_dict = {
该字典的key值与创建工作簿的sheet表的名称所关联
‘岗位详情’: [RecruitPostName, LocationName, CategoryName, Responsibility, LastUpdateTime, PostURL]
}
“”“调用保存excel表格方法,数据字典作为参数”“”
self.save_excel(data_dict)
提示输出
print(f"第{self.start_page}页–岗位{RecruitPostName}----采集完成----logging!!!")
def save_excel(self, data_dict):
“”"
保存excel
:param data_dict: 数据字典
:return:
“”"
判断保存到当我文件目录的路径是否存在
os_path_1 = os.getcwd() + ‘/数据/’
if not os.path.exists(os_path_1):
不存在,即创建这个目录,即创建”数据“这个文件夹
os.mkdir(os_path_1)
判断将数据保存到表格的这个表格是否存在,不存在,创建表格,写入表头
os_path = os_path_1 + ‘腾讯招聘数据.xls’
if not os.path.exists(os_path):
创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding=‘utf-8’)
创建新的sheet表
worksheet1 = workbook.add_sheet(“岗位详情”, cell_overwrite_ok=True)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
)
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-n2aPhz8n-1712553877790)]