• 爬取的时候很在乎异步爬取、多进程操作等,后来再发现自己路都不会走,还想跑。打好基础!!!
  • 第一步观察网页,在XHR中发现数据,其https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1626350822054&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex=2&pageSize=10&language=zh-cn&area=
  • timestamp=1626350822054int(time.time() * 1000),pageIndex代表页数

遇到的问题:

     1.只输出10个数据,其原因是,页数定义在主函数,会报list index out of range,原因在于

    for i in range(0, MAX_PAGE * 10): # 每次主函数调用时,函数只有10的范围
        data = datalist[i]
        for j in range(0, len(col)):
            sheet.write(i+1, j, data[j])

   多学习大佬框架。

         解决办法:

        1. 在保存函数时增加一个变量,使得保存范围变化

        2. 数据保存为字典类型,从而解决问题,需要学习 

       3.函数解析时,列表保存全部数据。

def parse_response_json(response):
    datalist = []
    for page in range(1, MAX_PAGE + 1):
        response = scrapy_api(page)
        """解析响应"""
        json_data = response['Data']['Posts']

        # 判断结果是否有数据
        if json_data is None:
            logging.error('error data')
        else:
            # 循环遍历,取出列表中的每一个岗位字典
            # 通过key取value值的方法进行采集数据
            for j in json_data:
                data = []
                # 工作地点
                locationname = j['LocationName']
                data.append(locationname)
                # 工作属性
                categoryname = j['CategoryName']
                # 往工作属性大列表中添加数据
                data.append(categoryname)
                # 岗位名称
                recruitpostName = j['RecruitPostName']
                data.append(recruitpostName)
                # # 岗位职责
                responsibility = j['Responsibility']
                data.append(responsibility.strip())
                # 发布时间
                lastupdatetime = j['LastUpdateTime']
                data.append(lastupdatetime)
                # 岗位地址
                postURL = j['PostURL']
                data.append(postURL)
                datalist.append(data)
    logging.info('detail data successfully')
    # print(datalist)
    return datalist

 

保存到exel

  

def save_excel(datalist):
    """保存到excel"""
    # os模块提供很多方法,比如打开文件关闭文件之类的方法
    # os.getcwd()返回当前工作目录,返回类型为字符串
    os_path_1 = os.getcwd() + '/数据/'  # 数据保存位置
    # os.path.exists模块,    如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False
    if not os.path.exists(os_path_1):
        # 不存在,即创建这个目录,即创建”数据“这个文件夹
        # 如果目录有多级,则创建最后一级,如果最后一级目录的上级目录有不存在的,则会抛出一个 OSError。
        os.mkdir(os_path_1)
    os_path_2 = os_path_1 + '腾讯招聘.xls'
    if not os.path.exists(os_path_2):
        # 如果不存在,创建新的表格
        # 创建新的workbook(其实就是创建新的excel)
        workbook = xlwt.Workbook(encoding='utf-8')
        # 创建新的sheet表
        #  add_sheet(sheetname,cell_overwrite_ok) sheetname 列表名,cell_overwrite_ok 是否可以复写
        sheet = workbook.add_sheet("岗位详情", cell_overwrite_ok=True)
        col = ('岗位名称', '工作地点', '工作属性', '岗位职责', '发布时间', '岗位地址')
        for i in range(0, len(col)):
            sheet.write(0, i, col[i])  # 列名
        for i in range(0, MAX_PAGE * 10):
            data = datalist[i]
            for j in range(0, len(col)):
                sheet.write(i+1, j, data[j])
        workbook.save(os_path_2)  # save方法参数是路径,可通过函数调用在全局变量中使用
        logging.info('excel save successfully')

OS模块菜鸟教程有教程,创建一个文件夹,生成一个xls文件,还有比较简单的方法:不加条件判断。

def save_excel(datalist, savepath):
    # 如果不存在,创建新的表格
    # 创建新的workbook(其实就是创建新的excel)
    workbook = xlwt.Workbook(encoding='utf-8')
    # 创建新的sheet表
    #  add_sheet(sheetname,cell_overwrite_ok) sheetname 列表名,cell_overwrite_ok 是否可以复写
    sheet = workbook.add_sheet("岗位详情", cell_overwrite_ok=True)
    col = ('岗位名称', '工作地点', '工作属性', '岗位职责', '发布时间', '岗位地址')
    for i in range(0, len(col)):
        sheet.write(0, i, col[i])  # 列名
    for i in range(0, MAX_PAGE * 10): # 注意时双重列表,其形式位datalist['['url, name'],['url,name']']
        data = datalist[i]
        for j in range(0, len(col)): # 搜索其中的元素
            sheet.write(i+1, j, data[j]) # ['url, name']
    workbook.save(savepath)  # save方法参数是路径,可通过函数调用在全局变量中使用
    logging.info('excel save successfully')

 

使用Request_html模块中的HTMLSession会比较快一点,将request.get换成:

with session.get(url=INDEX_URL, headers=headers, params=params) as response: