• 售前

  • 售后

热门帖子
入门百科

Python实现爬取腾讯雇用网岗位信息

[复制链接]
工兵班长纬 显示全部楼层 发表于 2022-1-8 03:35:29 |阅读模式 打印 上一主题 下一主题
目录


  • 介绍
  • 效果展示
  • 实现思绪
  • 源码展示

介绍

开发环境
Windows 10
python3.6
开发工具
pycharm

numpy、matplotlib、time、xlutils.copy、os、xlwt, xlrd, random

效果展示

代码运行展示



实现思绪

1.打开腾讯雇用的网址右击检查举行抓包,进入网址的时候发现有异步渲染,我们要的数据为异步加载

2.构造起始所在:

start_url = ‘https://careers.tencent.com/tencentcareer/api/post/Query’
参数在headers的最下面
timestamp: 1625641250509
countryId:
cityId:
bgIds:
productId:
categoryId:
parentCategoryId:
attrId:
keyword:
pageIndex: 1
pageSize: 10
language: zh-cn
area: cn
3.发送请求,获取响应
  1. self.start_url = 'https://careers.tencent.com/tencentcareer/api/post/Query'
  2. # 构造请求参数
  3.             params = {
  4.                 # 捕捉当前时间戳
  5.                 'timestamp': str(int(time.time() * 1000)),
  6.                 'countryId': '',
  7.                 'cityId': '',
  8.                 'bgIds': '',
  9.                 'productId': '',
  10.                 'categoryId': '',
  11.                 'parentCategoryId': '',
  12.                 'attrId': '',
  13.                 'keyword': '',
  14.                 'pageIndex': str(self.start_page),
  15.                 'pageSize': '10',
  16.                 'language': 'zh-cn',
  17.                 'area': 'cn'
  18.             }
  19.             headers = {
  20.                 'user-agent': random.choice(USER_AGENT_LIST)
  21.             }
  22.             response = session.get(url=self.start_url, headers=headers, params=params).json()
复制代码
4.提取数据,获取岗位信息大列表,提取相应的数据
  1. # 获取岗位信息大列表
  2.         json_data = response['Data']['Posts']
  3.         # 判断结果是否有数据
  4.         if json_data is None:
  5.             # 没有数据,设置循环条件为False
  6.             self.is_running = False
  7.         # 反之,开始提取数据
  8.         else:
  9.             # 循环遍历,取出列表中的每一个岗位字典
  10.             # 通过key取value值的方法进行采集数据
  11.             for data in json_data:
  12.                 # 工作地点
  13.                 LocationName = data['LocationName']
  14.                 # 往地址大列表中添加数据
  15.                 self.addr_list.append(LocationName)
  16.                 # 工作属性
  17.                 CategoryName = data['CategoryName']
  18.                 # 往工作属性大列表中添加数据
  19.                 self.category_list.append(CategoryName)
  20.                 # 岗位名称
  21.                 RecruitPostName = data['RecruitPostName']
  22.                 # 岗位职责
  23.                 Responsibility = data['Responsibility']
  24.                 # 发布时间
  25.                 LastUpdateTime = data['LastUpdateTime']
  26.                 # 岗位地址
  27.                 PostURL = data['PostURL']
复制代码
5.数据天生折线图、饼图、散点图、柱状图
  1. # 第一张图:根据岗位地址和岗位属性二者数量生成折线图
  2.         # 146,147两行代码解决图中中文显示问题
  3. plt.rcParams['font.sans-serif'] = ['SimHei']
  4.         plt.rcParams['axes.unicode_minus'] = False
  5.         # 由于二者数据数量不统一,在此进行切片操作
  6.         x_axis_data = [i for i in addr_dict.values()][:5]
  7.         y_axis_data = [i for i in cate_dict.values()][:5]
  8.         # print(x_axis_data, y_axis_data)
  9.         # plot中参数的含义分别是横轴值,纵轴值,线的形状,颜色,透明度,线的宽度和标签
  10.         plt.plot(y_axis_data, x_axis_data, 'ro-', color='#4169E1', alpha=0.8, linewidth=1, label='数量')
  11.         # 显示标签,如果不加这句,即使在plot中加了label='一些数字'的参数,最终还是不会显示标签
  12.         plt.legend(loc="upper right")
  13.         plt.xlabel('地点数量')
  14.         plt.ylabel('工作属性数量')
  15.         plt.savefig('根据岗位地址和岗位属性二者数量生成折线图.png')
  16.         plt.show()
复制代码
  1. # 第二张图:根据岗位地址数量生成饼图
  2.         """工作地址饼图"""
  3.         addr_dict_key = [k for k in addr_dict.keys()]
  4.         addr_dict_value = [v for v in addr_dict.values()]
  5.         plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
  6.         plt.rcParams['axes.unicode_minus'] = False
  7.         plt.pie(addr_dict_value, labels=addr_dict_key, autopct='%1.1f%%')
  8.         plt.title(f'岗位地址和岗位属性百分比分布')
  9.         plt.savefig(f'岗位地址和岗位属性百分比分布-饼图')
  10.         plt.show()
复制代码
  1. # 第三张图:根据岗位地址和岗位属性二者数量生成散点图
  2.         # 这两行代码解决 plt 中文显示的问题
  3.         plt.rcParams['font.sans-serif'] = ['SimHei']
  4.         plt.rcParams['axes.unicode_minus'] = False
  5.         # 输入岗位地址和岗位属性数据
  6.         production = [i for i in data.keys()]
  7.         tem = [i for i in data.values()]
  8.         colors = np.random.rand(len(tem))  # 颜色数组
  9.         plt.scatter(tem, production, s=200, c=colors)  # 画散点图,大小为 200
  10.         plt.xlabel('数量')  # 横坐标轴标题
  11.         plt.ylabel('名称')  # 纵坐标轴标题
  12.         plt.savefig(f'岗位地址和岗位属性散点图')
  13.         plt.show()
复制代码
  1. # 第四张图:根据岗位地址和岗位属性二者数量生成柱状图
  2.         import matplotlib;matplotlib.use('TkAgg')
  3.         plt.rcParams['font.sans-serif'] = ['SimHei']
  4.         plt.rcParams['axes.unicode_minus'] = False
  5.         zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
  6.         name_list = [name for name in data.keys()]
  7.         num_list = [value for value in data.values()]
  8.         width = 0.5  # 柱子的宽度
  9.         index = np.arange(len(name_list))
  10.         plt.bar(index, num_list, width, color='steelblue', tick_label=name_list, label='岗位数量')
  11.         plt.legend(['分解能耗', '真实能耗'], prop=zhfont1, labelspacing=1)
  12.         for a, b in zip(index, num_list):  # 柱子上的数字显示
  13.             plt.text(a, b, '%.2f' % b, ha='center', va='bottom', fontsize=7)
  14.         plt.xticks(rotation=270)
  15.         plt.title('岗位数量和岗位属性数量柱状图')
  16.         plt.ylabel('次')
  17.         plt.legend()
  18.         plt.savefig(f'岗位数量和岗位属性数量柱状图-柱状图', bbox_inches='tight')
  19.         plt.show()
复制代码


源码展示
  1. """ua大列表"""USER_AGENT_LIST = [                  'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0',                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36',                  'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36',                  'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2',                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174',                  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61',                  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1',                  'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36',                  'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)',                  'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',                  'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3451.0 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:57.0) Gecko/20100101 Firefox/57.0',                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.2999.0 Safari/537.36',                  'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36',                  'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2',                  'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174',                  'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.1.4322; MS-RTC LM 8; InfoPath.2; Tablet PC 2.0)',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 OPR/55.0.2994.61',                  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.814.0 Safari/535.1',                  'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/418.9.1 (KHTML, like Gecko) Safari/419.3',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36',                  'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; Touch; MASMJS)',                  'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1041.0 Safari/535.21',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',                  'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4093.3 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko; compatible; Swurl) Chrome/77.0.3865.120 Safari/537.36',                  'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',                  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4086.0 Safari/537.36',                  'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:75.0) Gecko/20100101 Firefox/75.0',                  'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/91.0.146 Chrome/85.0.4183.146 Safari/537.36',                  'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 VivoBrowser/8.4.72.0 Chrome/62.0.3202.84',                  'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0',                  'Mozilla/5.0 (X11; CrOS x86_64 13505.63.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:68.0) Gecko/20100101 Firefox/68.0',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',                  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',                  'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400',                  'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',                  ]from requests_html import HTMLSessionimport os, xlwt, xlrd, randomfrom xlutils.copy import copyimport numpy as npfrom matplotlib import pyplot as pltfrom matplotlib.font_manager import FontProperties  # 字体库import timesession = 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()        # 第二张图:根据岗位地址数量生成饼图
  2.         """工作地址饼图"""
  3.         addr_dict_key = [k for k in addr_dict.keys()]
  4.         addr_dict_value = [v for v in addr_dict.values()]
  5.         plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
  6.         plt.rcParams['axes.unicode_minus'] = False
  7.         plt.pie(addr_dict_value, labels=addr_dict_key, autopct='%1.1f%%')
  8.         plt.title(f'岗位地址和岗位属性百分比分布')
  9.         plt.savefig(f'岗位地址和岗位属性百分比分布-饼图')
  10.         plt.show()        # 第三张图:根据岗位地址和岗位属性二者数量生成散点图
  11.         # 这两行代码解决 plt 中文显示的问题
  12.         plt.rcParams['font.sans-serif'] = ['SimHei']
  13.         plt.rcParams['axes.unicode_minus'] = False
  14.         # 输入岗位地址和岗位属性数据
  15.         production = [i for i in data.keys()]
  16.         tem = [i for i in data.values()]
  17.         colors = np.random.rand(len(tem))  # 颜色数组
  18.         plt.scatter(tem, production, s=200, c=colors)  # 画散点图,大小为 200
  19.         plt.xlabel('数量')  # 横坐标轴标题
  20.         plt.ylabel('名称')  # 纵坐标轴标题
  21.         plt.savefig(f'岗位地址和岗位属性散点图')
  22.         plt.show()        # 第四张图:根据岗位地址和岗位属性二者数量生成柱状图
  23.         import matplotlib;matplotlib.use('TkAgg')
  24.         plt.rcParams['font.sans-serif'] = ['SimHei']
  25.         plt.rcParams['axes.unicode_minus'] = False
  26.         zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
  27.         name_list = [name for name in data.keys()]
  28.         num_list = [value for value in data.values()]
  29.         width = 0.5  # 柱子的宽度
  30.         index = np.arange(len(name_list))
  31.         plt.bar(index, num_list, width, color='steelblue', tick_label=name_list, label='岗位数量')
  32.         plt.legend(['分解能耗', '真实能耗'], prop=zhfont1, labelspacing=1)
  33.         for a, b in zip(index, num_list):  # 柱子上的数字显示
  34.             plt.text(a, b, '%.2f' % b, ha='center', va='bottom', fontsize=7)
  35.         plt.xticks(rotation=270)
  36.         plt.title('岗位数量和岗位属性数量柱状图')
  37.         plt.ylabel('次')
  38.         plt.legend()
  39.         plt.savefig(f'岗位数量和岗位属性数量柱状图-柱状图', bbox_inches='tight')
  40.         plt.show()    def parse_response_json(self, response):        """        解析响应        :param response:        :return:        """        # 获取岗位信息大列表
  41.         json_data = response['Data']['Posts']
  42.         # 判断结果是否有数据
  43.         if json_data is None:
  44.             # 没有数据,设置循环条件为False
  45.             self.is_running = False
  46.         # 反之,开始提取数据
  47.         else:
  48.             # 循环遍历,取出列表中的每一个岗位字典
  49.             # 通过key取value值的方法进行采集数据
  50.             for data in json_data:
  51.                 # 工作地点
  52.                 LocationName = data['LocationName']
  53.                 # 往地址大列表中添加数据
  54.                 self.addr_list.append(LocationName)
  55.                 # 工作属性
  56.                 CategoryName = data['CategoryName']
  57.                 # 往工作属性大列表中添加数据
  58.                 self.category_list.append(CategoryName)
  59.                 # 岗位名称
  60.                 RecruitPostName = data['RecruitPostName']
  61.                 # 岗位职责
  62.                 Responsibility = data['Responsibility']
  63.                 # 发布时间
  64.                 LastUpdateTime = data['LastUpdateTime']
  65.                 # 岗位地址
  66.                 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)            excel_data_1 = ('岗位名称', '工作所在', '工作属性', '岗位职责', '发布时间', '岗位所在')            for i in range(0, len(excel_data_1)):                worksheet1.col(i).width = 2560 * 3                #               行,列,  内容,            样式                worksheet1.write(0, i, excel_data_1[i])            workbook.save(os_path)        # 判断工作表是否存在        # 存在,开始往表格中添加数据(写入数据)        if os.path.exists(os_path):            # 打开工作薄            workbook = xlrd.open_workbook(os_path)            # 获取工作薄中所有表的个数            sheets = workbook.sheet_names()            for i in range(len(sheets)):                for name in data_dict.keys():                    worksheet = workbook.sheet_by_name(sheets[i])                    # 获取工作薄中所有表中的表名与数据名对比                    if worksheet.name == name:                        # 获取表中已存在的行数                        rows_old = worksheet.nrows                        # 将xlrd对象拷贝转化为xlwt对象                        new_workbook = copy(workbook)                        # 获取转化后的工作薄中的第i张表                        new_worksheet = new_workbook.get_sheet(i)                        for num in range(0, len(data_dict[name])):                            new_worksheet.write(rows_old, num, data_dict[name][num])                        new_workbook.save(os_path)    def run(self):        """        启动运行        :return:        """        self.parse_start_url()if __name__ == '__main__':    # 创建该类的对象    t = TXSpider()    # 通过实例方法,举行调用    t.run()
复制代码
以上就是Python实现爬取腾讯雇用网岗位信息的详细内容,更多关于Python爬取雇用网岗位信息的资料请关注脚本之家别的干系文章!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作